diff --git a/.changeset/chatty-days-wonder.md b/.changeset/chatty-days-wonder.md new file mode 100644 index 0000000000..5e5114c28e --- /dev/null +++ b/.changeset/chatty-days-wonder.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-auth-backend-module-bitbucket-provider': patch +--- + +Enabled persistency of scopes for Bitbucket Cloud. diff --git a/.changeset/chilly-sheep-scream.md b/.changeset/chilly-sheep-scream.md new file mode 100644 index 0000000000..eb568ffd8f --- /dev/null +++ b/.changeset/chilly-sheep-scream.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog': minor +--- + +Added support of filtering based on system columns in catalog table diff --git a/.changeset/clear-pigs-share.md b/.changeset/clear-pigs-share.md new file mode 100644 index 0000000000..a8241760c8 --- /dev/null +++ b/.changeset/clear-pigs-share.md @@ -0,0 +1,9 @@ +--- +'@backstage/plugin-catalog-backend-module-github': minor +--- + +**BREAKING**: Explicitly rejects branch names containing a slash character. + +The module now rejects any configuration that contains slashes in branch names. The reason for this is that the ingestion will run into downstream problems if they were let through. If you had configuration with a slash in the branch name in `filters.branch`, your application may fail to start up. + +If you are affected by this, please move over to using branches that do not have slashes in them. diff --git a/.changeset/common-parrots-wink.md b/.changeset/common-parrots-wink.md new file mode 100644 index 0000000000..7e3578771b --- /dev/null +++ b/.changeset/common-parrots-wink.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs-react': patch +--- + +Fix catalog entity docs page not loading due to multiple addons data attachment in the New Frontend System. diff --git a/.changeset/crazy-hands-film.md b/.changeset/crazy-hands-film.md new file mode 100644 index 0000000000..1d5933b317 --- /dev/null +++ b/.changeset/crazy-hands-film.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-gitlab': patch +--- + +Updated the path field in the `gitlab:group:ensureExists` action to support also strings with multiple segments (e.g. `group/subgroup`) diff --git a/.changeset/create-app-1742907012.md b/.changeset/create-app-1742907012.md new file mode 100644 index 0000000000..b50d431d4b --- /dev/null +++ b/.changeset/create-app-1742907012.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Bumped create-app version. diff --git a/.changeset/create-app-1743513781.md b/.changeset/create-app-1743513781.md new file mode 100644 index 0000000000..b50d431d4b --- /dev/null +++ b/.changeset/create-app-1743513781.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Bumped create-app version. diff --git a/.changeset/deep-flies-vanish.md b/.changeset/deep-flies-vanish.md new file mode 100644 index 0000000000..30aa10f290 --- /dev/null +++ b/.changeset/deep-flies-vanish.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-unprocessed-entities': patch +--- + +Added confirmation popup for delete entities in Catalog Unprocessed Entities plugin diff --git a/.changeset/dry-cars-build.md b/.changeset/dry-cars-build.md new file mode 100644 index 0000000000..60fd3ece49 --- /dev/null +++ b/.changeset/dry-cars-build.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes': patch +--- + +Added New Frontend System filter for the Kubernetes tab to use `isKubernetesAvailable` to control its visibility diff --git a/.changeset/early-feet-lay.md b/.changeset/early-feet-lay.md new file mode 100644 index 0000000000..71a557e5e5 --- /dev/null +++ b/.changeset/early-feet-lay.md @@ -0,0 +1,17 @@ +--- +'@backstage/plugin-auth-backend-module-oidc-provider': patch +--- + +Added custom timeout setting for oidc provider + +Here is an example of how to use a custom timeout with the configuration: + +```yaml +auth: + oidc: + production: + clientId: ${AUTH_GOOGLE_CLIENT_ID} + clientSecret: ${AUTH_GOOGLE_CLIENT_SECRET} + timeout: + seconds: 30 +``` diff --git a/.changeset/famous-dragons-bake.md b/.changeset/famous-dragons-bake.md new file mode 100644 index 0000000000..17b156de06 --- /dev/null +++ b/.changeset/famous-dragons-bake.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-gitlab': patch +--- + +add filter for repos by membership and topics diff --git a/.changeset/famous-eggs-dance.md b/.changeset/famous-eggs-dance.md new file mode 100644 index 0000000000..8293746402 --- /dev/null +++ b/.changeset/famous-eggs-dance.md @@ -0,0 +1,5 @@ +--- +'@backstage/canon': patch +--- + +Internal refactor and fixes to the prop extraction logic for layout components. diff --git a/.changeset/funny-lizards-clean.md b/.changeset/funny-lizards-clean.md new file mode 100644 index 0000000000..7c85e28188 --- /dev/null +++ b/.changeset/funny-lizards-clean.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Fixed the messaging in the `AlertDisplay` where it was claiming that there were older messages available rather than newer. diff --git a/.changeset/huge-toys-beam.md b/.changeset/huge-toys-beam.md new file mode 100644 index 0000000000..e36cdcc7f0 --- /dev/null +++ b/.changeset/huge-toys-beam.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-import': patch +--- + +Expose the `UnpackNestedValue` type as it's been removed from `react-hook-form` diff --git a/.changeset/lemon-shoes-enter.md b/.changeset/lemon-shoes-enter.md new file mode 100644 index 0000000000..a950989d93 --- /dev/null +++ b/.changeset/lemon-shoes-enter.md @@ -0,0 +1,5 @@ +--- +'@backstage/canon': patch +--- + +Add global CSS reset for anchor tags. diff --git a/.changeset/light-cameras-fold.md b/.changeset/light-cameras-fold.md new file mode 100644 index 0000000000..8ec49c5d02 --- /dev/null +++ b/.changeset/light-cameras-fold.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-notifications-backend-module-slack': minor +--- + +Added a new Slack NotificationProcessor for use with the notifications plugin diff --git a/.changeset/moody-eagles-smile.md b/.changeset/moody-eagles-smile.md new file mode 100644 index 0000000000..3fd8a748ab --- /dev/null +++ b/.changeset/moody-eagles-smile.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-import': patch +--- + +adding translation for `Register an existing component` text diff --git a/.changeset/nine-falcons-repeat.md b/.changeset/nine-falcons-repeat.md new file mode 100644 index 0000000000..a67e925343 --- /dev/null +++ b/.changeset/nine-falcons-repeat.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-catalog-backend-module-bitbucket-server': minor +'@backstage/plugin-events-backend-module-bitbucket-server': minor +--- + +Added the ability for the plugin to receive events coming from Bitbucket Server push webhooks. It then performs a delta mutation on the catalog. diff --git a/.changeset/pre.json b/.changeset/pre.json index a36f400a24..b443ec4505 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -194,7 +194,61 @@ "@backstage/plugin-techdocs-react": "1.2.15", "@backstage/plugin-user-settings": "0.8.20", "@backstage/plugin-user-settings-backend": "0.3.0", - "@backstage/plugin-user-settings-common": "0.0.1" + "@backstage/plugin-user-settings-common": "0.0.1", + "@backstage/plugin-events-backend-module-bitbucket-server": "0.0.0", + "@backstage/plugin-notifications-backend-module-slack": "0.0.0" }, - "changesets": [] + "changesets": [ + "chatty-days-wonder", + "chilly-sheep-scream", + "clear-pigs-share", + "clever-tomatoes-jump", + "common-parrots-wink", + "crazy-hands-film", + "create-app-1742907012", + "create-app-1743513781", + "cuddly-dodos-allow", + "cuddly-kids-sell", + "cuddly-mirrors-ask", + "deep-flies-vanish", + "dry-cars-build", + "early-feet-lay", + "every-ties-wink", + "famous-dragons-bake", + "famous-eggs-dance", + "funny-hotels-cut", + "funny-lizards-clean", + "giant-donkeys-punch", + "honest-ties-worry", + "huge-toys-beam", + "itchy-times-behave", + "large-kings-protect", + "lemon-shoes-enter", + "light-cameras-fold", + "metal-animals-notice", + "moody-eagles-smile", + "nine-falcons-repeat", + "odd-bobcats-hang", + "orange-queens-grin", + "quick-carrots-open", + "rotten-bobcats-notice", + "sad-pots-try", + "serious-guests-tan", + "silver-rocks-invite", + "spotty-towns-show", + "stale-tables-stick", + "strange-planes-kneel", + "sweet-maps-invent", + "swift-boats-add", + "tame-sloths-brake", + "tame-worms-do", + "thin-snails-judge", + "tiny-swans-warn", + "twenty-forks-cheat", + "twenty-walls-join", + "unlucky-carrots-shave", + "wet-penguins-beg", + "wide-planets-camp", + "witty-planets-sing" + ] } diff --git a/.changeset/quick-carrots-open.md b/.changeset/quick-carrots-open.md new file mode 100644 index 0000000000..7cde586e64 --- /dev/null +++ b/.changeset/quick-carrots-open.md @@ -0,0 +1,5 @@ +--- +'@backstage/canon': patch +--- + +Fix types on the Icon component. diff --git a/.changeset/rotten-bobcats-notice.md b/.changeset/rotten-bobcats-notice.md new file mode 100644 index 0000000000..0f6d1c74f9 --- /dev/null +++ b/.changeset/rotten-bobcats-notice.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-notifications-backend': patch +--- + +Allow throttling notification sending not to block the system with huge amount of receiving users diff --git a/.changeset/serious-guests-tan.md b/.changeset/serious-guests-tan.md new file mode 100644 index 0000000000..c051dca464 --- /dev/null +++ b/.changeset/serious-guests-tan.md @@ -0,0 +1,5 @@ +--- +'@backstage/integration-react': patch +--- + +Added scope `project` for Bitbucket Cloud. diff --git a/.changeset/stale-tables-stick.md b/.changeset/stale-tables-stick.md new file mode 100644 index 0000000000..bea1c3361b --- /dev/null +++ b/.changeset/stale-tables-stick.md @@ -0,0 +1,5 @@ +--- +'@backstage/integration': patch +--- + +Mark GitHub `webhookSecret` config property as optional. A `webhookSecret` is not required when creating a GitHub App. diff --git a/.changeset/strange-planes-kneel.md b/.changeset/strange-planes-kneel.md new file mode 100644 index 0000000000..8e57057aee --- /dev/null +++ b/.changeset/strange-planes-kneel.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-scaffolder-react': minor +'@backstage/plugin-scaffolder': minor +--- + +add api to retrieve template extensions info from scaffolder-backend diff --git a/.changeset/sweet-maps-invent.md b/.changeset/sweet-maps-invent.md new file mode 100644 index 0000000000..390ce57dc7 --- /dev/null +++ b/.changeset/sweet-maps-invent.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-unprocessed-entities': patch +--- + +Fixed the `convertTimeToLocalTimezone` function in the FailedEntities component to correctly parse ISO 8601 date strings and set the timezone to the current local timezone. diff --git a/.changeset/tame-worms-do.md b/.changeset/tame-worms-do.md new file mode 100644 index 0000000000..21872b9106 --- /dev/null +++ b/.changeset/tame-worms-do.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch +--- + +Fixed bug in event-based discovery that caused unnecessary API calls to Bitbucket Cloud diff --git a/.changeset/unlucky-carrots-shave.md b/.changeset/unlucky-carrots-shave.md new file mode 100644 index 0000000000..e0b4c0128b --- /dev/null +++ b/.changeset/unlucky-carrots-shave.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs-module-addons-contrib': patch +--- + +Fixed rendering issues in `ReportIssue` addon for unsupported repository types and improved shadow DOM event handling. The addon now properly prevents initialization when encountering unsupported repository types and correctly handles selection events within the shadow DOM. diff --git a/.changeset/wide-planets-camp.md b/.changeset/wide-planets-camp.md new file mode 100644 index 0000000000..c36ed69dff --- /dev/null +++ b/.changeset/wide-planets-camp.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch +--- + +fixed misleading example location annotations in docs diff --git a/.github/workflows/api-breaking-changes-comment.yml b/.github/workflows/api-breaking-changes-comment.yml index 91c0a43447..af625f67ab 100644 --- a/.github/workflows/api-breaking-changes-comment.yml +++ b/.github/workflows/api-breaking-changes-comment.yml @@ -74,7 +74,7 @@ jobs: - name: Cache Comment if: ${{ steps.event.outputs.ACTION != 'closed' }} - uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4.2.2 + uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 with: path: comment.md key: ${{ steps.hash.outputs.COMMENT_FILE_HASH }} @@ -103,7 +103,7 @@ jobs: - name: Fetch cached Manifests File id: cache - uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4 + uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4 with: path: comment.md key: ${{ needs.setup.outputs.comment-cache-key }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d1b5df56ef..76898bc8d2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -239,7 +239,7 @@ jobs: # Use the lower-level cache actions for the success cache, so that we can store the cache even on failed builds - name: restore backstage-cli cache - uses: actions/cache/restore@d4323d4df104b026a6aa633fdb11d772146be0bf # v4 + uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4 with: path: .cache/backstage-cli key: ${{ runner.os }}-v${{ matrix.node-version }}-backstage-cli-${{ github.run_id }} @@ -260,7 +260,7 @@ jobs: # Always save success cache even if there were failures, that way it can be used in re-triggered builds - name: save backstage-cli cache - uses: actions/cache/save@d4323d4df104b026a6aa633fdb11d772146be0bf # v4 + uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4 if: always() with: path: .cache/backstage-cli diff --git a/.github/workflows/deploy_microsite.yml b/.github/workflows/deploy_microsite.yml index a700b21d5e..28444cecfc 100644 --- a/.github/workflows/deploy_microsite.yml +++ b/.github/workflows/deploy_microsite.yml @@ -92,7 +92,7 @@ jobs: uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: stable-openapi-docs - path: docs/**/*.api.mdx + path: docs/**/api/**/* if-no-files-found: error retention-days: 1 @@ -165,7 +165,7 @@ jobs: uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: next-openapi-docs - path: docs/**/*.api.mdx + path: docs/**/api/**/* if-no-files-found: error retention-days: 1 @@ -220,7 +220,7 @@ jobs: uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4 with: name: stable-openapi-docs - path: docs/**/*.api.mdx + path: docs - name: grab lastest releases docs run: | @@ -235,7 +235,7 @@ jobs: run: rm -r docs/reference - name: clear OpenAPI reference - run: find . -name '*.api.mdx' -type f -delete + run: find ./docs -name '*.api.mdx' -type f -delete # Next docs - name: checkout master @@ -257,7 +257,7 @@ jobs: uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4 with: name: next-openapi-docs - path: docs/**/*.api.mdx + path: docs - name: build microsite run: yarn build diff --git a/.github/workflows/deploy_packages.yml b/.github/workflows/deploy_packages.yml index 0387de0d97..e363fa4680 100644 --- a/.github/workflows/deploy_packages.yml +++ b/.github/workflows/deploy_packages.yml @@ -94,7 +94,7 @@ jobs: run: yarn backstage-cli config:check --lax - name: backstage-cli cache - uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4 + uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4 with: path: .cache/backstage-cli key: ${{ runner.os }}-v${{ matrix.node-version }}-backstage-cli-${{ github.run_id }} diff --git a/.github/workflows/verify_microsite.yml b/.github/workflows/verify_microsite.yml index c46ba57e97..88c1bbc299 100644 --- a/.github/workflows/verify_microsite.yml +++ b/.github/workflows/verify_microsite.yml @@ -13,14 +13,178 @@ permissions: contents: read jobs: + stable: + runs-on: ubuntu-latest + concurrency: + group: stable-reference-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + + env: + CI: true + NODE_OPTIONS: --max-old-space-size=8192 + + outputs: + release: ${{ steps.find-release.outputs.result }} + + steps: + - name: Harden Runner + uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + with: + egress-policy: audit + + - name: find latest release + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7 + id: find-release + with: + script: | + const { data } = await github.rest.repos.listTags({ + owner: context.repo.owner, + repo: context.repo.repo, + per_page: 100, + }) + + const [{tag}] = data + .map(i => i.name) + .filter(tag => tag.match(/^v\d+\.\d+\.\d+$/)) + .map(tag => ({ + tag, + val: tag + .slice(1) + .split('.') + .reduce((val, part) => Number(val) * 1000 + Number(part)) + })) + .sort((a, b) => b.val - a.val) + + return tag + result-encoding: string + + - name: checkout latest release + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: refs/tags/${{ steps.find-release.outputs.result }} + + - name: Use Node.js 20.x + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 + with: + node-version: 20.x + registry-url: https://registry.npmjs.org/ # Needed for auth + + - name: yarn install + uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 + with: + cache-prefix: ${{ runner.os }}-v20.x + + - name: build API reference + run: yarn build:api-docs + + - name: upload API reference + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: stable-reference + path: docs/reference/ + if-no-files-found: error + retention-days: 1 + + - name: microsite yarn install + run: yarn install --immutable + working-directory: microsite + + - name: build OpenAPI API docs + working-directory: microsite + run: yarn docusaurus gen-api-docs all + + - name: upload OpenAPI API docs + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: stable-openapi-docs + path: docs/**/api/**/* + if-no-files-found: error + retention-days: 1 + next: + runs-on: ubuntu-latest + concurrency: + group: next-reference-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + env: + CI: true + NODE_OPTIONS: --max-old-space-size=8192 + + steps: + - name: Harden Runner + uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + with: + egress-policy: audit + + - name: checkout master + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Use Node.js 20.x + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 + with: + node-version: 20.x + registry-url: https://registry.npmjs.org/ # Needed for auth + + - name: yarn install + uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 + with: + cache-prefix: ${{ runner.os }}-v20.x + + - name: build API reference + run: yarn build:api-docs + + - name: upload API reference + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: next-reference + path: docs/reference/ + if-no-files-found: error + retention-days: 1 + + # Also build and upload storybook + - name: storybook yarn install + run: yarn install --immutable + working-directory: storybook + + - name: storybook build + run: yarn build-storybook + working-directory: storybook + + - name: storybook upload + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: storybook + path: storybook/dist/ + if-no-files-found: error + retention-days: 1 + + - name: microsite yarn install + run: yarn install --immutable + working-directory: microsite + + - name: build OpenAPI API docs + working-directory: microsite + run: yarn docusaurus gen-api-docs all + + - name: upload OpenAPI API docs + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: next-openapi-docs + path: docs/**/api/**/* + if-no-files-found: error + retention-days: 1 + build-microsite: runs-on: ubuntu-latest env: CI: true - NODE_OPTIONS: --max-old-space-size=8192 + NODE_OPTIONS: --max-old-space-size=16384 DOCUSAURUS_SSR_CONCURRENCY: 5 + needs: + - stable + - next + name: Microsite steps: - name: Harden Runner @@ -50,19 +214,63 @@ jobs: run: yarn install --immutable working-directory: microsite - - name: build API reference - run: yarn build:api-docs - - - name: Build MkDocs for TechDocs - run: mkdocs build --strict - - - name: verify yarn dependency duplicates - run: node scripts/verify-lockfile-duplicates.js - - name: prettier run: yarn prettier:check working-directory: microsite + - name: verify yarn dependency duplicates + run: node scripts/verify-lockfile-duplicates.js + + - name: download stable reference + uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4 + with: + name: stable-reference + path: docs/reference + + - name: download stable OpenAPI API docs + uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4 + with: + name: stable-openapi-docs + path: docs + + - name: grab lastest releases docs + run: | + git fetch origin master --depth 1 + git checkout FETCH_HEAD -- docs/releases + + - name: generate stable docs + run: yarn docusaurus docs:version stable + working-directory: microsite + + - name: clear API reference + run: rm -r docs/reference + + - name: clear OpenAPI reference + run: find ./docs -name '*.api.mdx' -type f -delete + + - name: build API reference + run: yarn build:api-docs + + - name: checkout master + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + clean: false + + - name: Build MkDocs for TechDocs + run: mkdocs build --strict + + - name: download next reference + uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4 + with: + name: next-reference + path: docs/reference + + - name: download next OpenAPI API docs + uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4 + with: + name: next-openapi-docs + path: docs + - name: build microsite run: yarn build working-directory: microsite diff --git a/canon-docs/package.json b/canon-docs/package.json index 8558fac8e3..acd20cb66a 100644 --- a/canon-docs/package.json +++ b/canon-docs/package.json @@ -14,16 +14,16 @@ "@mdx-js/loader": "^3.1.0", "@mdx-js/react": "^3.1.0", "@next/mdx": "^15.1.4", - "@storybook/react": "^8.4.7", + "@storybook/react": "^8.6.8", "@uiw/codemirror-themes": "^4.23.7", "@uiw/react-codemirror": "^4.23.7", "motion": "^12.4.1", - "next": "14.2.23", + "next": "14.2.25", "react": "^18.0.2", "react-dom": "^18.0.2", "react-frame-component": "^5.2.7", "shiki": "^1.26.1", - "storybook": "^8.4.7" + "storybook": "^8.6.8" }, "devDependencies": { "@types/mdx": "^2.0.13", diff --git a/canon-docs/src/app/(docs)/components/box/page.mdx b/canon-docs/src/app/(docs)/components/box/page.mdx index c1413dbe19..25ce3b6cd8 100644 --- a/canon-docs/src/app/(docs)/components/box/page.mdx +++ b/canon-docs/src/app/(docs)/components/box/page.mdx @@ -2,7 +2,7 @@ import { CodeBlock } from '@/components/CodeBlock'; import { PropsTable } from '@/components/PropsTable'; import { Tabs } from '@/components/Tabs'; import { Snippet } from '@/components/Snippet'; -import { BoxPreview } from '@/snippets/box'; +import { BoxSnippet } from '@/snippets/stories-snippets'; import { boxPropDefs } from './props'; import { spacingPropDefs } from '../../../../utils/propDefs'; @@ -12,7 +12,7 @@ Box is the lowest-level component in Canon. It provides a consistent API for sty } + preview={} code={` `} diff --git a/canon-docs/src/app/(docs)/components/button/page.mdx b/canon-docs/src/app/(docs)/components/button/page.mdx index a92a6675d1..e1ecee8920 100644 --- a/canon-docs/src/app/(docs)/components/button/page.mdx +++ b/canon-docs/src/app/(docs)/components/button/page.mdx @@ -2,15 +2,8 @@ import { PropsTable } from '@/components/PropsTable'; import { Snippet } from '@/components/Snippet'; import { Tabs } from '@/components/Tabs'; import { CodeBlock } from '@/components/CodeBlock'; -import { - ButtonPreview, - ButtonSizes, - ButtonWithIcons, - ButtonFullWidth, - ButtonDisabled, - ButtonResponsive, -} from '@/snippets/button'; -import { buttonVariants } from '@/snippets/_snippets'; +import { ButtonSnippet } from '@/snippets/stories-snippets'; +import { buttonVariants } from '@/snippets/code-snippets'; import { buttonPropDefs } from './props'; # Button @@ -20,7 +13,7 @@ A button component that can be used to trigger actions. } + preview={} code={` @@ -98,7 +91,7 @@ Here's a view when buttons have icons. align="center" py={4} open - preview={} + preview={} code={` @@ -114,7 +107,7 @@ Here's a view when buttons are full width. align="center" py={4} open - preview={} + preview={} code={` `} @@ -128,7 +121,7 @@ Here's a view when buttons are disabled. align="center" py={4} open - preview={} + preview={} code={``} /> @@ -136,11 +129,7 @@ Here's a view when buttons are disabled. Here's a view when buttons are responsive. -} + Responsive Button `} diff --git a/canon-docs/src/app/(docs)/components/checkbox/page.mdx b/canon-docs/src/app/(docs)/components/checkbox/page.mdx index fd2ec42e1b..413636dc9a 100644 --- a/canon-docs/src/app/(docs)/components/checkbox/page.mdx +++ b/canon-docs/src/app/(docs)/components/checkbox/page.mdx @@ -1,5 +1,5 @@ import { PropsTable } from '@/components/PropsTable'; -import { CheckboxPreview, CheckboxAllVariants } from '@/snippets/checkbox'; +import { CheckboxSnippet } from '@/snippets/stories-snippets'; import { Snippet } from '@/components/Snippet'; import { Tabs } from '@/components/Tabs'; import { CodeBlock } from '@/components/CodeBlock'; @@ -11,8 +11,9 @@ import { checkboxPropDefs } from './props'; A checkbox component that can be used to trigger actions. } + preview={} code={``} /> @@ -55,7 +56,7 @@ Here's a view when checkboxes have different variants. align="center" py={4} open - preview={} + preview={} code={` diff --git a/canon-docs/src/app/(docs)/components/container/page.mdx b/canon-docs/src/app/(docs)/components/container/page.mdx index 0dbe0223e5..40f0321624 100644 --- a/canon-docs/src/app/(docs)/components/container/page.mdx +++ b/canon-docs/src/app/(docs)/components/container/page.mdx @@ -2,7 +2,7 @@ import { CodeBlock } from '@/components/CodeBlock'; import { PropsTable } from '@/components/PropsTable'; import { Tabs } from '@/components/Tabs'; import { Snippet } from '@/components/Snippet'; -import { ContainerPreview } from '@/snippets/container'; +import { ContainerSnippet } from '@/snippets/stories-snippets'; import { containerPropDefs } from './props'; # Container @@ -12,7 +12,7 @@ content on the page. } + preview={} code={` `} diff --git a/canon-docs/src/app/(docs)/components/field/page.mdx b/canon-docs/src/app/(docs)/components/field/page.mdx index 54c091faeb..1526ce8c9f 100644 --- a/canon-docs/src/app/(docs)/components/field/page.mdx +++ b/canon-docs/src/app/(docs)/components/field/page.mdx @@ -2,7 +2,7 @@ import { PropsTable } from '@/components/PropsTable'; import { Snippet } from '@/components/Snippet'; import { Tabs } from '@/components/Tabs'; import { CodeBlock } from '@/components/CodeBlock'; -import { FieldPreview } from '@/snippets/field'; +import { FieldSnippet } from '@/snippets/stories-snippets'; import { BaseUI } from '@/components/HeadlessBanners/BaseUI'; import { fieldRootPropDefs, @@ -15,7 +15,12 @@ import { A wrapper around `Input` or `Select` component to add label, description and error messages.. -} code={``} /> +} + code={``} +/> @@ -85,7 +90,7 @@ Here's a simple input with a label and description. align="center" py={4} open - preview={} + preview={} code={` Name Visible on your profile diff --git a/canon-docs/src/app/(docs)/components/flex/page.mdx b/canon-docs/src/app/(docs)/components/flex/page.mdx index 0e1a6a1fb8..8150f3e3c5 100644 --- a/canon-docs/src/app/(docs)/components/flex/page.mdx +++ b/canon-docs/src/app/(docs)/components/flex/page.mdx @@ -6,9 +6,9 @@ import { flexSimple, flexResponsive, flexAlign, -} from '@/snippets/_snippets'; +} from '@/snippets/code-snippets'; import { Snippet } from '@/components/Snippet'; -import { FlexPreview } from '@/snippets/flex'; +import { FlexSnippet } from '@/snippets/stories-snippets'; import { flexPropDefs } from './props'; import { spacingPropDefs } from '../../../../utils/propDefs'; @@ -21,7 +21,7 @@ columns. All values are responsive. } + preview={} code={` diff --git a/canon-docs/src/app/(docs)/components/grid/page.mdx b/canon-docs/src/app/(docs)/components/grid/page.mdx index c57493b114..c8604076eb 100644 --- a/canon-docs/src/app/(docs)/components/grid/page.mdx +++ b/canon-docs/src/app/(docs)/components/grid/page.mdx @@ -1,9 +1,9 @@ import { CodeBlock } from '@/components/CodeBlock'; import { PropsTable } from '@/components/PropsTable'; import { Tabs } from '@/components/Tabs'; -import { grid } from '@/snippets/_snippets'; +import { grid } from '@/snippets/code-snippets'; import { Snippet } from '@/components/Snippet'; -import { GridPreview } from '@/snippets/grid'; +import { GridSnippet } from '@/snippets/stories-snippets'; import { spacingPropDefs } from '../../../../utils/propDefs'; import { gridPropDefs, gridItemPropDefs } from './props'; @@ -14,7 +14,7 @@ more complex ones. } + preview={} code={` diff --git a/canon-docs/src/app/(docs)/components/heading/page.mdx b/canon-docs/src/app/(docs)/components/heading/page.mdx index ad8131cdbd..10fd60bef1 100644 --- a/canon-docs/src/app/(docs)/components/heading/page.mdx +++ b/canon-docs/src/app/(docs)/components/heading/page.mdx @@ -1,9 +1,5 @@ import { PropsTable } from '@/components/PropsTable'; -import { - HeadingPreview, - HeadingAllVariants, - HeadingResponsive, -} from '@/snippets/heading'; +import { HeadingSnippet } from '@/snippets/stories-snippets'; import { Snippet } from '@/components/Snippet'; import { Tabs } from '@/components/Tabs'; import { CodeBlock } from '@/components/CodeBlock'; @@ -15,7 +11,7 @@ Headings are used to structure the content of your page. } + preview={} code={`Hello World!`} /> @@ -56,7 +52,7 @@ appearance of the heading. } + preview={} code={` Display Title 1 @@ -71,10 +67,7 @@ appearance of the heading. You can also use the `variant` prop to change the appearance of the text based on the screen size. -} + Responsive heading `} diff --git a/canon-docs/src/app/(docs)/components/icon-button/page.mdx b/canon-docs/src/app/(docs)/components/icon-button/page.mdx index 28b6eefbf2..60530ec9ea 100644 --- a/canon-docs/src/app/(docs)/components/icon-button/page.mdx +++ b/canon-docs/src/app/(docs)/components/icon-button/page.mdx @@ -2,13 +2,8 @@ import { PropsTable } from '@/components/PropsTable'; import { Snippet } from '@/components/Snippet'; import { Tabs } from '@/components/Tabs'; import { CodeBlock } from '@/components/CodeBlock'; -import { - IconButtonPreview, - IconButtonSizes, - IconButtonDisabled, - IconButtonResponsive, -} from '@/snippets/icon-button'; -import { iconButtonVariants } from '@/snippets/_snippets'; +import { IconButtonSnippet } from '@/snippets/stories-snippets'; +import { iconButtonVariants } from '@/snippets/code-snippets'; import { iconButtonPropDefs } from './props'; # Icon Button @@ -18,11 +13,11 @@ A button component with a single icon that can be used to trigger actions. } + preview={} code={` -`} + `} /> @@ -62,7 +57,7 @@ Here's a view when buttons have different variants. align="center" py={4} open - preview={} + preview={} code={iconButtonVariants} /> @@ -74,7 +69,7 @@ Here's a view when buttons have different sizes. align="center" py={4} open - preview={} + preview={} code={` @@ -89,7 +84,7 @@ Here's a view when buttons are disabled. align="center" py={4} open - preview={} + preview={} code={``} /> @@ -97,10 +92,6 @@ Here's a view when buttons are disabled. Here's a view when buttons are responsive. -} +`} /> diff --git a/canon-docs/src/app/(docs)/components/icon/page.mdx b/canon-docs/src/app/(docs)/components/icon/page.mdx index 3d8d065374..66be460d13 100644 --- a/canon-docs/src/app/(docs)/components/icon/page.mdx +++ b/canon-docs/src/app/(docs)/components/icon/page.mdx @@ -1,5 +1,5 @@ import { PropsTable } from '@/components/PropsTable'; -import { IconPreview } from '@/snippets/icon'; +import { IconSnippet } from '@/snippets/stories-snippets'; import { Snippet } from '@/components/Snippet'; import { Tabs } from '@/components/Tabs'; import { CodeBlock } from '@/components/CodeBlock'; @@ -12,7 +12,7 @@ Icons are used to represent an action or a state. } + preview={} code={``} /> diff --git a/canon-docs/src/app/(docs)/components/input/page.mdx b/canon-docs/src/app/(docs)/components/input/page.mdx index 228ef68061..0ecaaa5409 100644 --- a/canon-docs/src/app/(docs)/components/input/page.mdx +++ b/canon-docs/src/app/(docs)/components/input/page.mdx @@ -2,7 +2,7 @@ import { PropsTable } from '@/components/PropsTable'; import { Snippet } from '@/components/Snippet'; import { Tabs } from '@/components/Tabs'; import { CodeBlock } from '@/components/CodeBlock'; -import { InputPreview, InputSizes } from '@/snippets/input'; +import { InputSnippet } from '@/snippets/stories-snippets'; import { BaseUI } from '@/components/HeadlessBanners/BaseUI'; import { inputPropDefs } from './props'; @@ -13,7 +13,7 @@ A input component tfor your forms. } + preview={} code={``} /> @@ -55,7 +55,7 @@ Here's a simple input with a label and description. align="center" py={4} open - preview={} + preview={} code={` diff --git a/canon-docs/src/app/(docs)/components/text/page.mdx b/canon-docs/src/app/(docs)/components/text/page.mdx index 9b904f84c4..70d5de5504 100644 --- a/canon-docs/src/app/(docs)/components/text/page.mdx +++ b/canon-docs/src/app/(docs)/components/text/page.mdx @@ -1,10 +1,5 @@ import { PropsTable } from '@/components/PropsTable'; -import { - TextPreview, - TextAllVariants, - TextResponsive, - TextAllWeights, -} from '@/snippets/text'; +import { TextSnippet } from '@/snippets/stories-snippets'; import { Snippet } from '@/components/Snippet'; import { Tabs } from '@/components/Tabs'; import { CodeBlock } from '@/components/CodeBlock'; @@ -16,7 +11,7 @@ The `Text` component is used to display content on your page. } + preview={} code={` A man looks at a painting in a museum and says, “Brothers and sisters I have none, but that man's father is my father's son.” Who is in @@ -60,7 +55,7 @@ appearance of the text. } + preview={} code={` A man looks at a painting in a museum and says, “Brothers and sisters I @@ -92,7 +87,7 @@ appearance of the text. } + preview={} code={` A man looks at a painting in a museum and says, “Brothers and sisters I @@ -112,9 +107,7 @@ appearance of the text. You can also use the `variant` prop to change the appearance of the text based on the screen size. -} + Responsive text `} diff --git a/canon-docs/src/app/(docs)/theme/theming/page.mdx b/canon-docs/src/app/(docs)/theme/theming/page.mdx index cab9480a14..e3fc42da44 100644 --- a/canon-docs/src/app/(docs)/theme/theming/page.mdx +++ b/canon-docs/src/app/(docs)/theme/theming/page.mdx @@ -1,7 +1,7 @@ import { CodeBlock } from '@/components/CodeBlock'; import * as Table from '@/components/Table'; import { Chip } from '@/components/Chip'; -import { customTheme } from '@/snippets/_snippets'; +import { customTheme } from '@/snippets/code-snippets'; # Theming diff --git a/canon-docs/src/app/(docs)/theme/typography/page.mdx b/canon-docs/src/app/(docs)/theme/typography/page.mdx index 74b3144ef6..98a342bc91 100644 --- a/canon-docs/src/app/(docs)/theme/typography/page.mdx +++ b/canon-docs/src/app/(docs)/theme/typography/page.mdx @@ -1,5 +1,4 @@ -import { HeadingAllVariants } from '@/snippets/heading'; -import { TextAllVariants } from '@/snippets/text'; +import { HeadingSnippet, TextSnippet } from '@/snippets/stories-snippets'; import { Snippet } from '@/components/Snippet'; # Typography @@ -20,7 +19,7 @@ component](?path=/docs/components-heading--docs). } + preview={} code={` Display Title 1 @@ -40,7 +39,7 @@ page. } + preview={} code={` A man looks at a painting in a museum and says, “Brothers and sisters I diff --git a/canon-docs/src/app/(playground)/playground/page.tsx b/canon-docs/src/app/(playground)/playground/page.tsx index 354f07bb25..3f1675551e 100644 --- a/canon-docs/src/app/(playground)/playground/page.tsx +++ b/canon-docs/src/app/(playground)/playground/page.tsx @@ -5,10 +5,12 @@ import { Grid, Flex, Text } from '../../../../../packages/canon'; import { screenSizes } from '@/utils/data'; import { Frame } from '@/components/Frame'; import { usePlayground } from '@/utils/playground-context'; -import { ButtonPlayground } from '@/snippets/button'; -import { CheckboxPlayground } from '@/snippets/checkbox'; -import { HeadingPlayground } from '@/snippets/heading'; -import { TextPlayground } from '@/snippets/text'; +import { + ButtonSnippet, + CheckboxSnippet, + HeadingSnippet, + TextSnippet, +} from '@/snippets/stories-snippets'; import styles from './styles.module.css'; @@ -55,16 +57,19 @@ const Content = () => { return ( {selectedComponents.find(c => c === 'button') && ( - } title="Button" /> + } title="Button" /> )} {selectedComponents.find(c => c === 'checkbox') && ( - } title="Checkbox" /> + } + title="Checkbox" + /> )} {selectedComponents.find(c => c === 'heading') && ( - } title="Heading" /> + } title="Heading" /> )} {selectedComponents.find(c => c === 'text') && ( - } title="Text" /> + } title="Text" /> )} {/* {selectedComponents.find(c => c === 'input') && ( } title="Input" /> diff --git a/canon-docs/src/snippets/box.tsx b/canon-docs/src/snippets/box.tsx deleted file mode 100644 index 2a99ebee7d..0000000000 --- a/canon-docs/src/snippets/box.tsx +++ /dev/null @@ -1,20 +0,0 @@ -'use client'; - -import { Box } from '../../../packages/canon'; - -export const BoxPreview = () => { - return ( - - ); -}; diff --git a/canon-docs/src/snippets/button.tsx b/canon-docs/src/snippets/button.tsx deleted file mode 100644 index aa20b3e46a..0000000000 --- a/canon-docs/src/snippets/button.tsx +++ /dev/null @@ -1,102 +0,0 @@ -'use client'; - -import { Button, Flex, ButtonProps, Text } from '../../../packages/canon'; - -export const ButtonPreview = () => { - return ( - - - - - ); -}; - -export const ButtonSizes = () => { - return ( - - - - - ); -}; - -export const ButtonWithIcons = () => { - return ( - - - - - - ); -}; - -export const ButtonFullWidth = () => { - return ( - - - - - - ); -}; - -export const ButtonDisabled = () => { - return ; -}; - -export const ButtonResponsive = () => { - return ( - - ); -}; - -export const ButtonPlayground = () => { - const variants: string[] = ['primary', 'secondary', 'tertiary']; - - return ( - - {variants.map(variant => ( - - {variant} - {['small', 'medium'].map(size => ( - - - - - - ))} - - ))} - - ); -}; diff --git a/canon-docs/src/snippets/checkbox.tsx b/canon-docs/src/snippets/checkbox.tsx deleted file mode 100644 index fe2a5b0219..0000000000 --- a/canon-docs/src/snippets/checkbox.tsx +++ /dev/null @@ -1,32 +0,0 @@ -'use client'; - -import { Checkbox, Flex, Text } from '../../../packages/canon'; - -export const CheckboxPreview = () => { - return ; -}; - -export const CheckboxAllVariants = () => { - return ( - - - - - - - ); -}; - -export const CheckboxPlayground = () => { - return ( - - All variants - - - - - - - - ); -}; diff --git a/canon-docs/src/snippets/_snippets.ts b/canon-docs/src/snippets/code-snippets.ts similarity index 100% rename from canon-docs/src/snippets/_snippets.ts rename to canon-docs/src/snippets/code-snippets.ts diff --git a/canon-docs/src/snippets/container.tsx b/canon-docs/src/snippets/container.tsx deleted file mode 100644 index 27c0ba9922..0000000000 --- a/canon-docs/src/snippets/container.tsx +++ /dev/null @@ -1,24 +0,0 @@ -'use client'; - -import { Box, Container } from '../../../packages/canon'; - -const DecorativeBox = () => ( - -); - -export const ContainerPreview = () => { - return ( - - - - ); -}; diff --git a/canon-docs/src/snippets/field.tsx b/canon-docs/src/snippets/field.tsx deleted file mode 100644 index e801d85641..0000000000 --- a/canon-docs/src/snippets/field.tsx +++ /dev/null @@ -1,23 +0,0 @@ -'use client'; - -import { Input, Field } from '../../../packages/canon'; - -export const FieldPreview = () => { - return ( -
- - Name - - Visible on your profile - -
- ); -}; - -export const InputPlayground = () => { - return ( -
- -
- ); -}; diff --git a/canon-docs/src/snippets/flex.tsx b/canon-docs/src/snippets/flex.tsx deleted file mode 100644 index 8bfab8878e..0000000000 --- a/canon-docs/src/snippets/flex.tsx +++ /dev/null @@ -1,31 +0,0 @@ -'use client'; - -import { Flex } from '../../../packages/canon'; - -const DecorativeBox = () => { - return ( -
- ); -}; - -export const FlexPreview = () => { - return ( -
- - - - - -
- ); -}; diff --git a/canon-docs/src/snippets/grid.tsx b/canon-docs/src/snippets/grid.tsx deleted file mode 100644 index 87012b7630..0000000000 --- a/canon-docs/src/snippets/grid.tsx +++ /dev/null @@ -1,26 +0,0 @@ -'use client'; - -import { Box, Grid } from '../../../packages/canon'; - -const FakeBox = () => ( - -); - -export const GridPreview = () => { - return ( - - - - - - ); -}; diff --git a/canon-docs/src/snippets/heading.tsx b/canon-docs/src/snippets/heading.tsx deleted file mode 100644 index 484497e7a7..0000000000 --- a/canon-docs/src/snippets/heading.tsx +++ /dev/null @@ -1,42 +0,0 @@ -'use client'; - -import { Heading, Flex, Text } from '../../../packages/canon'; - -export const HeadingPreview = () => { - return Look mum, no hands!; -}; - -export const HeadingAllVariants = () => { - return ( - - Display - Title 1 - Title 2 - Title 3 - Title 4 - - ); -}; - -export const HeadingResponsive = () => { - return ( - - - Responsive heading - - - ); -}; - -export const HeadingPlayground = () => { - return ( - - All variants - Display - Title 1 - Title 2 - Title 3 - Title 4 - - ); -}; diff --git a/canon-docs/src/snippets/icon-button.tsx b/canon-docs/src/snippets/icon-button.tsx deleted file mode 100644 index 2079041456..0000000000 --- a/canon-docs/src/snippets/icon-button.tsx +++ /dev/null @@ -1,57 +0,0 @@ -'use client'; - -import { IconButton, Flex, ButtonProps, Text } from '../../../packages/canon'; - -export const IconButtonPreview = () => { - return ( - - - - - ); -}; - -export const IconButtonSizes = () => { - return ( - - - - - ); -}; - -export const IconButtonDisabled = () => { - return ; -}; - -export const IconButtonResponsive = () => { - return ( - - ); -}; - -export const IconButtonPlayground = () => { - const variants: string[] = ['primary', 'secondary']; - - return ( - - {variants.map(variant => ( - - {variant} - {['small', 'medium'].map(size => ( - - - - ))} - - ))} - - ); -}; diff --git a/canon-docs/src/snippets/icon.tsx b/canon-docs/src/snippets/icon.tsx deleted file mode 100644 index 126dbaf686..0000000000 --- a/canon-docs/src/snippets/icon.tsx +++ /dev/null @@ -1,7 +0,0 @@ -'use client'; - -import { Icon } from '../../../packages/canon'; - -export const IconPreview = () => { - return ; -}; diff --git a/canon-docs/src/snippets/inline.tsx b/canon-docs/src/snippets/inline.tsx deleted file mode 100644 index 43fd56c650..0000000000 --- a/canon-docs/src/snippets/inline.tsx +++ /dev/null @@ -1,47 +0,0 @@ -'use client'; - -import { Box, Flex } from '../../../packages/canon'; - -const fakeBlockList = [ - { width: 45, height: 60 }, - { width: 150, height: 75 }, - { width: 80, height: 50 }, - { width: 120, height: 70 }, - { width: 95, height: 65 }, - { width: 80, height: 32 }, - { width: 130, height: 60 }, - { width: 100, height: 80 }, - { width: 140, height: 45 }, - { width: 85, height: 70 }, - { width: 125, height: 50 }, -]; - -const FakeBox = ({ - width = 120, - height = 80, -}: { - width?: number; - height?: number; -}) => ( - -); - -export const InlinePreview = () => { - return ( - - {fakeBlockList.map((block, index) => ( - - ))} - - ); -}; diff --git a/canon-docs/src/snippets/input.tsx b/canon-docs/src/snippets/input.tsx deleted file mode 100644 index 69d0b62b7f..0000000000 --- a/canon-docs/src/snippets/input.tsx +++ /dev/null @@ -1,36 +0,0 @@ -'use client'; - -import { Input, Grid } from '../../../packages/canon'; - -export const InputPreview = () => { - return ( -
- -
- ); -}; - -export const InputSizes = () => { - return ( - - - - - ); -}; - -export const InputError = () => { - return ( -
- -
- ); -}; - -export const InputPlayground = () => { - return ( -
- -
- ); -}; diff --git a/canon-docs/src/snippets/stories-snippets.tsx b/canon-docs/src/snippets/stories-snippets.tsx new file mode 100644 index 0000000000..76137e9b82 --- /dev/null +++ b/canon-docs/src/snippets/stories-snippets.tsx @@ -0,0 +1,127 @@ +'use client'; + +import { composeStories } from '@storybook/react'; +import * as BoxStories from '../../../packages/canon/src/components/Box/Box.stories'; +import * as ButtonStories from '../../../packages/canon/src/components/Button/Button.stories'; +import * as CheckboxStories from '../../../packages/canon/src/components/Checkbox/Checkbox.stories'; +import * as ContainerStories from '../../../packages/canon/src/components/Container/Container.stories'; +import * as FieldStories from '../../../packages/canon/src/components/Field/Field.stories'; +import * as GridStories from '../../../packages/canon/src/components/Grid/Grid.stories'; +import * as HeadingStories from '../../../packages/canon/src/components/Heading/Heading.stories'; +import * as IconButtonStories from '../../../packages/canon/src/components/IconButton/IconButton.stories'; +import * as IconStories from '../../../packages/canon/src/components/Icon/Icon.stories'; +import * as InputStories from '../../../packages/canon/src/components/Input/Input.stories'; +import * as TextStories from '../../../packages/canon/src/components/Text/Text.stories'; +import * as FlexStories from '../../../packages/canon/src/components/Flex/Flex.stories'; + +export const BoxSnippet = ({ story }: { story: keyof typeof BoxStories }) => { + const stories = composeStories(BoxStories); + const StoryComponent = stories[story as keyof typeof stories]; + + return StoryComponent ? : null; +}; + +export const ButtonSnippet = ({ + story, +}: { + story: keyof typeof ButtonStories; +}) => { + const stories = composeStories(ButtonStories); + const StoryComponent = stories[story as keyof typeof stories]; + + return StoryComponent ? : null; +}; + +export const CheckboxSnippet = ({ + story, +}: { + story: keyof typeof CheckboxStories; +}) => { + const stories = composeStories(CheckboxStories); + const StoryComponent = stories[story as keyof typeof stories]; + + return StoryComponent ? : null; +}; + +export const ContainerSnippet = ({ + story, +}: { + story: keyof typeof ContainerStories; +}) => { + const stories = composeStories(ContainerStories); + const StoryComponent = stories[story as keyof typeof stories]; + + return StoryComponent ? : null; +}; + +export const FlexSnippet = ({ story }: { story: keyof typeof FlexStories }) => { + const stories = composeStories(FlexStories); + const StoryComponent = stories[story as keyof typeof stories]; + + return StoryComponent ? : null; +}; + +export const FieldSnippet = ({ + story, +}: { + story: keyof typeof FieldStories; +}) => { + const stories = composeStories(FieldStories); + const StoryComponent = stories[story as keyof typeof stories]; + + return StoryComponent ? : null; +}; + +export const GridSnippet = ({ story }: { story: keyof typeof GridStories }) => { + const stories = composeStories(GridStories); + const StoryComponent = stories[story as keyof typeof stories]; + + return StoryComponent ? : null; +}; + +export const HeadingSnippet = ({ + story, +}: { + story: keyof typeof HeadingStories; +}) => { + const stories = composeStories(HeadingStories); + const StoryComponent = stories[story as keyof typeof stories]; + + return StoryComponent ? : null; +}; + +export const IconButtonSnippet = ({ + story, +}: { + story: keyof typeof IconButtonStories; +}) => { + const stories = composeStories(IconButtonStories); + const StoryComponent = stories[story as keyof typeof stories]; + + return StoryComponent ? : null; +}; + +export const IconSnippet = ({ story }: { story: keyof typeof IconStories }) => { + const stories = composeStories(IconStories); + const StoryComponent = stories[story as keyof typeof stories]; + + return StoryComponent ? : null; +}; + +export const InputSnippet = ({ + story, +}: { + story: keyof typeof InputStories; +}) => { + const stories = composeStories(InputStories); + const StoryComponent = stories[story as keyof typeof stories]; + + return StoryComponent ? : null; +}; + +export const TextSnippet = ({ story }: { story: keyof typeof TextStories }) => { + const stories = composeStories(TextStories); + const StoryComponent = stories[story as keyof typeof stories]; + + return StoryComponent ? : null; +}; diff --git a/canon-docs/src/snippets/text.tsx b/canon-docs/src/snippets/text.tsx deleted file mode 100644 index 4d39cbf6dd..0000000000 --- a/canon-docs/src/snippets/text.tsx +++ /dev/null @@ -1,94 +0,0 @@ -'use client'; - -import { Flex, Text } from '../../../packages/canon'; - -export const TextPreview = () => { - return ( - - A man looks at a painting in a museum and says, “Brothers and sisters I - have none, but that man's father is my father's son.” Who is in - the painting? - - ); -}; - -export const TextAllVariants = () => { - return ( - - - A man looks at a painting in a museum and says, “Brothers and sisters I - have none, but that man's father is my father's son.” Who is - in the painting? - - - A man looks at a painting in a museum and says, “Brothers and sisters I - have none, but that man's father is my father's son.” Who is - in the painting? - - - A man looks at a painting in a museum and says, “Brothers and sisters I - have none, but that man's father is my father's son.” Who is - in the painting? - - - A man looks at a painting in a museum and says, “Brothers and sisters I - have none, but that man's father is my father's son.” Who is - in the painting? - - - ); -}; - -export const TextAllWeights = () => { - return ( - - - A man looks at a painting in a museum and says, “Brothers and sisters I - have none, but that man's father is my father's son.” Who is - in the painting? - - - A man looks at a painting in a museum and says, “Brothers and sisters I - have none, but that man's father is my father's son.” Who is - in the painting? - - - ); -}; - -export const TextResponsive = () => { - return ( - Responsive text - ); -}; - -export const TextPlayground = () => { - return ( - - Subtitle - - A man looks at a painting in a museum and says, “Brothers and sisters I - have none, but that man's father is my father's son.” Who is - in the painting? - - Body - - A man looks at a painting in a museum and says, “Brothers and sisters I - have none, but that man's father is my father's son.” Who is - in the painting? - - Caption - - A man looks at a painting in a museum and says, “Brothers and sisters I - have none, but that man's father is my father's son.” Who is - in the painting? - - Label - - A man looks at a painting in a museum and says, “Brothers and sisters I - have none, but that man's father is my father's son.” Who is - in the painting? - - - ); -}; diff --git a/canon-docs/yarn.lock b/canon-docs/yarn.lock index 2be457741c..8a0dd8d2f0 100644 --- a/canon-docs/yarn.lock +++ b/canon-docs/yarn.lock @@ -6,11 +6,11 @@ __metadata: cacheKey: 8 "@babel/runtime@npm:^7.18.6": - version: 7.26.0 - resolution: "@babel/runtime@npm:7.26.0" + version: 7.26.10 + resolution: "@babel/runtime@npm:7.26.10" dependencies: regenerator-runtime: ^0.14.0 - checksum: c8e2c0504ab271b3467a261a8f119bf2603eb857a0d71e37791f4e3fae00f681365073cc79f141ddaa90c6077c60ba56448004ad5429d07ac73532be9f7cf28a + checksum: 22d2e0abb86e90de489ab16bb578db6fe2b63a88696db431198b24963749820c723f1982298cdbbea187f7b2b80fb4d98a514faf114ddb2fdc14a4b96277b955 languageName: node linkType: hard @@ -501,10 +501,10 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:14.2.23": - version: 14.2.23 - resolution: "@next/env@npm:14.2.23" - checksum: dad74ff7de68992a0753f728a5b926ed6eb0af8a62deece6bbb32ba254b1f7d870e256b61db8d4c40fa811695cfc5e69ba964339f3cb8b40237cf9c28dfe747f +"@next/env@npm:14.2.25": + version: 14.2.25 + resolution: "@next/env@npm:14.2.25" + checksum: c937d4e8b62c7ae9c74bd607888e791b78445e93d523d22d0838e816c3fbeb7b1b62766d110ef235229e4c4ca8587f493e6ec761eb0a2c774dabaee2b58f581b languageName: node linkType: hard @@ -534,65 +534,65 @@ __metadata: languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:14.2.23": - version: 14.2.23 - resolution: "@next/swc-darwin-arm64@npm:14.2.23" +"@next/swc-darwin-arm64@npm:14.2.25": + version: 14.2.25 + resolution: "@next/swc-darwin-arm64@npm:14.2.25" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:14.2.23": - version: 14.2.23 - resolution: "@next/swc-darwin-x64@npm:14.2.23" +"@next/swc-darwin-x64@npm:14.2.25": + version: 14.2.25 + resolution: "@next/swc-darwin-x64@npm:14.2.25" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:14.2.23": - version: 14.2.23 - resolution: "@next/swc-linux-arm64-gnu@npm:14.2.23" +"@next/swc-linux-arm64-gnu@npm:14.2.25": + version: 14.2.25 + resolution: "@next/swc-linux-arm64-gnu@npm:14.2.25" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:14.2.23": - version: 14.2.23 - resolution: "@next/swc-linux-arm64-musl@npm:14.2.23" +"@next/swc-linux-arm64-musl@npm:14.2.25": + version: 14.2.25 + resolution: "@next/swc-linux-arm64-musl@npm:14.2.25" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:14.2.23": - version: 14.2.23 - resolution: "@next/swc-linux-x64-gnu@npm:14.2.23" +"@next/swc-linux-x64-gnu@npm:14.2.25": + version: 14.2.25 + resolution: "@next/swc-linux-x64-gnu@npm:14.2.25" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:14.2.23": - version: 14.2.23 - resolution: "@next/swc-linux-x64-musl@npm:14.2.23" +"@next/swc-linux-x64-musl@npm:14.2.25": + version: 14.2.25 + resolution: "@next/swc-linux-x64-musl@npm:14.2.25" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:14.2.23": - version: 14.2.23 - resolution: "@next/swc-win32-arm64-msvc@npm:14.2.23" +"@next/swc-win32-arm64-msvc@npm:14.2.25": + version: 14.2.25 + resolution: "@next/swc-win32-arm64-msvc@npm:14.2.25" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@next/swc-win32-ia32-msvc@npm:14.2.23": - version: 14.2.23 - resolution: "@next/swc-win32-ia32-msvc@npm:14.2.23" +"@next/swc-win32-ia32-msvc@npm:14.2.25": + version: 14.2.25 + resolution: "@next/swc-win32-ia32-msvc@npm:14.2.25" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:14.2.23": - version: 14.2.23 - resolution: "@next/swc-win32-x64-msvc@npm:14.2.23" +"@next/swc-win32-x64-msvc@npm:14.2.25": + version: 14.2.25 + resolution: "@next/swc-win32-x64-msvc@npm:14.2.25" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -722,20 +722,20 @@ __metadata: languageName: node linkType: hard -"@storybook/components@npm:8.6.7": - version: 8.6.7 - resolution: "@storybook/components@npm:8.6.7" +"@storybook/components@npm:8.6.8": + version: 8.6.8 + resolution: "@storybook/components@npm:8.6.8" peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - checksum: cb20f8baa76deef1af1739d6c1b1a9f57eb22d158fa046d9919a91840e7a00f1b48e96b7ffe7994365b60808f864c963a3476ee98b4c8b63968a3a877068da3a + checksum: fb69c6d7804f91fffd3fc7d42ba5b144c7b808af6e6b764c14cdef11263897e551e5cc8a0fa379b9ed73f5c0438ed32d355c7ed63801046e1cb078c479d4cecf languageName: node linkType: hard -"@storybook/core@npm:8.6.7": - version: 8.6.7 - resolution: "@storybook/core@npm:8.6.7" +"@storybook/core@npm:8.6.8": + version: 8.6.8 + resolution: "@storybook/core@npm:8.6.8" dependencies: - "@storybook/theming": 8.6.7 + "@storybook/theming": 8.6.8 better-opn: ^3.0.2 browser-assert: ^1.2.1 esbuild: ^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 @@ -751,7 +751,7 @@ __metadata: peerDependenciesMeta: prettier: optional: true - checksum: b150b7472766fccbbc1dec74cba3c16e009a9f24c13f01198923f553d12e2a2070ee2a35f5514f9af350b79e34577946ea65a4a495fd1fa18a27655f897c013a + checksum: d67dea27c021b51f17a0d5807b72a29ea174bb8c945fb41092fbf3698002810da0a510aa7e0e23e1682634362f9b52590ba1a09ef6dd40a2ad5653988b0b0e14 languageName: node linkType: hard @@ -762,66 +762,66 @@ __metadata: languageName: node linkType: hard -"@storybook/manager-api@npm:8.6.7": - version: 8.6.7 - resolution: "@storybook/manager-api@npm:8.6.7" +"@storybook/manager-api@npm:8.6.8": + version: 8.6.8 + resolution: "@storybook/manager-api@npm:8.6.8" peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - checksum: 6bb0860c3795945189832613da5866e5159b2adb376478a2b596c113928c64f5962efc325f927a6bcb7a48d7257f42cf6489b0c44397876129626ac68c44aa28 + checksum: ee575781572898fc2fa734750ccb4bad09fc021bd0878ca9a05d9668cb336610d53e8110f4ff3c2c180573a64e9caba8f50f59d0bd3f0398a5c98e2eafdd91ae languageName: node linkType: hard -"@storybook/preview-api@npm:8.6.7": - version: 8.6.7 - resolution: "@storybook/preview-api@npm:8.6.7" +"@storybook/preview-api@npm:8.6.8": + version: 8.6.8 + resolution: "@storybook/preview-api@npm:8.6.8" peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - checksum: 0d24d62444b7b153bde89d3949ab6539a163e15bc80c5bfcc73b7d49bbb34fb02eb74a99434793b8a6446aeec491e07f006c0f4e404f98486c6d1d614d01defa + checksum: ac923a342d09c9e51f67734acaea19a41dc87cfc6cb22aea262591396d41cd4b69896417b618c55f17a9d64660b659813475c30d338c9bb6aa45391cfe8328f0 languageName: node linkType: hard -"@storybook/react-dom-shim@npm:8.6.7": - version: 8.6.7 - resolution: "@storybook/react-dom-shim@npm:8.6.7" +"@storybook/react-dom-shim@npm:8.6.8": + version: 8.6.8 + resolution: "@storybook/react-dom-shim@npm:8.6.8" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.6.7 - checksum: 51c20259ac4485d9a996266341a4d9898c949049e2a9af9a08bec58c2ace3a40be1a534005c52fc2db2c81bb010dbd36030bb70581b36c05cf4b34d58f140d3a + storybook: ^8.6.8 + checksum: d48ba28fefe0bbe0bde02de6a99629d84ba9436fb539ffc6d779173f7b8f6ec466e26018e943d95fa079d73ace2d96d5911def0221754262782e8a5e8b20882d languageName: node linkType: hard -"@storybook/react@npm:^8.4.7": - version: 8.6.7 - resolution: "@storybook/react@npm:8.6.7" +"@storybook/react@npm:^8.6.8": + version: 8.6.8 + resolution: "@storybook/react@npm:8.6.8" dependencies: - "@storybook/components": 8.6.7 + "@storybook/components": 8.6.8 "@storybook/global": ^5.0.0 - "@storybook/manager-api": 8.6.7 - "@storybook/preview-api": 8.6.7 - "@storybook/react-dom-shim": 8.6.7 - "@storybook/theming": 8.6.7 + "@storybook/manager-api": 8.6.8 + "@storybook/preview-api": 8.6.8 + "@storybook/react-dom-shim": 8.6.8 + "@storybook/theming": 8.6.8 peerDependencies: - "@storybook/test": 8.6.7 + "@storybook/test": 8.6.8 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.6.7 + storybook: ^8.6.8 typescript: ">= 4.2.x" peerDependenciesMeta: "@storybook/test": optional: true typescript: optional: true - checksum: c98438ddfd764300e1a805623fab976f9ef94a2d939984d6caf98ce92ed29d8a7307389b98e2df2d1302b302dc549c7c95050464731d9c588347cd154c360834 + checksum: ebbfb2bed68d4ca8c8777769e5b752b1becf9cc1c3fd6f051df9a8eb012d209526b9e188812f3bf8ecf337a331c5049afa2236d2b073fbcafafd35e79cc3ed78 languageName: node linkType: hard -"@storybook/theming@npm:8.6.7": - version: 8.6.7 - resolution: "@storybook/theming@npm:8.6.7" +"@storybook/theming@npm:8.6.8": + version: 8.6.8 + resolution: "@storybook/theming@npm:8.6.8" peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - checksum: 747a2377df65d5f0962dc8606d06247ad89fb7ecabab0bd9611055d599b5bd0fa15769e4c76e948ae34ae232ba756bf6795ccb3467b1adf35ff961db7350f4de + checksum: 1be0dea23178af562133f1047165e170f7e90bec4c3cedbdcb59df22685f314273a06a4677835ab84e6dbc682b803590adad6963217971c8136b076ce69800aa languageName: node linkType: hard @@ -1436,13 +1436,13 @@ __metadata: languageName: node linkType: hard -"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1": - version: 1.0.1 - resolution: "call-bind-apply-helpers@npm:1.0.1" +"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": + version: 1.0.2 + resolution: "call-bind-apply-helpers@npm:1.0.2" dependencies: es-errors: ^1.3.0 function-bind: ^1.1.2 - checksum: 3c55343261bb387c58a4762d15ad9d42053659a62681ec5eb50690c6b52a4a666302a01d557133ce6533e8bd04530ee3b209f23dd06c9577a1925556f8fcccdf + checksum: b2863d74fcf2a6948221f65d95b91b4b2d90cfe8927650b506141e669f7d5de65cea191bf788838bc40d13846b7886c5bc5c84ab96c3adbcf88ad69a72fcdc6b languageName: node linkType: hard @@ -1458,13 +1458,13 @@ __metadata: languageName: node linkType: hard -"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3": - version: 1.0.3 - resolution: "call-bound@npm:1.0.3" +"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3, call-bound@npm:^1.0.4": + version: 1.0.4 + resolution: "call-bound@npm:1.0.4" dependencies: - call-bind-apply-helpers: ^1.0.1 - get-intrinsic: ^1.2.6 - checksum: a93bbe0f2d0a2d6c144a4349ccd0593d5d0d5d9309b69101710644af8964286420062f2cc3114dca120b9bc8cc07507952d4b1b3ea7672e0d7f6f1675efedb32 + call-bind-apply-helpers: ^1.0.2 + get-intrinsic: ^1.3.0 + checksum: 2f6399488d1c272f56306ca60ff696575e2b7f31daf23bc11574798c84d9f2759dceb0cb1f471a85b77f28962a7ac6411f51d283ea2e45319009a19b6ccab3b2 languageName: node linkType: hard @@ -1491,7 +1491,7 @@ __metadata: "@mdx-js/loader": ^3.1.0 "@mdx-js/react": ^3.1.0 "@next/mdx": ^15.1.4 - "@storybook/react": ^8.4.7 + "@storybook/react": ^8.6.8 "@types/mdx": ^2.0.13 "@types/node": ^20 "@types/react": ^18.0.0 @@ -1502,12 +1502,12 @@ __metadata: eslint-config-next: 14.2.23 lightningcss: ^1.28.2 motion: ^12.4.1 - next: 14.2.23 + next: 14.2.25 react: ^18.0.2 react-dom: ^18.0.2 react-frame-component: ^5.2.7 shiki: ^1.26.1 - storybook: ^8.4.7 + storybook: ^8.6.8 typescript: ^5 languageName: unknown linkType: soft @@ -1934,12 +1934,12 @@ __metadata: languageName: node linkType: hard -"es-object-atoms@npm:^1.0.0": - version: 1.0.0 - resolution: "es-object-atoms@npm:1.0.0" +"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": + version: 1.1.1 + resolution: "es-object-atoms@npm:1.1.1" dependencies: es-errors: ^1.3.0 - checksum: 26f0ff78ab93b63394e8403c353842b2272836968de4eafe97656adfb8a7c84b9099bf0fe96ed58f4a4cddc860f6e34c77f91649a58a5daa4a9c40b902744e3c + checksum: 214d3767287b12f36d3d7267ef342bbbe1e89f899cfd67040309fc65032372a8e60201410a99a1645f2f90c1912c8c49c8668066f6bdd954bcd614dda2e3da97 languageName: node linkType: hard @@ -2555,12 +2555,12 @@ __metadata: languageName: node linkType: hard -"for-each@npm:^0.3.3": - version: 0.3.3 - resolution: "for-each@npm:0.3.3" +"for-each@npm:^0.3.3, for-each@npm:^0.3.5": + version: 0.3.5 + resolution: "for-each@npm:0.3.5" dependencies: - is-callable: ^1.1.3 - checksum: 6c48ff2bc63362319c65e2edca4a8e1e3483a2fabc72fbe7feaf8c73db94fc7861bd53bc02c8a66a0c1dd709da6b04eec42e0abdd6b40ce47305ae92a25e5d28 + is-callable: ^1.2.7 + checksum: 3c986d7e11f4381237cc98baa0a2f87eabe74719eee65ed7bed275163082b940ede19268c61d04c6260e0215983b12f8d885e3c8f9aa8c2113bf07c37051745c languageName: node linkType: hard @@ -2631,21 +2631,21 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7": - version: 1.2.7 - resolution: "get-intrinsic@npm:1.2.7" +"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": + version: 1.3.0 + resolution: "get-intrinsic@npm:1.3.0" dependencies: - call-bind-apply-helpers: ^1.0.1 + call-bind-apply-helpers: ^1.0.2 es-define-property: ^1.0.1 es-errors: ^1.3.0 - es-object-atoms: ^1.0.0 + es-object-atoms: ^1.1.1 function-bind: ^1.1.2 - get-proto: ^1.0.0 + get-proto: ^1.0.1 gopd: ^1.2.0 has-symbols: ^1.1.0 hasown: ^2.0.2 math-intrinsics: ^1.1.0 - checksum: a1597b3b432074f805b6a0ba1182130dd6517c0ea0c4eecc4b8834c803913e1ea62dfc412865be795b3dacb1555a21775b70cf9af7a18b1454ff3414e5442d4a + checksum: 301008e4482bb9a9cb49e132b88fee093bff373b4e6def8ba219b1e96b60158a6084f273ef5cafe832e42cd93462f4accb46a618d35fe59a2b507f2388c5b79d languageName: node linkType: hard @@ -3042,7 +3042,7 @@ __metadata: languageName: node linkType: hard -"is-callable@npm:^1.1.3, is-callable@npm:^1.2.7": +"is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac @@ -4176,20 +4176,20 @@ __metadata: languageName: node linkType: hard -"next@npm:14.2.23": - version: 14.2.23 - resolution: "next@npm:14.2.23" +"next@npm:14.2.25": + version: 14.2.25 + resolution: "next@npm:14.2.25" dependencies: - "@next/env": 14.2.23 - "@next/swc-darwin-arm64": 14.2.23 - "@next/swc-darwin-x64": 14.2.23 - "@next/swc-linux-arm64-gnu": 14.2.23 - "@next/swc-linux-arm64-musl": 14.2.23 - "@next/swc-linux-x64-gnu": 14.2.23 - "@next/swc-linux-x64-musl": 14.2.23 - "@next/swc-win32-arm64-msvc": 14.2.23 - "@next/swc-win32-ia32-msvc": 14.2.23 - "@next/swc-win32-x64-msvc": 14.2.23 + "@next/env": 14.2.25 + "@next/swc-darwin-arm64": 14.2.25 + "@next/swc-darwin-x64": 14.2.25 + "@next/swc-linux-arm64-gnu": 14.2.25 + "@next/swc-linux-arm64-musl": 14.2.25 + "@next/swc-linux-x64-gnu": 14.2.25 + "@next/swc-linux-x64-musl": 14.2.25 + "@next/swc-win32-arm64-msvc": 14.2.25 + "@next/swc-win32-ia32-msvc": 14.2.25 + "@next/swc-win32-x64-msvc": 14.2.25 "@swc/helpers": 0.5.5 busboy: 1.6.0 caniuse-lite: ^1.0.30001579 @@ -4230,7 +4230,7 @@ __metadata: optional: true bin: next: dist/bin/next - checksum: 4f9f744439fb860ba7c64ae1c61bc361bdd36e41d56760c52eabb404f4143c854b78ba9a79b7aefc322d93edbbd66d966cbdaf86772a88a8bf2e6b289987f14f + checksum: ca47d0f1d41351adaf75a37c8e8ce39dd76ebc62b054266ef84b5fc1ea41241ad5f16ab7a1ca47b6613b2c3e4c6f48b179f8cd3b0f087912ec7164c4e72981f0 languageName: node linkType: hard @@ -5051,11 +5051,11 @@ __metadata: languageName: node linkType: hard -"storybook@npm:^8.4.7": - version: 8.6.7 - resolution: "storybook@npm:8.6.7" +"storybook@npm:^8.6.8": + version: 8.6.8 + resolution: "storybook@npm:8.6.8" dependencies: - "@storybook/core": 8.6.7 + "@storybook/core": 8.6.8 peerDependencies: prettier: ^2 || ^3 peerDependenciesMeta: @@ -5065,7 +5065,7 @@ __metadata: getstorybook: ./bin/index.cjs sb: ./bin/index.cjs storybook: ./bin/index.cjs - checksum: fe21ce4d9cd17069a5b409ed518603f97ec6ec421b7f41cff3e43b409820fcbc2c8dbcb3aed99dd7d0a99a0c6138c7576ddf72f78186b6f86085d503b3c8b32f + checksum: 93b92e53c00ff29b4864932c26c52dd4a45e76b3d46811a2bcdc0271ef37c96e2f8d1833982569ab6a6348d6e84d8348aecf74ee72164744459de4c78d0f6759 languageName: node linkType: hard @@ -5616,16 +5616,17 @@ __metadata: linkType: hard "which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.18, which-typed-array@npm:^1.1.2": - version: 1.1.18 - resolution: "which-typed-array@npm:1.1.18" + version: 1.1.19 + resolution: "which-typed-array@npm:1.1.19" dependencies: available-typed-arrays: ^1.0.7 call-bind: ^1.0.8 - call-bound: ^1.0.3 - for-each: ^0.3.3 + call-bound: ^1.0.4 + for-each: ^0.3.5 + get-proto: ^1.0.1 gopd: ^1.2.0 has-tostringtag: ^1.0.2 - checksum: d2feea7f51af66b3a240397aa41c796585033e1069f18e5b6d4cd3878538a1e7780596fd3ea9bf347c43d9e98e13be09b37d9ea3887cef29b11bc291fd47bb52 + checksum: 162d2a07f68ea323f88ed9419861487ce5d02cb876f2cf9dd1e428d04a63133f93a54f89308f337b27cabd312ee3d027cae4a79002b2f0a85b79b9ef4c190670 languageName: node linkType: hard @@ -5677,8 +5678,8 @@ __metadata: linkType: hard "ws@npm:^8.2.3": - version: 8.18.0 - resolution: "ws@npm:8.18.0" + version: 8.18.1 + resolution: "ws@npm:8.18.1" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -5687,7 +5688,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 91d4d35bc99ff6df483bdf029b9ea4bfd7af1f16fc91231a96777a63d263e1eabf486e13a2353970efc534f9faa43bdbf9ee76525af22f4752cbc5ebda333975 + checksum: 4658357185d891bc45cc2d42a84f9e192d047e8476fb5cba25b604f7d75ca87ca0dd54cd0b2cc49aeee57c79045a741cb7d0b14501953ac60c790cd105c42f23 languageName: node linkType: hard diff --git a/docs/features/software-catalog/external-integrations.md b/docs/features/software-catalog/external-integrations.md index 343128bfbf..64468f7f41 100644 --- a/docs/features/software-catalog/external-integrations.md +++ b/docs/features/software-catalog/external-integrations.md @@ -1157,13 +1157,21 @@ export class MyIncrementalEntityProvider The last step is to implement the actual `next` method that will accept the cursor, call the API, process the result and return the result. ```ts +import { + ANNOTATION_LOCATION, + ANNOTATION_ORIGIN_LOCATION, +} from '@backstage/catalog-model'; +import { IncrementalEntityProvider } from '@backstage/plugin-catalog-backend-module-incremental-ingestion'; + export class MyIncrementalEntityProvider implements IncrementalEntityProvider { private readonly token: string; + private readonly mySource: string; - constructor(token: string) { + constructor(token: string, mySource: string) { this.token = token; + this.mySource = mySource; } getProviderName() { @@ -1181,6 +1189,7 @@ export class MyIncrementalEntityProvider cursor: Cursor = { page: 1 }, ): Promise> { const { apiClient } = context; + const location = `${this.getProviderName()}:${this.mySource}`; // call your API with the current cursor const data = await apiClient.getServices(cursor); @@ -1200,8 +1209,8 @@ export class MyIncrementalEntityProvider name: item.name, annotations: { // You need to define these, otherwise they'll fail validation - [ANNOTATION_LOCATION]: this.getProviderName(), - [ANNOTATION_ORIGIN_LOCATION]: this.getProviderName(), + [ANNOTATION_LOCATION]: location, + [ANNOTATION_ORIGIN_LOCATION]: location, }, }, spec: { diff --git a/docs/integrations/bitbucketServer/discovery.md b/docs/integrations/bitbucketServer/discovery.md index 9ba6c7a96d..7947913182 100644 --- a/docs/integrations/bitbucketServer/discovery.md +++ b/docs/integrations/bitbucketServer/discovery.md @@ -26,17 +26,30 @@ dependency to `@backstage/plugin-catalog-backend-module-bitbucket-server` to you yarn --cwd packages/backend add @backstage/plugin-catalog-backend-module-bitbucket-server ``` -And update your backend by adding the following line: +### Installation with New Backend System -```ts title="packages/backend/src/index.ts" -backend.add(import('@backstage/plugin-catalog-backend')); -/* highlight-add-start */ +```ts +// optional if you want HTTP endpojnts to receive external events +// backend.add(import('@backstage/plugin-events-backend')); +// optional if you want to use AWS SQS instead of HTTP endpoints to receive external events +// backend.add(import('@backstage/plugin-events-backend-module-aws-sqs')); +backend.add(import('@backstage/plugin-events-backend-module-bitbucket-server')); backend.add( import('@backstage/plugin-catalog-backend-module-bitbucket-server'), ); -/* highlight-add-end */ ``` +You need to decide how you want to receive events from external sources like + +- [via HTTP endpoint](https://github.com/backstage/backstage/tree/master/plugins/events-backend/README.md) +- [via an AWS SQS queue](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-aws-sqs/README.md) + +Further documentation: + +- +- +- + ## Configuration To use the entity provider, you'll need a [Bitbucket Server integration set up](locations.md). diff --git a/docs/integrations/github/discovery.md b/docs/integrations/github/discovery.md index 4da7287383..e2513cdf21 100644 --- a/docs/integrations/github/discovery.md +++ b/docs/integrations/github/discovery.md @@ -152,7 +152,7 @@ If you do so, `default` will be used as provider ID. Wildcards cannot be used if the `validateLocationsExist` option is set to `true`. - **`filters`** _(optional)_: - **`branch`** _(optional)_: - String used to filter results based on the branch name. + String used to filter results based on the branch name. Branch name cannot have any slash (`/`) characters. Defaults to the default Branch of the repository. - **`repository`** _(optional)_: Regular expression used to filter results based on the repository name. diff --git a/docs/integrations/ldap/org.md b/docs/integrations/ldap/org.md index 4dd7b7d1d8..9913cf0729 100644 --- a/docs/integrations/ldap/org.md +++ b/docs/integrations/ldap/org.md @@ -86,13 +86,14 @@ catalog: These config blocks have a lot of options in them, so we will describe each "root" key within the block separately. -> NOTE: -> -> If you want to import users and groups from different LDAP servers, you can define multiple providers with different names. -> If they should come from the same server, you can define multiple users and groups blocks within the same provider using an array of users / groups. -> Entries coming from the same block will be able to detect group memberships based on the `memberOf` attribute. -> -> If you want only to import users or groups, you can omit the groups or users block. +:::note Note + +If you want to import users and groups from different LDAP servers, you can define multiple providers with different names. +If they should come from the same server, you can define multiple users and groups blocks within the same provider using an array of users / groups. +Entries coming from the same block will be able to detect group memberships based on the `memberOf` attribute. +If you want only to import users or groups, you can omit the groups or users block. + +::: ### target diff --git a/docs/notifications/processors.md b/docs/notifications/processors.md index abee7c97c3..ad3e427364 100644 --- a/docs/notifications/processors.md +++ b/docs/notifications/processors.md @@ -104,4 +104,69 @@ Apart from STMP, the email processor also supports the following transmissions: - sendmail - stream (only for debugging purposes) -See more information at https://github.com/backstage/backstage/blob/master/plugins/notifications-backend-module-email/README.md +See more information at + +### Slack Processor + +Slack processor is used to send notifications to users and channels in Slack. + +### Slack Configuration + +To use this you'll need to create a Slack App or use an existing one. It should have at least the following scopes: +`chat:write`, `users:read`, `im:write` (for direct message support). + +Additionally you may include scopes `chat:write.public` in order to send messages to public channels your app is not +a member of. + +These scopes are under OAuth & Permissions. You will also want to save the Bot User OAuth Token. This will be needed +in the following step to configure `app-config.yaml`. + +### Configure Backstage + +To install the Slack processor, add the `@backstage/plugin-notifications-backend-module-slack` package to your backend. + +```bash +yarn workspace backend add @backstage/plugin-notifications-backend-module-slack +``` + +Add the Slack processor to your backend: + +```ts +// packages/backend/src/index.ts +import { createBackend } from '@backstage/plugin-notifications-backend'; +const backend = createBackend(); +// ... +backend.add(import('@backstage/plugin-notifications-backend-module-slack')); +``` + +Using the token you obtained from your Slack App, configure the Slack module in your `app-config.yaml`. + +```yaml +notifications: + processors: + slack: + - token: xoxb-XXXXXXXXX + broadcastChannels: # Optional, if you wish to support broadcast notifications. + - C12345678 +``` + +Multiple instances can be added in the `slack` array, allowing you to have multiple configurations if you need to send +messages to more than one Slack workspace. Org-Wide App installation is not currently supported. + +### Entity Requirements + +Entities must be annotated with the following annotation: + +- `slack.com/bot-notify` + +The value may be any Slack ID supported by [chat.postMessage](https://api.slack.com/methods/chat.postMessage), for example a user (U12345678), channel (C12345678), group, or direct message chat. + +It's also possible to use a user's email address or channel name, however IDs are recommended by Slack. +Private channels/chats must use an ID. + +### Observability + +The processor includes the following counter metrics if you are exporting metrics using OpenTelemetry: + +- `notifications.processors.slack.sent.count` - The number of messages sent +- `notifications.processors.slack.error.count` - The number of messages that failed to send diff --git a/docs/overview/roadmap.md b/docs/overview/roadmap.md index 1a41eedd63..a61455a313 100644 --- a/docs/overview/roadmap.md +++ b/docs/overview/roadmap.md @@ -11,23 +11,9 @@ public roadmap. This not a complete list of all work happening in and around the project, it only highlights the highest priority initiatives worked on by the core maintainers. -## 2024 Fall Roadmap +## 2025 Spring Roadmap -The initiatives listed below are planned for release within the next half-year, starting in May 2024. The roadmap is updated every 6 months, and the next update is planned for November 2024. - -### Backend System 1.0 - -The goal of this initiative is the stable 1.0 release of the [new backend system](../backend-system/index.md). -This includes ensuring that all documentation is up to date, and includes API -reviews and refactoring efforts to ensure that what is released is both stable -and evolvable. You can follow along with this work in the [meta issue](https://github.com/backstage/backstage/issues/24493). - -As part of this initiative, there will also be an exploration on how to -simplify extension of backend services. It is not currently possible to augment -backend services through declarative integration, they are instead only -customizable through complete replacement. This also limits the ability to -modularize services and scale ownership of the implementations. The goal is to -provide a more flexible and scalable way to extend backend services. +The initiatives listed below are planned for release within the next half-year, starting in November 2024. The roadmap is updated every 6 months, and the next update is planned for April 2024. ### New Frontend System - Ready for Adoption @@ -40,53 +26,17 @@ This milestone also includes reaching and executing [rollout phase 2](https://gi Once the initial milestone is reached, the goal is to also build out broader support for the new frontend system in the core plugins. -### Backstage Security Audit - -This is the second security audit of the Backstage project. It is done together, -and with the support of the [Cloud Native Computing Foundation (CNCF)](https://www.cncf.io/). -This time the audit will in particular focus on the recently introduced -[authentication system](https://github.com/backstage/backstage/tree/master/beps/0003-auth-architecture-evolution), -but also cover other parts of the project. - -### Plugin Metadata - -The goal of this initiative is to provide better machine readable metadata for -Backstage packages, available both at runtime, at build-time and as part of -package registries. We want to surface information such as what packages make up -a particular plugin, what features it provides, and more generally laying the -foundation for an evolvable plugin metadata system. - -### MUI v5 Green-light - -Material-UI v4 is still the officially supported version of MUI in Backstage. -While we have heard that adopters have had success using MUI 5, this is still an -untested path with known bugs. The goal of this initiative is to iron out any -remaining issues or gaps, and then provide a green light for migration to MUI 5. - -### Configuration Improvements - -This initiative aims to improve the configuration experience and reliability in -Backstage. Areas for improvement include the way that configuration schema is -loaded, the way that plugins access configuration that is not owned by them, how -plugins read configuration, and how configuration visibility is handled. - -### Versioned Documentation - -The goal of this initiative is to provide versioned documentation at -[backstage.io](https://backstage.io). This lets us provide documentation that is -both up-to-date while at the same time not ahead of the latest release. - ### Rework Pull Request & Issue Process Our current review and issue triage process is centered around either core- or project area maintainers. The goal of this initiative is to make it simpler for more members of the community to be involved and contribute to this process. -### Catalog Observability +### Catalog Performance -The goal of this initiative is to provide better tools for debugging catalog -ingestion issues and to more generally reduce friction for setting up and -maintaining the software catalog. +The goal of this initiative is to improve the performance of the Software +Catalog, both in terms of speeding up the read API and improving the ingestion +process. ## How to influence the roadmap diff --git a/docs/plugins/observability.md b/docs/plugins/observability.md index 3bc625e7c6..c294001606 100644 --- a/docs/plugins/observability.md +++ b/docs/plugins/observability.md @@ -21,7 +21,7 @@ The backend supplies a central logging service, [`rootLogger`](../backend-system/core-services/root-logger.md), as well as a plugin based logger, [`logger`](../backend-system/core-services/logger.md) from `coreServices`. To add additional granularity to your logs, you can create children from the plugin -based logger, using the `.child()` method and provide is with JSON data. For example, +based logger, using the `.child()` method and provide it with JSON data. For example, if you wanted to log items for a specific span in your plugin, you could do ```ts diff --git a/docs/releases/v1.38.0-next.0-changelog.md b/docs/releases/v1.38.0-next.0-changelog.md new file mode 100644 index 0000000000..9adf106e6f --- /dev/null +++ b/docs/releases/v1.38.0-next.0-changelog.md @@ -0,0 +1,1156 @@ +# Release v1.38.0-next.0 + +Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.38.0-next.0](https://backstage.github.io/upgrade-helper/?to=1.38.0-next.0) + +## @backstage/backend-defaults@0.9.0-next.0 + +### Minor Changes + +- 01edf6e: Allow pass through of redis client and cluster options to Cache core service + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@1.2.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/backend-dev-utils@0.1.5 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/cli-node@0.2.13 + - @backstage/config@1.3.2 + - @backstage/config-loader@1.10.0 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + - @backstage/integration-aws-node@0.1.15 + - @backstage/types@1.2.1 + - @backstage/plugin-events-node@0.4.9 + +## @backstage/cli@0.32.0-next.0 + +### Minor Changes + +- c7254ae: Internal update to move the `clean`, `pre/postpack` and `fix` commands into their own separate module. + +### Patch Changes + +- 4ea76f7: Bump @module-federation/enhanced ^0.9.0 to fix GHSA-593f-38f6-jp5m +- 87a5cb4: Fixed an issue causing the `repo lint` command to fail when the `--max-warnings` option was used. +- d83f3f4: Resolved a problem where the `start` command did not correctly handle multiple `--require` flags, ensuring all specified modules are now properly loaded. +- Updated dependencies + - @backstage/catalog-model@1.7.3 + - @backstage/cli-common@0.1.15 + - @backstage/cli-node@0.2.13 + - @backstage/config@1.3.2 + - @backstage/config-loader@1.10.0 + - @backstage/errors@1.2.7 + - @backstage/eslint-plugin@0.1.10 + - @backstage/integration@1.16.2 + - @backstage/release-manifests@0.0.12 + - @backstage/types@1.2.1 + +## @backstage/plugin-catalog@1.29.0-next.0 + +### Minor Changes + +- 9454ef9: Added support of filtering based on system columns in catalog table + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/integration-react@1.2.5 + - @backstage/types@1.2.1 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-permission-react@0.4.32 + - @backstage/plugin-scaffolder-common@1.5.10 + - @backstage/plugin-search-common@1.2.17 + - @backstage/plugin-search-react@1.8.7 + +## @backstage/plugin-scaffolder@1.30.0-next.0 + +### Minor Changes + +- 5890016: add api to retrieve template extensions info from scaffolder-backend + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.15.0-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/integration@1.16.2 + - @backstage/integration-react@1.2.5 + - @backstage/types@1.2.1 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-permission-react@0.4.32 + - @backstage/plugin-scaffolder-common@1.5.10 + +## @backstage/plugin-scaffolder-backend@1.32.0-next.0 + +### Minor Changes + +- 75e4db4: add template-extensions scaffolder service endpoint + +### Patch Changes + +- 497d47a: Document the internal built-in filters, and ensure that the types are validated when using `createTemplateFilter` and `createTemplateGlobalFunction` from the `zod` schema. +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/plugin-scaffolder-backend-module-azure@0.2.8-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.9-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.6.2-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.8-next.0 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + - @backstage/types@1.2.1 + - @backstage/plugin-bitbucket-cloud-common@0.2.28 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.6 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.8-next.0 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.8-next.0 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.8-next.0 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.8.2-next.0 + - @backstage/plugin-scaffolder-common@1.5.10 + +## @backstage/plugin-scaffolder-react@1.15.0-next.0 + +### Minor Changes + +- 5890016: add api to retrieve template extensions info from scaffolder-backend + +### Patch Changes + +- 6ed42b7: Scaffolding - Template card - button to show template entity detail +- Updated dependencies + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/theme@0.6.4 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-permission-react@0.4.32 + - @backstage/plugin-scaffolder-common@1.5.10 + +## @backstage/backend-dynamic-feature-service@0.6.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/plugin-catalog-backend@1.32.0 + - @backstage/plugin-events-backend@0.5.0 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/plugin-search-backend-node@1.3.9 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/cli-common@0.1.15 + - @backstage/cli-node@0.2.13 + - @backstage/config@1.3.2 + - @backstage/config-loader@1.10.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-app-node@0.1.31 + - @backstage/plugin-events-node@0.4.9 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-common@1.2.17 + +## @backstage/backend-test-utils@1.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/backend-app-api@1.2.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-events-node@0.4.9 + +## @backstage/canon@0.2.1-next.0 + +### Patch Changes + +- 6af7b16: Updated styles for the Menu component in Canon. +- 513477f: Add global CSS reset for anchor tags. +- 05a5003: Fix the Icon component when the name is not found to return null instead of an empty SVG. + +## @backstage/core-compat-api@0.4.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/version-bridge@1.0.11 + +## @backstage/create-app@0.6.1-next.0 + +### Patch Changes + +- Bumped create-app version. +- Updated dependencies + - @backstage/cli-common@0.1.15 + +## @backstage/dev-utils@1.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/app-defaults@1.6.0 + - @backstage/catalog-model@1.7.3 + - @backstage/core-app-api@1.16.0 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/integration-react@1.2.5 + - @backstage/theme@0.6.4 + +## @techdocs/cli@1.9.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/plugin-techdocs-node@1.13.2-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.2 + +## @backstage/plugin-api-docs@0.12.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.29.0-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-permission-react@0.4.32 + +## @backstage/plugin-auth-backend@0.24.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend-module-oidc-provider@0.4.2-next.0 + - @backstage/plugin-auth-backend-module-atlassian-provider@0.4.1 + - @backstage/plugin-auth-backend-module-auth0-provider@0.2.1 + - @backstage/plugin-auth-backend-module-bitbucket-provider@0.3.1 + - @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.2.1 + - @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.4.1 + - @backstage/plugin-auth-backend-module-github-provider@0.3.1 + - @backstage/plugin-auth-backend-module-gitlab-provider@0.3.1 + - @backstage/plugin-auth-backend-module-microsoft-provider@0.3.1 + - @backstage/plugin-auth-backend-module-oauth2-provider@0.4.1 + - @backstage/plugin-auth-backend-module-okta-provider@0.2.1 + - @backstage/plugin-auth-backend-module-onelogin-provider@0.3.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-auth-backend-module-aws-alb-provider@0.4.2-next.0 + - @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.6 + - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.4.1 + - @backstage/plugin-auth-backend-module-google-provider@0.3.1 + - @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.6 + - @backstage/plugin-catalog-node@1.16.1 + +## @backstage/plugin-auth-backend-module-aws-alb-provider@0.4.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.5-next.0 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/errors@1.2.7 + +## @backstage/plugin-auth-backend-module-oidc-provider@0.4.2-next.0 + +### Patch Changes + +- 7495edf: Added custom timeout setting for oidc provider + + Here is an example of how to use a custom timeout with the configuration: + + ```yaml + auth: + oidc: + production: + clientId: ${AUTH_GOOGLE_CLIENT_ID} + clientSecret: ${AUTH_GOOGLE_CLIENT_SECRET} + timeout: + seconds: 30 + ``` + +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.5-next.0 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/types@1.2.1 + +## @backstage/plugin-catalog-backend-module-aws@0.4.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + - @backstage/integration-aws-node@0.1.15 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-kubernetes-common@0.9.4 + +## @backstage/plugin-catalog-backend-module-github@0.7.12-next.0 + +### Patch Changes + +- 16648ef: Added `validateLocationsExist` to the config definition where it was missing. +- Updated dependencies + - @backstage/plugin-catalog-backend@1.32.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/integration@1.16.2 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + +## @backstage/plugin-catalog-backend-module-github-org@0.3.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-github@0.7.12-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + +## @backstage/plugin-catalog-backend-module-gitlab@0.6.5-next.0 + +### Patch Changes + +- a568cda: add filter for repos by membership and topics +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/integration@1.16.2 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + +## @backstage/plugin-catalog-backend-module-gitlab-org@0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-gitlab@0.6.5-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.6.5-next.0 + +### Patch Changes + +- 27d1031: fixed misleading example location annotations in docs +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/plugin-catalog-backend@1.32.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + - @backstage/plugin-permission-common@0.8.4 + +## @backstage/plugin-catalog-graph@0.4.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/types@1.2.1 + +## @backstage/plugin-catalog-import@0.12.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/integration@1.16.2 + - @backstage/integration-react@1.2.5 + - @backstage/plugin-catalog-common@1.1.3 + +## @backstage/plugin-catalog-react@1.16.1-next.0 + +### Patch Changes + +- 186d016: Add `operation` to alpha `defaultEntityContentGroups`. +- 221ddba: Fix offset pagination to reset when updating filters in `useEntityList` +- Updated dependencies + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/frontend-test-utils@0.3.0 + - @backstage/integration-react@1.2.5 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-permission-react@0.4.32 + +## @backstage/plugin-catalog-unprocessed-entities@0.2.16-next.0 + +### Patch Changes + +- ba88bfa: Added confirmation popup for delete entities in Catalog Unprocessed Entities plugin +- 2479827: Fixed the `convertTimeToLocalTimezone` function in the FailedEntities component to correctly parse ISO 8601 date strings and set the timezone to the current local timezone. +- Updated dependencies + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.10.0 + +## @backstage/plugin-devtools@0.1.26-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/plugin-devtools-common@0.1.15 + - @backstage/plugin-permission-react@0.4.32 + +## @backstage/plugin-devtools-backend@0.5.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.2 + - @backstage/config-loader@1.10.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-devtools-common@0.1.15 + - @backstage/plugin-permission-common@0.8.4 + +## @backstage/plugin-home@0.8.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/plugin-home-react@0.1.25-next.0 + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.16.0 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/theme@0.6.4 + +## @backstage/plugin-home-react@0.1.25-next.0 + +### Patch Changes + +- 2e4cb15: Fixes auto-hiding of content divider when title not specified +- Updated dependencies + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + +## @backstage/plugin-kubernetes@0.12.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/plugin-kubernetes-common@0.9.4 + - @backstage/plugin-kubernetes-react@0.5.5 + - @backstage/plugin-permission-react@0.4.32 + +## @backstage/plugin-kubernetes-cluster@0.0.24-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/plugin-kubernetes-common@0.9.4 + - @backstage/plugin-kubernetes-react@0.5.5 + - @backstage/plugin-permission-react@0.4.32 + +## @backstage/plugin-notifications@0.5.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/theme@0.6.4 + - @backstage/types@1.2.1 + - @backstage/plugin-notifications-common@0.0.8 + - @backstage/plugin-signals-react@0.0.11 + +## @backstage/plugin-org@0.6.38-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/plugin-catalog-common@1.1.3 + +## @backstage/plugin-org-react@0.1.37-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + +## @backstage/plugin-scaffolder-backend-module-azure@0.2.8-next.0 + +### Patch Changes + +- 2bd41ce: Made "publish:azure" action idempotent +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + +## @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.9-next.0 + +### Patch Changes + +- adfceee: Made "publish:bitbucket" action idempotent +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.8-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.8-next.0 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.8-next.0 + +### Patch Changes + +- 5266f1c: Made "publish:bitbucketCloud" action idempotent +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + - @backstage/plugin-bitbucket-cloud-common@0.2.28 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.3.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + - @backstage/types@1.2.1 + +## @backstage/plugin-scaffolder-backend-module-gcp@0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + +## @backstage/plugin-scaffolder-backend-module-gerrit@0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + +## @backstage/plugin-scaffolder-backend-module-gitea@0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + +## @backstage/plugin-scaffolder-backend-module-github@0.6.2-next.0 + +### Patch Changes + +- 1af427a: Made "github:autolinks:create" action idempotent +- 180ea6e: Made "github:branch-protection:create" action idempotent +- 0be1a1e: Made "publish:github" action idempotent +- a833f0f: Made "github:actions:dispatch" action idempotent +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + - @backstage/types@1.2.1 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.8.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + +## @backstage/plugin-scaffolder-backend-module-notifications@0.1.9-next.0 + +### Patch Changes + +- 25a7675: Made "notification:send" action idempotent +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/plugin-notifications-common@0.0.8 + - @backstage/plugin-notifications-node@0.2.13 + +## @backstage/plugin-scaffolder-backend-module-rails@0.5.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + - @backstage/types@1.2.1 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.2.8-next.0 + +### Patch Changes + +- dcda66a: Made "sentry:project:create" action idempotent +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.4.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/types@1.2.1 + - @backstage/plugin-scaffolder-node-test-utils@0.2.1-next.0 + +## @backstage/plugin-scaffolder-node@0.8.1-next.0 + +### Patch Changes + +- 497d47a: Document the internal built-in filters, and ensure that the types are validated when using `createTemplateFilter` and `createTemplateGlobalFunction` from the `zod` schema. +- Updated dependencies + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-model@1.7.3 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + - @backstage/types@1.2.1 + - @backstage/plugin-scaffolder-common@1.5.10 + +## @backstage/plugin-scaffolder-node-test-utils@0.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-test-utils@1.3.2-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/types@1.2.1 + +## @backstage/plugin-search@1.4.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-search-common@1.2.17 + - @backstage/plugin-search-react@1.8.7 + +## @backstage/plugin-search-backend@2.0.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/plugin-search-backend-node@1.3.9 + - @backstage/backend-openapi-utils@0.5.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-common@1.2.17 + +## @backstage/plugin-search-backend-module-techdocs@0.4.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-node@1.13.2-next.0 + - @backstage/plugin-search-backend-node@1.3.9 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-common@1.2.17 + +## @backstage/plugin-techdocs@1.12.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/integration@1.16.2 + - @backstage/integration-react@1.2.5 + - @backstage/theme@0.6.4 + - @backstage/plugin-auth-react@0.1.13 + - @backstage/plugin-search-common@1.2.17 + - @backstage/plugin-search-react@1.8.7 + - @backstage/plugin-techdocs-common@0.1.0 + - @backstage/plugin-techdocs-react@1.2.15 + +## @backstage/plugin-techdocs-addons-test-utils@1.0.47-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.29.0-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/plugin-techdocs@1.12.5-next.0 + - @backstage/core-app-api@1.16.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/integration-react@1.2.5 + - @backstage/test-utils@1.7.6 + - @backstage/plugin-search-react@1.8.7 + - @backstage/plugin-techdocs-react@1.2.15 + +## @backstage/plugin-techdocs-backend@2.0.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/plugin-techdocs-node@1.13.2-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.4.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-techdocs-common@0.1.0 + +## @backstage/plugin-techdocs-node@1.13.2-next.0 + +### Patch Changes + +- 304a422: Update AWS file retrieval logic from storing file in buffer array to piping to res for better memory efficiency. +- Updated dependencies + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + - @backstage/integration-aws-node@0.1.15 + - @backstage/plugin-search-common@1.2.17 + - @backstage/plugin-techdocs-common@0.1.0 + +## @backstage/plugin-user-settings@0.8.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/core-app-api@1.16.0 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/theme@0.6.4 + - @backstage/types@1.2.1 + - @backstage/plugin-signals-react@0.0.11 + - @backstage/plugin-user-settings-common@0.0.1 + +## @backstage/plugin-user-settings-backend@0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-signals-node@0.1.18 + - @backstage/plugin-user-settings-common@0.0.1 + +## example-app@0.2.108-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.29.0-next.0 + - @backstage/cli@0.32.0-next.0 + - @backstage/canon@0.2.1-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.16-next.0 + - @backstage/plugin-scaffolder-react@1.15.0-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/plugin-scaffolder@1.30.0-next.0 + - @backstage/plugin-api-docs@0.12.6-next.0 + - @backstage/plugin-catalog-graph@0.4.18-next.0 + - @backstage/plugin-catalog-import@0.12.12-next.0 + - @backstage/plugin-org@0.6.38-next.0 + - @backstage/plugin-techdocs@1.12.5-next.0 + - @backstage/plugin-user-settings@0.8.21-next.0 + - @backstage/app-defaults@1.6.0 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.16.0 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/frontend-app-api@0.11.0 + - @backstage/integration-react@1.2.5 + - @backstage/theme@0.6.4 + - @backstage/plugin-auth-react@0.1.13 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-devtools@0.1.26-next.0 + - @backstage/plugin-home@0.8.7-next.0 + - @backstage/plugin-kubernetes@0.12.6-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.24-next.0 + - @backstage/plugin-notifications@0.5.4-next.0 + - @backstage/plugin-permission-react@0.4.32 + - @backstage/plugin-search@1.4.25-next.0 + - @backstage/plugin-search-common@1.2.17 + - @backstage/plugin-search-react@1.8.7 + - @backstage/plugin-signals@0.0.17 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.22 + - @backstage/plugin-techdocs-react@1.2.15 + +## example-app-next@0.0.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.29.0-next.0 + - @backstage/cli@0.32.0-next.0 + - @backstage/canon@0.2.1-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.16-next.0 + - @backstage/plugin-scaffolder-react@1.15.0-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/plugin-scaffolder@1.30.0-next.0 + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/plugin-api-docs@0.12.6-next.0 + - @backstage/plugin-catalog-graph@0.4.18-next.0 + - @backstage/plugin-catalog-import@0.12.12-next.0 + - @backstage/plugin-org@0.6.38-next.0 + - @backstage/plugin-techdocs@1.12.5-next.0 + - @backstage/plugin-user-settings@0.8.21-next.0 + - @backstage/app-defaults@1.6.0 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.16.0 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/frontend-app-api@0.11.0 + - @backstage/frontend-defaults@0.2.0 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/integration-react@1.2.5 + - @backstage/theme@0.6.4 + - @backstage/plugin-app@0.1.7 + - @backstage/plugin-app-visualizer@0.1.17 + - @backstage/plugin-auth-react@0.1.13 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-home@0.8.7-next.0 + - @backstage/plugin-kubernetes@0.12.6-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.24-next.0 + - @backstage/plugin-notifications@0.5.4-next.0 + - @backstage/plugin-permission-react@0.4.32 + - @backstage/plugin-search@1.4.25-next.0 + - @backstage/plugin-search-common@1.2.17 + - @backstage/plugin-search-react@1.8.7 + - @backstage/plugin-signals@0.0.17 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.22 + - @backstage/plugin-techdocs-react@1.2.15 + +## example-backend@0.0.37-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.6.2-next.0 + - @backstage/plugin-scaffolder-backend@1.32.0-next.0 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.9-next.0 + - @backstage/plugin-app-backend@0.5.0 + - @backstage/plugin-auth-backend@0.24.5-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.3.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/plugin-catalog-backend@1.32.0 + - @backstage/plugin-devtools-backend@0.5.4-next.0 + - @backstage/plugin-events-backend@0.5.0 + - @backstage/plugin-kubernetes-backend@0.19.4 + - @backstage/plugin-notifications-backend@0.5.4 + - @backstage/plugin-permission-backend@0.5.55 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/plugin-proxy-backend@0.6.0 + - @backstage/plugin-search-backend@2.0.1-next.0 + - @backstage/plugin-search-backend-node@1.3.9 + - @backstage/plugin-signals-backend@0.3.2 + - @backstage/plugin-techdocs-backend@2.0.1-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.4.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-model@1.7.3 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.6 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.0 + - @backstage/plugin-catalog-backend-module-openapi@0.2.8 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.6 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.6 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.6 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-backend-module-catalog@0.3.2 + - @backstage/plugin-search-backend-module-explore@0.3.0 + +## example-backend-legacy@0.2.109-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/plugin-scaffolder-backend@1.32.0-next.0 + - @backstage/plugin-auth-backend@0.24.5-next.0 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/plugin-catalog-backend@1.32.0 + - @backstage/plugin-events-backend@0.5.0 + - @backstage/plugin-kubernetes-backend@0.19.4 + - @backstage/plugin-permission-backend@0.5.55 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/plugin-search-backend@2.0.1-next.0 + - @backstage/plugin-search-backend-node@1.3.9 + - @backstage/plugin-signals-backend@0.3.2 + - @backstage/plugin-techdocs-backend@2.0.1-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.4.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/integration@1.16.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.6 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.6 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.8-next.0 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.8.2-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.5.8-next.0 + - @backstage/plugin-search-backend-module-catalog@0.3.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.7.0 + - @backstage/plugin-search-backend-module-explore@0.3.0 + - @backstage/plugin-search-backend-module-pg@0.5.42 + - @backstage/plugin-signals-node@0.1.18 + +## e2e-test@0.2.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.6.1-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/errors@1.2.7 + +## @internal/scaffolder@0.0.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.15.0-next.0 + - @backstage/frontend-plugin-api@0.10.0 + +## techdocs-cli-embedded-app@0.2.107-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.29.0-next.0 + - @backstage/cli@0.32.0-next.0 + - @backstage/plugin-techdocs@1.12.5-next.0 + - @backstage/app-defaults@1.6.0 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.16.0 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/integration-react@1.2.5 + - @backstage/test-utils@1.7.6 + - @backstage/theme@0.6.4 + - @backstage/plugin-techdocs-react@1.2.15 diff --git a/docs/releases/v1.38.0-next.1-changelog.md b/docs/releases/v1.38.0-next.1-changelog.md new file mode 100644 index 0000000000..8c916e9d08 --- /dev/null +++ b/docs/releases/v1.38.0-next.1-changelog.md @@ -0,0 +1,1489 @@ +# Release v1.38.0-next.1 + +Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.38.0-next.1](https://backstage.github.io/upgrade-helper/?to=1.38.0-next.1) + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.4.0-next.0 + +### Minor Changes + +- 7b3ed9b: Added the ability for the plugin to receive events coming from Bitbucket Server push webhooks. It then performs a delta mutation on the catalog. + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + +## @backstage/plugin-catalog-backend-module-github@0.8.0-next.1 + +### Minor Changes + +- f0c22eb: **BREAKING**: Explicitly rejects branch names containing a slash character. + + The module now rejects any configuration that contains slashes in branch names. The reason for this is that the ingestion will run into downstream problems if they were let through. If you had configuration with a slash in the branch name in `filters.branch`, your application may fail to start up. + + If you are affected by this, please move over to using branches that do not have slashes in them. + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-catalog-backend@1.32.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + +## @backstage/plugin-events-backend-module-bitbucket-server@0.1.0-next.0 + +### Minor Changes + +- 7b3ed9b: Added the ability for the plugin to receive events coming from Bitbucket Server push webhooks. It then performs a delta mutation on the catalog. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.1 + - @backstage/plugin-events-node@0.4.9 + +## @backstage/plugin-notifications-backend-module-slack@0.1.0-next.0 + +### Minor Changes + +- 552170d: Added a new Slack NotificationProcessor for use with the notifications plugin + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-notifications-common@0.0.8 + - @backstage/plugin-notifications-node@0.2.13 + +## @backstage/app-defaults@1.6.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/core-app-api@1.16.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/theme@0.6.4 + - @backstage/plugin-permission-react@0.4.32 + +## @backstage/backend-defaults@0.9.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/backend-app-api@1.2.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/backend-dev-utils@0.1.5 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/cli-node@0.2.13 + - @backstage/config@1.3.2 + - @backstage/config-loader@1.10.0 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.15 + - @backstage/types@1.2.1 + - @backstage/plugin-events-node@0.4.9 + +## @backstage/backend-dynamic-feature-service@0.6.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/plugin-catalog-backend@1.32.1-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/plugin-events-backend@0.5.0 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/plugin-search-backend-node@1.3.9 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/cli-common@0.1.15 + - @backstage/cli-node@0.2.13 + - @backstage/config@1.3.2 + - @backstage/config-loader@1.10.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-app-node@0.1.31 + - @backstage/plugin-events-node@0.4.9 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-common@1.2.17 + +## @backstage/backend-test-utils@1.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/backend-app-api@1.2.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-events-node@0.4.9 + +## @backstage/canon@0.2.1-next.1 + +### Patch Changes + +- f7cb538: Internal refactor and fixes to the prop extraction logic for layout components. +- 5e80f0b: Fix types on the Icon component. + +## @backstage/cli@0.32.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/cli-common@0.1.15 + - @backstage/cli-node@0.2.13 + - @backstage/config@1.3.2 + - @backstage/config-loader@1.10.0 + - @backstage/errors@1.2.7 + - @backstage/eslint-plugin@0.1.10 + - @backstage/release-manifests@0.0.12 + - @backstage/types@1.2.1 + +## @backstage/core-compat-api@0.4.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/core-plugin-api@1.10.5 + - @backstage/version-bridge@1.0.11 + +## @backstage/core-components@0.17.1-next.0 + +### Patch Changes + +- 5d7bad4: Fixed the messaging in the `AlertDisplay` where it was claiming that there were older messages available rather than newer. +- Updated dependencies + - @backstage/config@1.3.2 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/theme@0.6.4 + - @backstage/version-bridge@1.0.11 + +## @backstage/create-app@0.6.1-next.1 + +### Patch Changes + +- Bumped create-app version. +- Updated dependencies + - @backstage/cli-common@0.1.15 + +## @backstage/dev-utils@1.1.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/integration-react@1.2.6-next.0 + - @backstage/app-defaults@1.6.1-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-app-api@1.16.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/theme@0.6.4 + +## @backstage/frontend-app-api@0.11.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/frontend-defaults@0.2.1-next.0 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.16.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + +## @backstage/frontend-defaults@0.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-app@0.1.8-next.0 + - @backstage/frontend-app-api@0.11.1-next.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## @backstage/frontend-plugin-api@0.10.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + +## @backstage/frontend-test-utils@0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-app@0.1.8-next.0 + - @backstage/frontend-app-api@0.11.1-next.0 + - @backstage/config@1.3.2 + - @backstage/test-utils@1.7.6 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + +## @backstage/integration@1.16.3-next.0 + +### Patch Changes + +- 9768992: Mark GitHub `webhookSecret` config property as optional. A `webhookSecret` is not required when creating a GitHub App. +- Updated dependencies + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## @backstage/integration-react@1.2.6-next.0 + +### Patch Changes + +- 5d10f99: Added scope `project` for Bitbucket Cloud. +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/config@1.3.2 + - @backstage/core-plugin-api@1.10.5 + +## @techdocs/cli@1.9.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/plugin-techdocs-node@1.13.2-next.1 + - @backstage/catalog-model@1.7.3 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.2 + +## @backstage/plugin-api-docs@0.12.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-catalog@1.29.0-next.1 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.5 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-permission-react@0.4.32 + +## @backstage/plugin-app@0.1.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/integration-react@1.2.6-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/theme@0.6.4 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-react@0.4.32 + +## @backstage/plugin-app-visualizer@0.1.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/core-plugin-api@1.10.5 + +## @backstage/plugin-auth-backend@0.24.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend-module-bitbucket-provider@0.3.2-next.0 + - @backstage/plugin-auth-backend-module-atlassian-provider@0.4.1 + - @backstage/plugin-auth-backend-module-auth0-provider@0.2.1 + - @backstage/plugin-auth-backend-module-aws-alb-provider@0.4.2-next.1 + - @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.6 + - @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.2.1 + - @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.4.1 + - @backstage/plugin-auth-backend-module-github-provider@0.3.1 + - @backstage/plugin-auth-backend-module-gitlab-provider@0.3.1 + - @backstage/plugin-auth-backend-module-google-provider@0.3.1 + - @backstage/plugin-auth-backend-module-microsoft-provider@0.3.1 + - @backstage/plugin-auth-backend-module-oauth2-provider@0.4.1 + - @backstage/plugin-auth-backend-module-oidc-provider@0.4.2-next.1 + - @backstage/plugin-auth-backend-module-okta-provider@0.2.1 + - @backstage/plugin-auth-backend-module-onelogin-provider@0.3.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.4.1 + - @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.6 + - @backstage/plugin-catalog-node@1.16.1 + +## @backstage/plugin-auth-backend-module-aws-alb-provider@0.4.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.5-next.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/errors@1.2.7 + +## @backstage/plugin-auth-backend-module-bitbucket-provider@0.3.2-next.0 + +### Patch Changes + +- 5d10f99: Enabled persistency of scopes for Bitbucket Cloud. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + +## @backstage/plugin-auth-backend-module-oidc-provider@0.4.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.5-next.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/types@1.2.1 + +## @backstage/plugin-auth-react@0.1.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + +## @backstage/plugin-bitbucket-cloud-common@0.2.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + +## @backstage/plugin-catalog@1.29.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/integration-react@1.2.6-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/plugin-search-react@1.8.8-next.0 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-permission-react@0.4.32 + - @backstage/plugin-scaffolder-common@1.5.10 + - @backstage/plugin-search-common@1.2.17 + +## @backstage/plugin-catalog-backend@1.32.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/backend-openapi-utils@0.5.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-backend-module-catalog@0.3.2 + - @backstage/plugin-search-common@1.2.17 + +## @backstage/plugin-catalog-backend-module-aws@0.4.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.15 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-kubernetes-common@0.9.4 + +## @backstage/plugin-catalog-backend-module-azure@0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.4.7-next.0 + +### Patch Changes + +- 146e41b: Fixed bug in event-based discovery that caused unnecessary API calls to Bitbucket Cloud +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.29-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + +## @backstage/plugin-catalog-backend-module-gerrit@0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + +## @backstage/plugin-catalog-backend-module-github-org@0.3.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-github@0.8.0-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + +## @backstage/plugin-catalog-backend-module-gitlab@0.6.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + +## @backstage/plugin-catalog-backend-module-gitlab-org@0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-gitlab@0.6.5-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.6.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/plugin-catalog-backend@1.32.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + - @backstage/plugin-permission-common@0.8.4 + +## @backstage/plugin-catalog-backend-module-logs@0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.32.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/plugin-events-node@0.4.9 + +## @backstage/plugin-catalog-backend-module-openapi@0.2.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-model@1.7.3 + - @backstage/types@1.2.1 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + +## @backstage/plugin-catalog-graph@0.4.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.5 + - @backstage/types@1.2.1 + +## @backstage/plugin-catalog-import@0.12.12-next.1 + +### Patch Changes + +- 5b9514f: Expose the `UnpackNestedValue` type as it's been removed from `react-hook-form` +- f1d9a64: adding translation for `Register an existing component` text +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/integration-react@1.2.6-next.0 + - @backstage/integration@1.16.3-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.3 + +## @backstage/plugin-catalog-react@1.16.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/integration-react@1.2.6-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/frontend-test-utils@0.3.1-next.0 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-permission-react@0.4.32 + +## @backstage/plugin-catalog-unprocessed-entities@0.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + +## @backstage/plugin-config-schema@0.1.67-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## @backstage/plugin-devtools@0.1.26-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/plugin-devtools-common@0.1.15 + - @backstage/plugin-permission-react@0.4.32 + +## @backstage/plugin-devtools-backend@0.5.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.2 + - @backstage/config-loader@1.10.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-devtools-common@0.1.15 + - @backstage/plugin-permission-common@0.8.4 + +## @backstage/plugin-home@0.8.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/plugin-home-react@0.1.25-next.1 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.16.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/theme@0.6.4 + +## @backstage/plugin-home-react@0.1.25-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/core-plugin-api@1.10.5 + +## @backstage/plugin-kubernetes@0.12.6-next.1 + +### Patch Changes + +- b877e46: Added New Frontend System filter for the Kubernetes tab to use `isKubernetesAvailable` to control its visibility +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/plugin-kubernetes-react@0.5.6-next.0 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.5 + - @backstage/plugin-kubernetes-common@0.9.4 + - @backstage/plugin-permission-react@0.4.32 + +## @backstage/plugin-kubernetes-cluster@0.0.24-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/plugin-kubernetes-react@0.5.6-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.5 + - @backstage/plugin-kubernetes-common@0.9.4 + - @backstage/plugin-permission-react@0.4.32 + +## @backstage/plugin-kubernetes-react@0.5.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-kubernetes-common@0.9.4 + +## @backstage/plugin-notifications@0.5.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/theme@0.6.4 + - @backstage/types@1.2.1 + - @backstage/plugin-notifications-common@0.0.8 + - @backstage/plugin-signals-react@0.0.11 + +## @backstage/plugin-notifications-backend@0.5.5-next.0 + +### Patch Changes + +- 9a6080e: Allow throttling notification sending not to block the system with huge amount of receiving users +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + - @backstage/plugin-notifications-common@0.0.8 + - @backstage/plugin-notifications-node@0.2.13 + - @backstage/plugin-signals-node@0.1.18 + +## @backstage/plugin-org@0.6.38-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.5 + - @backstage/plugin-catalog-common@1.1.3 + +## @backstage/plugin-org-react@0.1.37-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.5 + +## @backstage/plugin-scaffolder@1.30.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/integration-react@1.2.6-next.0 + - @backstage/integration@1.16.3-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/plugin-scaffolder-react@1.15.0-next.1 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-permission-react@0.4.32 + - @backstage/plugin-scaffolder-common@1.5.10 + +## @backstage/plugin-scaffolder-backend@1.32.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend-module-gitlab@0.8.2-next.1 + - @backstage/integration@1.16.3-next.0 + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/plugin-bitbucket-cloud-common@0.2.29-next.0 + - @backstage/plugin-scaffolder-backend-module-azure@0.2.8-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.9-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.8-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.8-next.1 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.8-next.1 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.8-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.6.2-next.1 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.6 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-scaffolder-common@1.5.10 + +## @backstage/plugin-scaffolder-backend-module-azure@0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.8-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.8-next.1 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.29-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.3.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## @backstage/plugin-scaffolder-backend-module-gcp@0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-gerrit@0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-gitea@0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-github@0.6.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.8.2-next.1 + +### Patch Changes + +- 003dc15: Updated the path field in the `gitlab:group:ensureExists` action to support also strings with multiple segments (e.g. `group/subgroup`) +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-notifications@0.1.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/plugin-notifications-common@0.0.8 + - @backstage/plugin-notifications-node@0.2.13 + +## @backstage/plugin-scaffolder-backend-module-rails@0.5.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.4.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/types@1.2.1 + - @backstage/plugin-scaffolder-node-test-utils@0.2.1-next.1 + +## @backstage/plugin-scaffolder-node@0.8.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-model@1.7.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-scaffolder-common@1.5.10 + +## @backstage/plugin-scaffolder-node-test-utils@0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-test-utils@1.3.2-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/types@1.2.1 + +## @backstage/plugin-scaffolder-react@1.15.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.5 + - @backstage/theme@0.6.4 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-permission-react@0.4.32 + - @backstage/plugin-scaffolder-common@1.5.10 + +## @backstage/plugin-search@1.4.25-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/plugin-search-react@1.8.8-next.0 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-search-common@1.2.17 + +## @backstage/plugin-search-backend@2.0.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/plugin-search-backend-node@1.3.9 + - @backstage/backend-openapi-utils@0.5.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-common@1.2.17 + +## @backstage/plugin-search-backend-module-techdocs@0.4.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-node@1.13.2-next.1 + - @backstage/plugin-search-backend-node@1.3.9 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-common@1.2.17 + +## @backstage/plugin-search-react@1.8.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/theme@0.6.4 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-search-common@1.2.17 + +## @backstage/plugin-signals@0.0.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/theme@0.6.4 + - @backstage/types@1.2.1 + - @backstage/plugin-signals-react@0.0.11 + +## @backstage/plugin-techdocs@1.12.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-react@1.2.16-next.0 + - @backstage/core-components@0.17.1-next.0 + - @backstage/integration-react@1.2.6-next.0 + - @backstage/integration@1.16.3-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-auth-react@0.1.14-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/plugin-search-react@1.8.8-next.0 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/theme@0.6.4 + - @backstage/plugin-search-common@1.2.17 + - @backstage/plugin-techdocs-common@0.1.0 + +## @backstage/plugin-techdocs-addons-test-utils@1.0.47-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-react@1.2.16-next.0 + - @backstage/integration-react@1.2.6-next.0 + - @backstage/plugin-techdocs@1.12.5-next.1 + - @backstage/plugin-catalog@1.29.0-next.1 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/plugin-search-react@1.8.8-next.0 + - @backstage/core-app-api@1.16.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/test-utils@1.7.6 + +## @backstage/plugin-techdocs-backend@2.0.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/plugin-techdocs-node@1.13.2-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-backend-module-techdocs@0.4.1-next.1 + - @backstage/plugin-techdocs-common@0.1.0 + +## @backstage/plugin-techdocs-module-addons-contrib@1.1.23-next.0 + +### Patch Changes + +- 9c12a76: Fixed rendering issues in `ReportIssue` addon for unsupported repository types and improved shadow DOM event handling. The addon now properly prevents initialization when encountering unsupported repository types and correctly handles selection events within the shadow DOM. +- Updated dependencies + - @backstage/plugin-techdocs-react@1.2.16-next.0 + - @backstage/core-components@0.17.1-next.0 + - @backstage/integration-react@1.2.6-next.0 + - @backstage/integration@1.16.3-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/core-plugin-api@1.10.5 + +## @backstage/plugin-techdocs-node@1.13.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.15 + - @backstage/plugin-search-common@1.2.17 + - @backstage/plugin-techdocs-common@0.1.0 + +## @backstage/plugin-techdocs-react@1.2.16-next.0 + +### Patch Changes + +- 0e9f7fe: Fix catalog entity docs page not loading due to multiple addons data attachment in the New Frontend System. +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-plugin-api@1.10.5 + - @backstage/version-bridge@1.0.11 + +## @backstage/plugin-user-settings@0.8.21-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-app-api@1.16.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/theme@0.6.4 + - @backstage/types@1.2.1 + - @backstage/plugin-signals-react@0.0.11 + - @backstage/plugin-user-settings-common@0.0.1 + +## @backstage/plugin-user-settings-backend@0.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-signals-node@0.1.18 + - @backstage/plugin-user-settings-common@0.0.1 + +## example-app@0.2.108-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-react@1.2.16-next.0 + - @backstage/plugin-kubernetes@0.12.6-next.1 + - @backstage/canon@0.2.1-next.1 + - @backstage/core-components@0.17.1-next.0 + - @backstage/plugin-catalog-import@0.12.12-next.1 + - @backstage/integration-react@1.2.6-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.23-next.0 + - @backstage/plugin-techdocs@1.12.5-next.1 + - @backstage/app-defaults@1.6.1-next.0 + - @backstage/cli@0.32.0-next.1 + - @backstage/plugin-api-docs@0.12.6-next.1 + - @backstage/plugin-auth-react@0.1.14-next.0 + - @backstage/plugin-catalog@1.29.0-next.1 + - @backstage/plugin-catalog-graph@0.4.18-next.1 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.16-next.1 + - @backstage/plugin-devtools@0.1.26-next.1 + - @backstage/plugin-home@0.8.7-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.24-next.1 + - @backstage/plugin-notifications@0.5.4-next.1 + - @backstage/plugin-org@0.6.38-next.1 + - @backstage/plugin-scaffolder@1.30.0-next.1 + - @backstage/plugin-scaffolder-react@1.15.0-next.1 + - @backstage/plugin-search@1.4.25-next.1 + - @backstage/plugin-search-react@1.8.8-next.0 + - @backstage/plugin-signals@0.0.18-next.0 + - @backstage/plugin-user-settings@0.8.21-next.1 + - @backstage/frontend-app-api@0.11.1-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.16.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/theme@0.6.4 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-permission-react@0.4.32 + - @backstage/plugin-search-common@1.2.17 + +## example-app-next@0.0.22-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-react@1.2.16-next.0 + - @backstage/plugin-kubernetes@0.12.6-next.1 + - @backstage/canon@0.2.1-next.1 + - @backstage/core-components@0.17.1-next.0 + - @backstage/plugin-catalog-import@0.12.12-next.1 + - @backstage/integration-react@1.2.6-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.23-next.0 + - @backstage/plugin-techdocs@1.12.5-next.1 + - @backstage/app-defaults@1.6.1-next.0 + - @backstage/cli@0.32.0-next.1 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-api-docs@0.12.6-next.1 + - @backstage/plugin-app@0.1.8-next.0 + - @backstage/plugin-app-visualizer@0.1.18-next.0 + - @backstage/plugin-auth-react@0.1.14-next.0 + - @backstage/plugin-catalog@1.29.0-next.1 + - @backstage/plugin-catalog-graph@0.4.18-next.1 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.16-next.1 + - @backstage/plugin-home@0.8.7-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.24-next.1 + - @backstage/plugin-notifications@0.5.4-next.1 + - @backstage/plugin-org@0.6.38-next.1 + - @backstage/plugin-scaffolder@1.30.0-next.1 + - @backstage/plugin-scaffolder-react@1.15.0-next.1 + - @backstage/plugin-search@1.4.25-next.1 + - @backstage/plugin-search-react@1.8.8-next.0 + - @backstage/plugin-signals@0.0.18-next.0 + - @backstage/plugin-user-settings@0.8.21-next.1 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/frontend-app-api@0.11.1-next.0 + - @backstage/frontend-defaults@0.2.1-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.16.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/theme@0.6.4 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-permission-react@0.4.32 + - @backstage/plugin-search-common@1.2.17 + +## app-next-example-plugin@0.0.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + +## example-backend@0.0.37-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-notifications-backend@0.5.5-next.0 + - @backstage/plugin-auth-backend@0.24.5-next.1 + - @backstage/plugin-scaffolder-backend@1.32.0-next.1 + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/plugin-catalog-backend@1.32.1-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.2.9-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.6.2-next.1 + - @backstage/plugin-techdocs-backend@2.0.1-next.1 + - @backstage/plugin-auth-backend-module-github-provider@0.3.1 + - @backstage/plugin-signals-backend@0.3.2 + - @backstage/plugin-app-backend@0.5.0 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/plugin-devtools-backend@0.5.4-next.1 + - @backstage/plugin-events-backend@0.5.0 + - @backstage/plugin-kubernetes-backend@0.19.4 + - @backstage/plugin-permission-backend@0.5.55 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/plugin-proxy-backend@0.6.0 + - @backstage/plugin-search-backend@2.0.1-next.1 + - @backstage/plugin-search-backend-node@1.3.9 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-model@1.7.3 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.6 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.6 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.6 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.6 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.9-next.1 + - @backstage/plugin-search-backend-module-catalog@0.3.2 + - @backstage/plugin-search-backend-module-explore@0.3.0 + - @backstage/plugin-search-backend-module-techdocs@0.4.1-next.1 + +## example-backend-legacy@0.2.109-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend-module-gitlab@0.8.2-next.1 + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-auth-backend@0.24.5-next.1 + - @backstage/plugin-scaffolder-backend@1.32.0-next.1 + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/plugin-catalog-backend@1.32.1-next.0 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.8-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.5.8-next.1 + - @backstage/plugin-techdocs-backend@2.0.1-next.1 + - @backstage/plugin-signals-backend@0.3.2 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/plugin-events-backend@0.5.0 + - @backstage/plugin-kubernetes-backend@0.19.4 + - @backstage/plugin-permission-backend@0.5.55 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/plugin-search-backend@2.0.1-next.1 + - @backstage/plugin-search-backend-node@1.3.9 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.6 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.6 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-backend-module-catalog@0.3.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.7.0 + - @backstage/plugin-search-backend-module-explore@0.3.0 + - @backstage/plugin-search-backend-module-pg@0.5.42 + - @backstage/plugin-search-backend-module-techdocs@0.4.1-next.1 + - @backstage/plugin-signals-node@0.1.18 + +## e2e-test@0.2.27-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.6.1-next.1 + - @backstage/cli-common@0.1.15 + - @backstage/errors@1.2.7 + +## @internal/frontend@0.0.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + +## @internal/scaffolder@0.0.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-scaffolder-react@1.15.0-next.1 + +## techdocs-cli-embedded-app@0.2.107-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-react@1.2.16-next.0 + - @backstage/core-components@0.17.1-next.0 + - @backstage/integration-react@1.2.6-next.0 + - @backstage/plugin-techdocs@1.12.5-next.1 + - @backstage/app-defaults@1.6.1-next.0 + - @backstage/cli@0.32.0-next.1 + - @backstage/plugin-catalog@1.29.0-next.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.16.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/test-utils@1.7.6 + - @backstage/theme@0.6.4 + +## @internal/plugin-todo-list@1.0.38-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/core-plugin-api@1.10.5 diff --git a/microsite/blog/2022-10-28-backstagecon-kubecon-2022.mdx b/microsite/blog/2022-10-28-backstagecon-kubecon-2022.mdx index ffc44ed432..92bdbafe05 100644 --- a/microsite/blog/2022-10-28-backstagecon-kubecon-2022.mdx +++ b/microsite/blog/2022-10-28-backstagecon-kubecon-2022.mdx @@ -11,6 +11,8 @@ authorURL: https://www.linkedin.com/in/emmamckeewhite/ What an action-packed and memorable week for the Backstage community meeting up IRL at KubeCon North America 2022 in (unseasonably warm and sunny) Detroit. Let’s see what the community was up to: +{/* truncate */} + ### BackstageCon: A full day of nothing but Backstage ![BackstageCon group](assets/2022-10-28/groupimage.jpg) diff --git a/microsite/data/plugins/renovate-hoster.yaml b/microsite/data/plugins/renovate-hoster.yaml new file mode 100644 index 0000000000..4cf4f65956 --- /dev/null +++ b/microsite/data/plugins/renovate-hoster.yaml @@ -0,0 +1,9 @@ +--- +title: Renovate Hoster +author: secustor +authorUrl: https://github.com/secustor +category: Quality +description: This plugin enables you to host Renovate CLI yourself inside of Backstage and extract data from it. +documentation: https://github.com/secustor/backstage-plugins/tree/main/plugins/renovate +npmPackageName: '@backstage/backstage-plugin-renovate' +addedDate: '2025-03-31' diff --git a/microsite/docusaurus.config.ts b/microsite/docusaurus.config.ts index 87aa68d633..664f6e1e6e 100644 --- a/microsite/docusaurus.config.ts +++ b/microsite/docusaurus.config.ts @@ -123,6 +123,11 @@ const config: Config = { }, blog: { path: 'blog', + // Gets rid of the following: + // Warning: Some blog authors used in "2024-12-18-backstage-wrapped-2024.mdx" are not defined in "authors.yml": + // - {"name":"Patrik Oldsberg, Spotify & Ben Lambert, Spotify","key":null,"page":null} + // Note that we recommend to declare authors once in a "authors.yml" file and reference them by key in blog posts front matter to avoid author info duplication. + onInlineAuthors: 'ignore', }, theme: { customCss: 'src/theme/customTheme.scss', @@ -299,11 +304,6 @@ const config: Config = { themes: ['docusaurus-theme-openapi-docs'], themeConfig: { languageTabs: [ - { - highlight: 'javascript', - language: 'nodejs', - logoClass: 'nodejs', - }, { highlight: 'javascript', language: 'javascript', diff --git a/package.json b/package.json index 083c70e483..677bed6aa1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "root", - "version": "1.37.0", + "version": "1.38.0-next.1", "backstage": { "cli": { "new": { diff --git a/packages/app-defaults/CHANGELOG.md b/packages/app-defaults/CHANGELOG.md index 8c6e57c8a1..bfcbbaa625 100644 --- a/packages/app-defaults/CHANGELOG.md +++ b/packages/app-defaults/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/app-defaults +## 1.6.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/core-app-api@1.16.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/theme@0.6.4 + - @backstage/plugin-permission-react@0.4.32 + ## 1.6.0 ### Minor Changes diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json index 6e2e35020b..86a18fbc83 100644 --- a/packages/app-defaults/package.json +++ b/packages/app-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/app-defaults", - "version": "1.6.0", + "version": "1.6.1-next.0", "description": "Provides the default wiring of a Backstage App", "backstage": { "role": "web-library" diff --git a/packages/app-next-example-plugin/CHANGELOG.md b/packages/app-next-example-plugin/CHANGELOG.md index 47273d1726..9fa3a14221 100644 --- a/packages/app-next-example-plugin/CHANGELOG.md +++ b/packages/app-next-example-plugin/CHANGELOG.md @@ -1,5 +1,13 @@ # app-next-example-plugin +## 0.0.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + ## 0.0.21 ### Patch Changes diff --git a/packages/app-next-example-plugin/package.json b/packages/app-next-example-plugin/package.json index 647f031732..9b659977e4 100644 --- a/packages/app-next-example-plugin/package.json +++ b/packages/app-next-example-plugin/package.json @@ -1,6 +1,6 @@ { "name": "app-next-example-plugin", - "version": "0.0.21", + "version": "0.0.22-next.0", "description": "Backstage internal example plugin", "backstage": { "role": "frontend-plugin", diff --git a/packages/app-next/CHANGELOG.md b/packages/app-next/CHANGELOG.md index d7bdd7fa17..3992221795 100644 --- a/packages/app-next/CHANGELOG.md +++ b/packages/app-next/CHANGELOG.md @@ -1,5 +1,97 @@ # example-app-next +## 0.0.22-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-react@1.2.16-next.0 + - @backstage/plugin-kubernetes@0.12.6-next.1 + - @backstage/canon@0.2.1-next.1 + - @backstage/core-components@0.17.1-next.0 + - @backstage/plugin-catalog-import@0.12.12-next.1 + - @backstage/integration-react@1.2.6-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.23-next.0 + - @backstage/plugin-techdocs@1.12.5-next.1 + - @backstage/app-defaults@1.6.1-next.0 + - @backstage/cli@0.32.0-next.1 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-api-docs@0.12.6-next.1 + - @backstage/plugin-app@0.1.8-next.0 + - @backstage/plugin-app-visualizer@0.1.18-next.0 + - @backstage/plugin-auth-react@0.1.14-next.0 + - @backstage/plugin-catalog@1.29.0-next.1 + - @backstage/plugin-catalog-graph@0.4.18-next.1 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.16-next.1 + - @backstage/plugin-home@0.8.7-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.24-next.1 + - @backstage/plugin-notifications@0.5.4-next.1 + - @backstage/plugin-org@0.6.38-next.1 + - @backstage/plugin-scaffolder@1.30.0-next.1 + - @backstage/plugin-scaffolder-react@1.15.0-next.1 + - @backstage/plugin-search@1.4.25-next.1 + - @backstage/plugin-search-react@1.8.8-next.0 + - @backstage/plugin-signals@0.0.18-next.0 + - @backstage/plugin-user-settings@0.8.21-next.1 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/frontend-app-api@0.11.1-next.0 + - @backstage/frontend-defaults@0.2.1-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.16.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/theme@0.6.4 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-permission-react@0.4.32 + - @backstage/plugin-search-common@1.2.17 + +## 0.0.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.29.0-next.0 + - @backstage/cli@0.32.0-next.0 + - @backstage/canon@0.2.1-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.16-next.0 + - @backstage/plugin-scaffolder-react@1.15.0-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/plugin-scaffolder@1.30.0-next.0 + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/plugin-api-docs@0.12.6-next.0 + - @backstage/plugin-catalog-graph@0.4.18-next.0 + - @backstage/plugin-catalog-import@0.12.12-next.0 + - @backstage/plugin-org@0.6.38-next.0 + - @backstage/plugin-techdocs@1.12.5-next.0 + - @backstage/plugin-user-settings@0.8.21-next.0 + - @backstage/app-defaults@1.6.0 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.16.0 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/frontend-app-api@0.11.0 + - @backstage/frontend-defaults@0.2.0 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/integration-react@1.2.5 + - @backstage/theme@0.6.4 + - @backstage/plugin-app@0.1.7 + - @backstage/plugin-app-visualizer@0.1.17 + - @backstage/plugin-auth-react@0.1.13 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-home@0.8.7-next.0 + - @backstage/plugin-kubernetes@0.12.6-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.24-next.0 + - @backstage/plugin-notifications@0.5.4-next.0 + - @backstage/plugin-permission-react@0.4.32 + - @backstage/plugin-search@1.4.25-next.0 + - @backstage/plugin-search-common@1.2.17 + - @backstage/plugin-search-react@1.8.7 + - @backstage/plugin-signals@0.0.17 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.22 + - @backstage/plugin-techdocs-react@1.2.15 + ## 0.0.21 ### Patch Changes diff --git a/packages/app-next/package.json b/packages/app-next/package.json index fd78b59760..4ed02cead6 100644 --- a/packages/app-next/package.json +++ b/packages/app-next/package.json @@ -1,6 +1,6 @@ { "name": "example-app-next", - "version": "0.0.21", + "version": "0.0.22-next.1", "backstage": { "role": "frontend" }, diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index a7fbce0cf7..c8182998a0 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,89 @@ # example-app +## 0.2.108-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-react@1.2.16-next.0 + - @backstage/plugin-kubernetes@0.12.6-next.1 + - @backstage/canon@0.2.1-next.1 + - @backstage/core-components@0.17.1-next.0 + - @backstage/plugin-catalog-import@0.12.12-next.1 + - @backstage/integration-react@1.2.6-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.23-next.0 + - @backstage/plugin-techdocs@1.12.5-next.1 + - @backstage/app-defaults@1.6.1-next.0 + - @backstage/cli@0.32.0-next.1 + - @backstage/plugin-api-docs@0.12.6-next.1 + - @backstage/plugin-auth-react@0.1.14-next.0 + - @backstage/plugin-catalog@1.29.0-next.1 + - @backstage/plugin-catalog-graph@0.4.18-next.1 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.16-next.1 + - @backstage/plugin-devtools@0.1.26-next.1 + - @backstage/plugin-home@0.8.7-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.24-next.1 + - @backstage/plugin-notifications@0.5.4-next.1 + - @backstage/plugin-org@0.6.38-next.1 + - @backstage/plugin-scaffolder@1.30.0-next.1 + - @backstage/plugin-scaffolder-react@1.15.0-next.1 + - @backstage/plugin-search@1.4.25-next.1 + - @backstage/plugin-search-react@1.8.8-next.0 + - @backstage/plugin-signals@0.0.18-next.0 + - @backstage/plugin-user-settings@0.8.21-next.1 + - @backstage/frontend-app-api@0.11.1-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.16.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/theme@0.6.4 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-permission-react@0.4.32 + - @backstage/plugin-search-common@1.2.17 + +## 0.2.108-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.29.0-next.0 + - @backstage/cli@0.32.0-next.0 + - @backstage/canon@0.2.1-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.16-next.0 + - @backstage/plugin-scaffolder-react@1.15.0-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/plugin-scaffolder@1.30.0-next.0 + - @backstage/plugin-api-docs@0.12.6-next.0 + - @backstage/plugin-catalog-graph@0.4.18-next.0 + - @backstage/plugin-catalog-import@0.12.12-next.0 + - @backstage/plugin-org@0.6.38-next.0 + - @backstage/plugin-techdocs@1.12.5-next.0 + - @backstage/plugin-user-settings@0.8.21-next.0 + - @backstage/app-defaults@1.6.0 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.16.0 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/frontend-app-api@0.11.0 + - @backstage/integration-react@1.2.5 + - @backstage/theme@0.6.4 + - @backstage/plugin-auth-react@0.1.13 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-devtools@0.1.26-next.0 + - @backstage/plugin-home@0.8.7-next.0 + - @backstage/plugin-kubernetes@0.12.6-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.24-next.0 + - @backstage/plugin-notifications@0.5.4-next.0 + - @backstage/plugin-permission-react@0.4.32 + - @backstage/plugin-search@1.4.25-next.0 + - @backstage/plugin-search-common@1.2.17 + - @backstage/plugin-search-react@1.8.7 + - @backstage/plugin-signals@0.0.17 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.22 + - @backstage/plugin-techdocs-react@1.2.15 + ## 0.2.107 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index ce8f4b8482..1c1b9d481c 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "example-app", - "version": "0.2.107", + "version": "0.2.108-next.1", "backstage": { "role": "frontend" }, diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md index 81b70c541e..eb985f5e2d 100644 --- a/packages/backend-defaults/CHANGELOG.md +++ b/packages/backend-defaults/CHANGELOG.md @@ -1,5 +1,47 @@ # @backstage/backend-defaults +## 0.9.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/backend-app-api@1.2.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/backend-dev-utils@0.1.5 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/cli-node@0.2.13 + - @backstage/config@1.3.2 + - @backstage/config-loader@1.10.0 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.15 + - @backstage/types@1.2.1 + - @backstage/plugin-events-node@0.4.9 + +## 0.9.0-next.0 + +### Minor Changes + +- 01edf6e: Allow pass through of redis client and cluster options to Cache core service + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@1.2.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/backend-dev-utils@0.1.5 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/cli-node@0.2.13 + - @backstage/config@1.3.2 + - @backstage/config-loader@1.10.0 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + - @backstage/integration-aws-node@0.1.15 + - @backstage/types@1.2.1 + - @backstage/plugin-events-node@0.4.9 + ## 0.8.2 ### Patch Changes diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 1318d57d42..0ea0bdde5d 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-defaults", - "version": "0.8.2", + "version": "0.9.0-next.1", "description": "Backend defaults used by Backstage backend apps", "backstage": { "role": "node-library" diff --git a/packages/backend-dynamic-feature-service/CHANGELOG.md b/packages/backend-dynamic-feature-service/CHANGELOG.md index 59e4342757..503d7a59ce 100644 --- a/packages/backend-dynamic-feature-service/CHANGELOG.md +++ b/packages/backend-dynamic-feature-service/CHANGELOG.md @@ -1,5 +1,53 @@ # @backstage/backend-dynamic-feature-service +## 0.6.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/plugin-catalog-backend@1.32.1-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/plugin-events-backend@0.5.0 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/plugin-search-backend-node@1.3.9 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/cli-common@0.1.15 + - @backstage/cli-node@0.2.13 + - @backstage/config@1.3.2 + - @backstage/config-loader@1.10.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-app-node@0.1.31 + - @backstage/plugin-events-node@0.4.9 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-common@1.2.17 + +## 0.6.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/plugin-catalog-backend@1.32.0 + - @backstage/plugin-events-backend@0.5.0 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/plugin-search-backend-node@1.3.9 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/cli-common@0.1.15 + - @backstage/cli-node@0.2.13 + - @backstage/config@1.3.2 + - @backstage/config-loader@1.10.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-app-node@0.1.31 + - @backstage/plugin-events-node@0.4.9 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-common@1.2.17 + ## 0.6.1 ### Patch Changes diff --git a/packages/backend-dynamic-feature-service/package.json b/packages/backend-dynamic-feature-service/package.json index 33cc595286..f6640811be 100644 --- a/packages/backend-dynamic-feature-service/package.json +++ b/packages/backend-dynamic-feature-service/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-dynamic-feature-service", - "version": "0.6.1", + "version": "0.6.2-next.1", "description": "Backstage dynamic feature service", "backstage": { "role": "node-library" diff --git a/packages/backend-legacy/CHANGELOG.md b/packages/backend-legacy/CHANGELOG.md index 5dc4eced46..7d7f15a266 100644 --- a/packages/backend-legacy/CHANGELOG.md +++ b/packages/backend-legacy/CHANGELOG.md @@ -1,5 +1,81 @@ # example-backend-legacy +## 0.2.109-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend-module-gitlab@0.8.2-next.1 + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-auth-backend@0.24.5-next.1 + - @backstage/plugin-scaffolder-backend@1.32.0-next.1 + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/plugin-catalog-backend@1.32.1-next.0 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.8-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.5.8-next.1 + - @backstage/plugin-techdocs-backend@2.0.1-next.1 + - @backstage/plugin-signals-backend@0.3.2 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/plugin-events-backend@0.5.0 + - @backstage/plugin-kubernetes-backend@0.19.4 + - @backstage/plugin-permission-backend@0.5.55 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/plugin-search-backend@2.0.1-next.1 + - @backstage/plugin-search-backend-node@1.3.9 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.6 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.6 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-backend-module-catalog@0.3.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.7.0 + - @backstage/plugin-search-backend-module-explore@0.3.0 + - @backstage/plugin-search-backend-module-pg@0.5.42 + - @backstage/plugin-search-backend-module-techdocs@0.4.1-next.1 + - @backstage/plugin-signals-node@0.1.18 + +## 0.2.109-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/plugin-scaffolder-backend@1.32.0-next.0 + - @backstage/plugin-auth-backend@0.24.5-next.0 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/plugin-catalog-backend@1.32.0 + - @backstage/plugin-events-backend@0.5.0 + - @backstage/plugin-kubernetes-backend@0.19.4 + - @backstage/plugin-permission-backend@0.5.55 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/plugin-search-backend@2.0.1-next.0 + - @backstage/plugin-search-backend-node@1.3.9 + - @backstage/plugin-signals-backend@0.3.2 + - @backstage/plugin-techdocs-backend@2.0.1-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.4.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/integration@1.16.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.6 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.6 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.8-next.0 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.8.2-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.5.8-next.0 + - @backstage/plugin-search-backend-module-catalog@0.3.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.7.0 + - @backstage/plugin-search-backend-module-explore@0.3.0 + - @backstage/plugin-search-backend-module-pg@0.5.42 + - @backstage/plugin-signals-node@0.1.18 + ## 0.2.108 ### Patch Changes diff --git a/packages/backend-legacy/package.json b/packages/backend-legacy/package.json index 90430aa4a8..08c94e950e 100644 --- a/packages/backend-legacy/package.json +++ b/packages/backend-legacy/package.json @@ -1,6 +1,6 @@ { "name": "example-backend-legacy", - "version": "0.2.108", + "version": "0.2.109-next.1", "backstage": { "role": "backend" }, diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md index 793a0ecb4d..c941fc5287 100644 --- a/packages/backend-test-utils/CHANGELOG.md +++ b/packages/backend-test-utils/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/backend-test-utils +## 1.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/backend-app-api@1.2.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-events-node@0.4.9 + +## 1.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/backend-app-api@1.2.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-events-node@0.4.9 + ## 1.3.1 ### Patch Changes diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index 17f5d8fad1..42b9f733e4 100644 --- a/packages/backend-test-utils/package.json +++ b/packages/backend-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-test-utils", - "version": "1.3.1", + "version": "1.3.2-next.1", "description": "Test helpers library for Backstage backends", "backstage": { "role": "node-library" diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index d60080901c..5f0c932f6a 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,81 @@ # example-backend +## 0.0.37-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-notifications-backend@0.5.5-next.0 + - @backstage/plugin-auth-backend@0.24.5-next.1 + - @backstage/plugin-scaffolder-backend@1.32.0-next.1 + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/plugin-catalog-backend@1.32.1-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.2.9-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.6.2-next.1 + - @backstage/plugin-techdocs-backend@2.0.1-next.1 + - @backstage/plugin-auth-backend-module-github-provider@0.3.1 + - @backstage/plugin-signals-backend@0.3.2 + - @backstage/plugin-app-backend@0.5.0 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/plugin-devtools-backend@0.5.4-next.1 + - @backstage/plugin-events-backend@0.5.0 + - @backstage/plugin-kubernetes-backend@0.19.4 + - @backstage/plugin-permission-backend@0.5.55 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/plugin-proxy-backend@0.6.0 + - @backstage/plugin-search-backend@2.0.1-next.1 + - @backstage/plugin-search-backend-node@1.3.9 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-model@1.7.3 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.6 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.6 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.6 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.6 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.9-next.1 + - @backstage/plugin-search-backend-module-catalog@0.3.2 + - @backstage/plugin-search-backend-module-explore@0.3.0 + - @backstage/plugin-search-backend-module-techdocs@0.4.1-next.1 + +## 0.0.37-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.6.2-next.0 + - @backstage/plugin-scaffolder-backend@1.32.0-next.0 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.9-next.0 + - @backstage/plugin-app-backend@0.5.0 + - @backstage/plugin-auth-backend@0.24.5-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.3.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/plugin-catalog-backend@1.32.0 + - @backstage/plugin-devtools-backend@0.5.4-next.0 + - @backstage/plugin-events-backend@0.5.0 + - @backstage/plugin-kubernetes-backend@0.19.4 + - @backstage/plugin-notifications-backend@0.5.4 + - @backstage/plugin-permission-backend@0.5.55 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/plugin-proxy-backend@0.6.0 + - @backstage/plugin-search-backend@2.0.1-next.0 + - @backstage/plugin-search-backend-node@1.3.9 + - @backstage/plugin-signals-backend@0.3.2 + - @backstage/plugin-techdocs-backend@2.0.1-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.4.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-model@1.7.3 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.6 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.0 + - @backstage/plugin-catalog-backend-module-openapi@0.2.8 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.6 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.6 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.6 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-backend-module-catalog@0.3.2 + - @backstage/plugin-search-backend-module-explore@0.3.0 + ## 0.0.36 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index 47ffbf0ece..d6b9ef7be6 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "example-backend", - "version": "0.0.36", + "version": "0.0.37-next.1", "backstage": { "role": "backend" }, diff --git a/packages/canon/.storybook/manager.ts b/packages/canon/.storybook/manager.ts deleted file mode 100644 index c88b10b392..0000000000 --- a/packages/canon/.storybook/manager.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { addons } from '@storybook/manager-api'; -import { create } from '@storybook/theming'; - -const theme = create({ - base: 'light', - brandTitle: 'Canon', - brandImage: 'logo.svg', -}); - -addons.setConfig({ - theme, -}); diff --git a/packages/canon/CHANGELOG.md b/packages/canon/CHANGELOG.md index 87a8dd4265..7f828dea4e 100644 --- a/packages/canon/CHANGELOG.md +++ b/packages/canon/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/canon +## 0.2.1-next.1 + +### Patch Changes + +- f7cb538: Internal refactor and fixes to the prop extraction logic for layout components. +- 5e80f0b: Fix types on the Icon component. + +## 0.2.1-next.0 + +### Patch Changes + +- 6af7b16: Updated styles for the Menu component in Canon. +- 513477f: Add global CSS reset for anchor tags. +- 05a5003: Fix the Icon component when the name is not found to return null instead of an empty SVG. + ## 0.2.0 ### Minor Changes diff --git a/packages/canon/css/core.css b/packages/canon/css/core.css index 34e447147e..b4583ea35d 100644 --- a/packages/canon/css/core.css +++ b/packages/canon/css/core.css @@ -9083,6 +9083,11 @@ } } +:where(a) { + color: inherit; + text-decoration: none; +} + :root { --canon-font-regular: system-ui; --canon-font-monospace: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace; diff --git a/packages/canon/css/styles.css b/packages/canon/css/styles.css index 799a1babbc..7289562f9d 100644 --- a/packages/canon/css/styles.css +++ b/packages/canon/css/styles.css @@ -9083,6 +9083,11 @@ } } +:where(a) { + color: inherit; + text-decoration: none; +} + :root { --canon-font-regular: system-ui; --canon-font-monospace: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace; diff --git a/packages/canon/package.json b/packages/canon/package.json index 5227e63fa5..e3a2918ef5 100644 --- a/packages/canon/package.json +++ b/packages/canon/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/canon", - "version": "0.2.0", + "version": "0.2.1-next.1", "backstage": { "role": "web-library" }, @@ -36,7 +36,7 @@ "lint": "backstage-cli package lint", "prepack": "backstage-cli package prepack", "postpack": "backstage-cli package postpack", - "start": "yarn build:css:watch && yarn storybook", + "start": "concurrently \"yarn build:css:watch\" \"yarn storybook\"", "storybook": "storybook dev -p 6006", "test": "backstage-cli package test" }, @@ -47,15 +47,15 @@ }, "devDependencies": { "@backstage/cli": "workspace:^", - "@storybook/addon-essentials": "^8.6.4", - "@storybook/addon-interactions": "^8.6.4", + "@storybook/addon-essentials": "^8.6.8", + "@storybook/addon-interactions": "^8.6.8", "@storybook/addon-styling-webpack": "^1.0.1", - "@storybook/addon-themes": "^8.6.4", - "@storybook/addon-webpack5-compiler-swc": "^2.1.0", - "@storybook/blocks": "^8.6.4", - "@storybook/react": "^8.6.4", - "@storybook/react-webpack5": "^8.6.4", - "@storybook/test": "^8.6.4", + "@storybook/addon-themes": "^8.6.8", + "@storybook/addon-webpack5-compiler-swc": "^3.0.0", + "@storybook/blocks": "^8.6.8", + "@storybook/react": "^8.6.8", + "@storybook/react-webpack5": "^8.6.8", + "@storybook/test": "^8.6.8", "@testing-library/jest-dom": "^6.0.0", "@types/react": "^18.0.0", "@types/react-dom": "^18.0.0", @@ -68,7 +68,7 @@ "react": "^18.0.2", "react-dom": "^18.0.2", "react-router-dom": "^6.3.0", - "storybook": "^8.6.4" + "storybook": "^8.6.8" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", diff --git a/packages/canon/report.api.md b/packages/canon/report.api.md index e3d55339ea..6dfbc59ffb 100644 --- a/packages/canon/report.api.md +++ b/packages/canon/report.api.md @@ -13,6 +13,7 @@ import { default as React_2 } from 'react'; import * as React_3 from 'react'; import { ReactNode } from 'react'; import { RefAttributes } from 'react'; +import type { RemixiconComponentType } from '@remixicon/react'; import { ScrollArea as ScrollArea_2 } from '@base-ui-components/react/scroll-area'; import { Tooltip as Tooltip_2 } from '@base-ui-components/react/tooltip'; @@ -636,7 +637,7 @@ export interface IconContextProps { } // @public (undocumented) -export type IconMap = Partial>; +export type IconMap = Partial>; // @public (undocumented) export type IconNames = @@ -711,7 +712,7 @@ export interface IconProviderProps { // (undocumented) children?: ReactNode; // (undocumented) - overrides?: Partial>; + overrides?: Partial>; } // @public (undocumented) diff --git a/packages/canon/src/components/Flex/Flex.stories.tsx b/packages/canon/src/components/Flex/Flex.stories.tsx index 3b7a7a07c5..58f96ce157 100644 --- a/packages/canon/src/components/Flex/Flex.stories.tsx +++ b/packages/canon/src/components/Flex/Flex.stories.tsx @@ -61,21 +61,33 @@ const DecorativeBox = () => { export const Default: Story = { args: { - children: [, , ], + children: ( + <> + , , + + ), }, }; export const ColumnDirection: Story = { args: { direction: 'column', - children: [, , ], + children: ( + <> + , , + + ), }, }; export const RowDirection: Story = { args: { direction: 'row', - children: [, , ], + children: ( + <> + , , + + ), }, }; diff --git a/packages/canon/src/components/Heading/Heading.stories.tsx b/packages/canon/src/components/Heading/Heading.stories.tsx index 1357bde877..d568bcaf7f 100644 --- a/packages/canon/src/components/Heading/Heading.stories.tsx +++ b/packages/canon/src/components/Heading/Heading.stories.tsx @@ -18,7 +18,6 @@ import React from 'react'; import type { Meta, StoryObj } from '@storybook/react'; import { Heading } from './Heading'; import { Flex } from '../Flex'; -import { Text } from '../Text'; const meta = { title: 'Components/Heading', @@ -42,7 +41,7 @@ export const Title1: Story = { export const AllVariants: Story = { render: () => ( - + Display Title 1 Title 2 @@ -68,10 +67,22 @@ export const CustomTag: Story = { }, }; +export const WrappedInLink: Story = { + args: { + ...Default.args, + }, + decorators: [ + Story => ( + + + + ), + ], +}; + export const Playground: Story = { render: () => ( - - All variants + Display Title 1 Title 2 diff --git a/packages/canon/src/components/Icon/icons.ts b/packages/canon/src/components/Icon/icons.ts index 8cc862459c..615c918db7 100644 --- a/packages/canon/src/components/Icon/icons.ts +++ b/packages/canon/src/components/Icon/icons.ts @@ -130,4 +130,4 @@ export const icons: IconMap = { youtube: RiYoutubeLine, 'zoom-in': RiZoomInLine, 'zoom-out': RiZoomOutLine, -}; +} as const; diff --git a/packages/canon/src/components/Icon/types.ts b/packages/canon/src/components/Icon/types.ts index 5cbdb8e147..4870a1afc4 100644 --- a/packages/canon/src/components/Icon/types.ts +++ b/packages/canon/src/components/Icon/types.ts @@ -15,6 +15,7 @@ */ import { ReactNode } from 'react'; +import type { RemixiconComponentType } from '@remixicon/react'; /** @public */ export type IconNames = @@ -74,7 +75,7 @@ export type IconNames = | 'zoom-out'; /** @public */ -export type IconMap = Partial>; +export type IconMap = Partial>; /** @public */ export type IconProps = { @@ -92,5 +93,5 @@ export interface IconContextProps { /** @public */ export interface IconProviderProps { children?: ReactNode; - overrides?: Partial>; + overrides?: Partial>; } diff --git a/packages/canon/src/components/Text/Text.stories.tsx b/packages/canon/src/components/Text/Text.stories.tsx index 9cf2a73f6e..ab904f524c 100644 --- a/packages/canon/src/components/Text/Text.stories.tsx +++ b/packages/canon/src/components/Text/Text.stories.tsx @@ -89,6 +89,19 @@ export const Responsive: Story = { }, }; +export const WrappedInLink: Story = { + args: { + ...Default.args, + }, + decorators: [ + Story => ( + + + + ), + ], +}; + export const Playground: Story = { render: () => ( diff --git a/packages/canon/src/css/core.css b/packages/canon/src/css/core.css index 8efb066b70..d0686e94f7 100644 --- a/packages/canon/src/css/core.css +++ b/packages/canon/src/css/core.css @@ -18,8 +18,13 @@ @import './normalize.css'; @import './utilities.css'; -/* Light theme tokens */ +/* Global reset */ +:where(a) { + color: inherit; + text-decoration: none; +} +/* Light theme tokens */ :root { /* Font families */ --canon-font-regular: system-ui; diff --git a/packages/canon/src/utils/extractProps.ts b/packages/canon/src/utils/extractProps.ts index 8631f4e228..1668117909 100644 --- a/packages/canon/src/utils/extractProps.ts +++ b/packages/canon/src/utils/extractProps.ts @@ -14,6 +14,16 @@ * limitations under the License. */ +type BasePropDef = { + type: string; + values?: readonly unknown[]; + default?: unknown; + required?: boolean; + className?: string; + responsive?: true; + customProperties?: string[]; +}; + export function extractProps( props: { className?: string; @@ -22,45 +32,53 @@ export function extractProps( as?: keyof JSX.IntrinsicElements; [key: string]: any; }, - propDefs: { [key: string]: any }, + propDefs: { [name in string]: BasePropDef }, ) { let className: string[] = (props.className || '').split(' '); let style: React.CSSProperties = { ...props.style }; - const hasProp = (key: string) => props.hasOwnProperty(key); for (const key in propDefs) { + const propDef = propDefs[key]; + // Check if the prop is present or has a default value - if (!hasProp(key) && !propDefs[key].hasOwnProperty('default')) { + if (!Object.hasOwn(props, key) && !propDef.hasOwnProperty('default')) { continue; // Skip processing if neither is present } - const value = hasProp(key) ? props[key] : propDefs[key].default; - const propDefsValues = propDefs[key].values; - const propDefsCustomProperties = propDefs[key].customProperties; - const propDefsClassName = propDefs[key].className; - const isResponsive = propDefs[key].responsive; + const value = Object.hasOwn(props, key) + ? (props[key] as unknown) + : propDefs[key].default; + const propDefsValues = propDef.values; + const propDefsCustomProperties = propDef.customProperties; + const propDefsClassName = propDef.className; + const isResponsive = propDef.responsive; - const handleValue = (val: string, prefix: string = '') => { + const handleValue = (val: unknown, prefix: string = '') => { // Skip adding class name if the key is "as" if (key === 'as') return; - if (propDefsValues.includes(val)) { + if (propDefsValues?.includes(val)) { className.push(`${prefix}${propDefsClassName}-${val}`); } else { - const customPropertyKey = - isResponsive && prefix - ? `${propDefsCustomProperties}-${prefix.slice(0, -1)}` - : propDefsCustomProperties; - (style as any)[customPropertyKey] = val; + if (propDefsCustomProperties) { + for (const customProperty of propDefsCustomProperties) { + const customPropertyKey = + isResponsive && prefix + ? `${customProperty}-${prefix.slice(0, -1)}` + : customProperty; + style[customPropertyKey as keyof typeof style] = val as any; + } + } className.push(`${prefix}${propDefsClassName}`); } }; - if (isResponsive && typeof value === 'object') { + if (isResponsive && typeof value === 'object' && value !== null) { + const breakpointValues = value as { [key: string]: unknown }; // Handle responsive object values - for (const breakpoint in value) { + for (const breakpoint in breakpointValues) { const prefix = breakpoint === 'initial' ? '' : `${breakpoint}:`; - handleValue(value[breakpoint], prefix); + handleValue(breakpointValues[breakpoint], prefix); } } else { handleValue(value); diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 0a4c7f2e77..688cb7d461 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,44 @@ # @backstage/cli +## 0.32.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/cli-common@0.1.15 + - @backstage/cli-node@0.2.13 + - @backstage/config@1.3.2 + - @backstage/config-loader@1.10.0 + - @backstage/errors@1.2.7 + - @backstage/eslint-plugin@0.1.10 + - @backstage/release-manifests@0.0.12 + - @backstage/types@1.2.1 + +## 0.32.0-next.0 + +### Minor Changes + +- c7254ae: Internal update to move the `clean`, `pre/postpack` and `fix` commands into their own separate module. + +### Patch Changes + +- 4ea76f7: Bump @module-federation/enhanced ^0.9.0 to fix GHSA-593f-38f6-jp5m +- 87a5cb4: Fixed an issue causing the `repo lint` command to fail when the `--max-warnings` option was used. +- d83f3f4: Resolved a problem where the `start` command did not correctly handle multiple `--require` flags, ensuring all specified modules are now properly loaded. +- Updated dependencies + - @backstage/catalog-model@1.7.3 + - @backstage/cli-common@0.1.15 + - @backstage/cli-node@0.2.13 + - @backstage/config@1.3.2 + - @backstage/config-loader@1.10.0 + - @backstage/errors@1.2.7 + - @backstage/eslint-plugin@0.1.10 + - @backstage/integration@1.16.2 + - @backstage/release-manifests@0.0.12 + - @backstage/types@1.2.1 + ## 0.31.0 ### Minor Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 5077e28e79..8f3f1764c6 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli", - "version": "0.31.0", + "version": "0.32.0-next.1", "description": "CLI for developing Backstage plugins and apps", "backstage": { "role": "cli" diff --git a/packages/core-compat-api/CHANGELOG.md b/packages/core-compat-api/CHANGELOG.md index 4884e0a184..bd1a001ad1 100644 --- a/packages/core-compat-api/CHANGELOG.md +++ b/packages/core-compat-api/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/core-compat-api +## 0.4.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/core-plugin-api@1.10.5 + - @backstage/version-bridge@1.0.11 + +## 0.4.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/version-bridge@1.0.11 + ## 0.4.0 ### Minor Changes diff --git a/packages/core-compat-api/package.json b/packages/core-compat-api/package.json index eb1fd98ccc..4a7e2d965e 100644 --- a/packages/core-compat-api/package.json +++ b/packages/core-compat-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/core-compat-api", - "version": "0.4.0", + "version": "0.4.1-next.1", "backstage": { "role": "web-library" }, diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md index abc025ceb0..e5ee43c202 100644 --- a/packages/core-components/CHANGELOG.md +++ b/packages/core-components/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/core-components +## 0.17.1-next.0 + +### Patch Changes + +- 5d7bad4: Fixed the messaging in the `AlertDisplay` where it was claiming that there were older messages available rather than newer. +- Updated dependencies + - @backstage/config@1.3.2 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/theme@0.6.4 + - @backstage/version-bridge@1.0.11 + ## 0.17.0 ### Minor Changes diff --git a/packages/core-components/package.json b/packages/core-components/package.json index 8e7ac24c96..8c116f2a0f 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/core-components", - "version": "0.17.0", + "version": "0.17.1-next.0", "description": "Core components used by Backstage plugins and apps", "backstage": { "role": "web-library" diff --git a/packages/core-components/report-alpha.api.md b/packages/core-components/report-alpha.api.md index 158f9fe14a..73b4194266 100644 --- a/packages/core-components/report-alpha.api.md +++ b/packages/core-components/report-alpha.api.md @@ -55,8 +55,8 @@ export const coreComponentsTranslationRef: TranslationRef< readonly 'oauthRequestDialog.rejectAll': 'Reject All'; readonly 'supportButton.title': 'Support'; readonly 'supportButton.close': 'Close'; - readonly 'alertDisplay.message_one': '({{ count }} older message)'; - readonly 'alertDisplay.message_other': '({{ count }} older messages)'; + readonly 'alertDisplay.message_one': '({{ count }} newer message)'; + readonly 'alertDisplay.message_other': '({{ count }} newer messages)'; readonly 'autoLogout.stillTherePrompt.title': 'Logging out due to inactivity'; readonly 'autoLogout.stillTherePrompt.buttonText': "Yes! Don't log me out"; readonly 'proxiedSignInPage.title': 'You do not appear to be signed in. Please try reloading the browser page.'; diff --git a/packages/core-components/src/components/AlertDisplay/AlertDisplay.test.tsx b/packages/core-components/src/components/AlertDisplay/AlertDisplay.test.tsx index b75f773f90..f2f904a3e0 100644 --- a/packages/core-components/src/components/AlertDisplay/AlertDisplay.test.tsx +++ b/packages/core-components/src/components/AlertDisplay/AlertDisplay.test.tsx @@ -92,7 +92,7 @@ describe('', () => { , ); - expect(screen.getByText('(2 older messages)')).toBeInTheDocument(); + expect(screen.getByText('(2 newer messages)')).toBeInTheDocument(); }); }); @@ -189,19 +189,19 @@ describe('', () => { jest.advanceTimersByTime(1000); }); expect(queryByText('transient message one')).toBeInTheDocument(); - expect(queryByText('(1 older message)')).toBeInTheDocument(); + expect(queryByText('(1 newer message)')).toBeInTheDocument(); act(() => { jest.advanceTimersByTime(1000); }); expect(queryByText('transient message one')).toBeInTheDocument(); - expect(queryByText('(2 older messages)')).toBeInTheDocument(); + expect(queryByText('(2 newer messages)')).toBeInTheDocument(); // Validate removing messages act(() => { jest.advanceTimersByTime(5000); }); expect(queryByText('transient message two')).toBeInTheDocument(); - expect(queryByText('(1 older message)')).toBeInTheDocument(); + expect(queryByText('(1 newer message)')).toBeInTheDocument(); act(() => { jest.advanceTimersByTime(5000); @@ -231,12 +231,12 @@ describe('', () => { // 1s in, message 1 still shown, message 2 added in background act(() => jest.advanceTimersByTime(1000)); expect(queryByText('transient message one')).toBeInTheDocument(); - expect(queryByText('(1 older message)')).toBeInTheDocument(); + expect(queryByText('(1 newer message)')).toBeInTheDocument(); // 2s in, message 2 now shown, message 3 added act(() => jest.advanceTimersByTime(1000)); expect(queryByText('transient message two')).toBeInTheDocument(); - expect(queryByText('(1 older message)')).toBeInTheDocument(); + expect(queryByText('(1 newer message)')).toBeInTheDocument(); // 3.5s in, message 3 now shown act(() => jest.advanceTimersByTime(1500)); @@ -264,7 +264,7 @@ describe('', () => { // 1s in, message 1 still shown, message 2 added in background act(() => jest.advanceTimersByTime(1000)); expect(queryByText('transient message one')).toBeInTheDocument(); - expect(queryByText('(1 older message)')).toBeInTheDocument(); + expect(queryByText('(1 newer message)')).toBeInTheDocument(); // manually remove message 1 fireEvent.click(screen.getByTestId('error-button-close')); @@ -273,7 +273,7 @@ describe('', () => { // 2s in, message 2 now shown, message 3 added act(() => jest.advanceTimersByTime(1000)); expect(queryByText('transient message two')).toBeInTheDocument(); - expect(queryByText('(1 older message)')).toBeInTheDocument(); + expect(queryByText('(1 newer message)')).toBeInTheDocument(); // 3s in, message 3 now shown act(() => jest.advanceTimersByTime(1500)); @@ -330,19 +330,19 @@ describe('', () => { jest.advanceTimersByTime(1000); }); expect(queryByText('transient message one')).toBeInTheDocument(); - expect(queryByText('(1 older message)')).toBeInTheDocument(); + expect(queryByText('(1 newer message)')).toBeInTheDocument(); act(() => { jest.advanceTimersByTime(1000); }); expect(queryByText('transient message one')).toBeInTheDocument(); - expect(queryByText('(2 older messages)')).toBeInTheDocument(); + expect(queryByText('(2 newer messages)')).toBeInTheDocument(); // Validate removing messages act(() => { jest.advanceTimersByTime(5000); }); expect(queryByText('permanent message')).toBeInTheDocument(); - expect(queryByText('(1 older message)')).toBeInTheDocument(); + expect(queryByText('(1 newer message)')).toBeInTheDocument(); fireEvent.click(screen.getByTestId('error-button-close')); expect(queryByText('transient message three')).toBeInTheDocument(); diff --git a/packages/core-components/src/translation.ts b/packages/core-components/src/translation.ts index 13bd62bab8..40b6e94798 100644 --- a/packages/core-components/src/translation.ts +++ b/packages/core-components/src/translation.ts @@ -106,8 +106,8 @@ export const coreComponentsTranslationRef = createTranslationRef({ }, }, alertDisplay: { - message_one: '({{ count }} older message)', - message_other: '({{ count }} older messages)', + message_one: '({{ count }} newer message)', + message_other: '({{ count }} newer messages)', }, autoLogout: { stillTherePrompt: { diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index 375b0bde56..51f090a9ff 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/create-app +## 0.6.1-next.1 + +### Patch Changes + +- Bumped create-app version. +- Updated dependencies + - @backstage/cli-common@0.1.15 + +## 0.6.1-next.0 + +### Patch Changes + +- Bumped create-app version. +- Updated dependencies + - @backstage/cli-common@0.1.15 + ## 0.6.0 ### Minor Changes diff --git a/packages/create-app/package.json b/packages/create-app/package.json index 0d9fb381a3..c28c9d15af 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/create-app", - "version": "0.6.0", + "version": "0.6.1-next.1", "description": "A CLI that helps you create your own Backstage app", "backstage": { "role": "cli" diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md index 82330fd76c..74b15acdef 100644 --- a/packages/dev-utils/CHANGELOG.md +++ b/packages/dev-utils/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/dev-utils +## 1.1.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/integration-react@1.2.6-next.0 + - @backstage/app-defaults@1.6.1-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-app-api@1.16.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/theme@0.6.4 + +## 1.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/app-defaults@1.6.0 + - @backstage/catalog-model@1.7.3 + - @backstage/core-app-api@1.16.0 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/integration-react@1.2.5 + - @backstage/theme@0.6.4 + ## 1.1.8 ### Patch Changes diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index 0bd88f0a26..707f757302 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/dev-utils", - "version": "1.1.8", + "version": "1.1.9-next.1", "description": "Utilities for developing Backstage plugins.", "backstage": { "role": "web-library" diff --git a/packages/e2e-test/CHANGELOG.md b/packages/e2e-test/CHANGELOG.md index 423070e648..1b7cec336c 100644 --- a/packages/e2e-test/CHANGELOG.md +++ b/packages/e2e-test/CHANGELOG.md @@ -1,5 +1,23 @@ # e2e-test +## 0.2.27-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.6.1-next.1 + - @backstage/cli-common@0.1.15 + - @backstage/errors@1.2.7 + +## 0.2.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.6.1-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/errors@1.2.7 + ## 0.2.26 ### Patch Changes diff --git a/packages/e2e-test/package.json b/packages/e2e-test/package.json index f76a5770d3..efdf10897f 100644 --- a/packages/e2e-test/package.json +++ b/packages/e2e-test/package.json @@ -1,6 +1,6 @@ { "name": "e2e-test", - "version": "0.2.26", + "version": "0.2.27-next.1", "description": "E2E test for verifying Backstage packages", "backstage": { "role": "cli" diff --git a/packages/frontend-app-api/CHANGELOG.md b/packages/frontend-app-api/CHANGELOG.md index 5247564adc..f1b202a135 100644 --- a/packages/frontend-app-api/CHANGELOG.md +++ b/packages/frontend-app-api/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/frontend-app-api +## 0.11.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/frontend-defaults@0.2.1-next.0 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.16.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + ## 0.11.0 ### Minor Changes diff --git a/packages/frontend-app-api/package.json b/packages/frontend-app-api/package.json index 80585f335e..48657c0048 100644 --- a/packages/frontend-app-api/package.json +++ b/packages/frontend-app-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-app-api", - "version": "0.11.0", + "version": "0.11.1-next.0", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-defaults/CHANGELOG.md b/packages/frontend-defaults/CHANGELOG.md index 5adf091d6f..338fa95715 100644 --- a/packages/frontend-defaults/CHANGELOG.md +++ b/packages/frontend-defaults/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/frontend-defaults +## 0.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-app@0.1.8-next.0 + - @backstage/frontend-app-api@0.11.1-next.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + ## 0.2.0 ### Minor Changes diff --git a/packages/frontend-defaults/package.json b/packages/frontend-defaults/package.json index 723399cedd..4f287b8673 100644 --- a/packages/frontend-defaults/package.json +++ b/packages/frontend-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-defaults", - "version": "0.2.0", + "version": "0.2.1-next.0", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-internal/CHANGELOG.md b/packages/frontend-internal/CHANGELOG.md index 58cf80d33a..e455ecab92 100644 --- a/packages/frontend-internal/CHANGELOG.md +++ b/packages/frontend-internal/CHANGELOG.md @@ -1,5 +1,14 @@ # @internal/frontend +## 0.0.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + ## 0.0.7 ### Patch Changes diff --git a/packages/frontend-internal/package.json b/packages/frontend-internal/package.json index 1b03f01fa8..23da8238d9 100644 --- a/packages/frontend-internal/package.json +++ b/packages/frontend-internal/package.json @@ -1,6 +1,6 @@ { "name": "@internal/frontend", - "version": "0.0.7", + "version": "0.0.8-next.0", "backstage": { "role": "web-library", "inline": true diff --git a/packages/frontend-plugin-api/CHANGELOG.md b/packages/frontend-plugin-api/CHANGELOG.md index 649fc4144b..a7e9271ff5 100644 --- a/packages/frontend-plugin-api/CHANGELOG.md +++ b/packages/frontend-plugin-api/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/frontend-plugin-api +## 0.10.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + ## 0.10.0 ### Minor Changes diff --git a/packages/frontend-plugin-api/package.json b/packages/frontend-plugin-api/package.json index 04ef81883b..70be1db0a3 100644 --- a/packages/frontend-plugin-api/package.json +++ b/packages/frontend-plugin-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-plugin-api", - "version": "0.10.0", + "version": "0.10.1-next.0", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-test-utils/CHANGELOG.md b/packages/frontend-test-utils/CHANGELOG.md index bf79e43a3d..02e9ecf7ca 100644 --- a/packages/frontend-test-utils/CHANGELOG.md +++ b/packages/frontend-test-utils/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/frontend-test-utils +## 0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-app@0.1.8-next.0 + - @backstage/frontend-app-api@0.11.1-next.0 + - @backstage/config@1.3.2 + - @backstage/test-utils@1.7.6 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + ## 0.3.0 ### Minor Changes diff --git a/packages/frontend-test-utils/package.json b/packages/frontend-test-utils/package.json index 37d461498b..797061ce8a 100644 --- a/packages/frontend-test-utils/package.json +++ b/packages/frontend-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-test-utils", - "version": "0.3.0", + "version": "0.3.1-next.0", "backstage": { "role": "web-library" }, diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md index 1640f6e9d0..652086818f 100644 --- a/packages/integration-react/CHANGELOG.md +++ b/packages/integration-react/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/integration-react +## 1.2.6-next.0 + +### Patch Changes + +- 5d10f99: Added scope `project` for Bitbucket Cloud. +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/config@1.3.2 + - @backstage/core-plugin-api@1.10.5 + ## 1.2.5 ### Patch Changes diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index 302ff7295f..862be3d159 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/integration-react", - "version": "1.2.5", + "version": "1.2.6-next.0", "description": "Frontend package for managing integrations towards external systems", "backstage": { "role": "web-library" diff --git a/packages/integration-react/src/api/ScmAuth.test.ts b/packages/integration-react/src/api/ScmAuth.test.ts index d252b95b85..5872354d79 100644 --- a/packages/integration-react/src/api/ScmAuth.test.ts +++ b/packages/integration-react/src/api/ScmAuth.test.ts @@ -129,7 +129,7 @@ describe('ScmAuth', () => { await expect( bitbucketAuth.getCredentials({ url: 'http://example.com' }), ).resolves.toMatchObject({ - token: 'account team pullrequest snippet issue', + token: 'account team pullrequest snippet issue project', }); await expect( bitbucketAuth.getCredentials({ @@ -138,7 +138,7 @@ describe('ScmAuth', () => { }), ).resolves.toMatchObject({ token: - 'account team pullrequest snippet issue pullrequest:write snippet:write issue:write', + 'account team pullrequest snippet issue project pullrequest:write snippet:write issue:write', }); }); @@ -195,7 +195,8 @@ describe('ScmAuth', () => { }, }), ).resolves.toMatchObject({ - token: 'account team pullrequest snippet issue snippet:write issue:write', + token: + 'account team pullrequest snippet issue project snippet:write issue:write', }); }); diff --git a/packages/integration-react/src/api/ScmAuth.ts b/packages/integration-react/src/api/ScmAuth.ts index ff3e8c098d..011422d4cf 100644 --- a/packages/integration-react/src/api/ScmAuth.ts +++ b/packages/integration-react/src/api/ScmAuth.ts @@ -239,6 +239,7 @@ export class ScmAuth implements ScmAuthApi { 'pullrequest', 'snippet', 'issue', + 'project', ]; const repoWriteScopes = options?.scopeMapping?.repoWrite ?? [ 'pullrequest:write', diff --git a/packages/integration/CHANGELOG.md b/packages/integration/CHANGELOG.md index 2625fec1b3..fbe41d1bc4 100644 --- a/packages/integration/CHANGELOG.md +++ b/packages/integration/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/integration +## 1.16.3-next.0 + +### Patch Changes + +- 9768992: Mark GitHub `webhookSecret` config property as optional. A `webhookSecret` is not required when creating a GitHub App. +- Updated dependencies + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + ## 1.16.2 ### Patch Changes diff --git a/packages/integration/config.d.ts b/packages/integration/config.d.ts index bd5267ab3d..8205e0c71e 100644 --- a/packages/integration/config.d.ts +++ b/packages/integration/config.d.ts @@ -239,7 +239,7 @@ export interface Config { * The secret used for webhooks * @visibility secret */ - webhookSecret: string; + webhookSecret?: string; /** * The client ID to use */ diff --git a/packages/integration/package.json b/packages/integration/package.json index 41b63346ea..edfc034e65 100644 --- a/packages/integration/package.json +++ b/packages/integration/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/integration", - "version": "1.16.2", + "version": "1.16.3-next.0", "description": "Helpers for managing integrations towards external systems", "backstage": { "role": "common-library" diff --git a/packages/integration/report.api.md b/packages/integration/report.api.md index c85db9306b..fc38853029 100644 --- a/packages/integration/report.api.md +++ b/packages/integration/report.api.md @@ -647,7 +647,7 @@ export type GiteaIntegrationConfig = { export type GithubAppConfig = { appId: number; privateKey: string; - webhookSecret: string; + webhookSecret?: string; clientId: string; clientSecret: string; allowedInstallationOwners?: string[]; diff --git a/packages/integration/src/github/config.ts b/packages/integration/src/github/config.ts index 1ff4779be2..74a0267d62 100644 --- a/packages/integration/src/github/config.ts +++ b/packages/integration/src/github/config.ts @@ -92,7 +92,7 @@ export type GithubAppConfig = { /** * Webhook secret can be configured at https://github.com/organizations/$org/settings/apps/$AppName */ - webhookSecret: string; + webhookSecret?: string; /** * Found at https://github.com/organizations/$org/settings/apps/$AppName */ @@ -128,7 +128,7 @@ export function readGithubIntegrationConfig( appId: c.getNumber('appId'), clientId: c.getString('clientId'), clientSecret: c.getString('clientSecret'), - webhookSecret: c.getString('webhookSecret'), + webhookSecret: c.getOptionalString('webhookSecret'), privateKey: c.getString('privateKey'), allowedInstallationOwners: c.getOptionalStringArray( 'allowedInstallationOwners', diff --git a/packages/scaffolder-internal/CHANGELOG.md b/packages/scaffolder-internal/CHANGELOG.md index 2339472b24..26ca4237c0 100644 --- a/packages/scaffolder-internal/CHANGELOG.md +++ b/packages/scaffolder-internal/CHANGELOG.md @@ -1,5 +1,21 @@ # @internal/scaffolder +## 0.0.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-scaffolder-react@1.15.0-next.1 + +## 0.0.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.15.0-next.0 + - @backstage/frontend-plugin-api@0.10.0 + ## 0.0.7 ### Patch Changes diff --git a/packages/scaffolder-internal/package.json b/packages/scaffolder-internal/package.json index f57a049022..1bcea74561 100644 --- a/packages/scaffolder-internal/package.json +++ b/packages/scaffolder-internal/package.json @@ -1,6 +1,6 @@ { "name": "@internal/scaffolder", - "version": "0.0.7", + "version": "0.0.8-next.1", "backstage": { "role": "web-library", "inline": true diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md index 571d1e31a9..496a42c036 100644 --- a/packages/techdocs-cli-embedded-app/CHANGELOG.md +++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md @@ -1,5 +1,43 @@ # techdocs-cli-embedded-app +## 0.2.107-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-react@1.2.16-next.0 + - @backstage/core-components@0.17.1-next.0 + - @backstage/integration-react@1.2.6-next.0 + - @backstage/plugin-techdocs@1.12.5-next.1 + - @backstage/app-defaults@1.6.1-next.0 + - @backstage/cli@0.32.0-next.1 + - @backstage/plugin-catalog@1.29.0-next.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.16.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/test-utils@1.7.6 + - @backstage/theme@0.6.4 + +## 0.2.107-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.29.0-next.0 + - @backstage/cli@0.32.0-next.0 + - @backstage/plugin-techdocs@1.12.5-next.0 + - @backstage/app-defaults@1.6.0 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.16.0 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/integration-react@1.2.5 + - @backstage/test-utils@1.7.6 + - @backstage/theme@0.6.4 + - @backstage/plugin-techdocs-react@1.2.15 + ## 0.2.106 ### Patch Changes diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index 971746e720..bd7449497a 100644 --- a/packages/techdocs-cli-embedded-app/package.json +++ b/packages/techdocs-cli-embedded-app/package.json @@ -1,6 +1,6 @@ { "name": "techdocs-cli-embedded-app", - "version": "0.2.106", + "version": "0.2.107-next.1", "backstage": { "role": "frontend" }, diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md index 99ebf4f87f..e7bebb92fe 100644 --- a/packages/techdocs-cli/CHANGELOG.md +++ b/packages/techdocs-cli/CHANGELOG.md @@ -1,5 +1,27 @@ # @techdocs/cli +## 1.9.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/plugin-techdocs-node@1.13.2-next.1 + - @backstage/catalog-model@1.7.3 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.2 + +## 1.9.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/plugin-techdocs-node@1.13.2-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.2 + ## 1.9.1 ### Patch Changes diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index 683c73ff3f..7750798414 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -1,6 +1,6 @@ { "name": "@techdocs/cli", - "version": "1.9.1", + "version": "1.9.2-next.1", "description": "Utility CLI for managing TechDocs sites in Backstage.", "backstage": { "role": "cli" diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md index 176f63364f..cd0c79d632 100644 --- a/plugins/api-docs/CHANGELOG.md +++ b/plugins/api-docs/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-api-docs +## 0.12.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-catalog@1.29.0-next.1 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.5 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-permission-react@0.4.32 + +## 0.12.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.29.0-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-permission-react@0.4.32 + ## 0.12.5 ### Patch Changes diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index 1fcdf205b2..bcc79aeb47 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-api-docs", - "version": "0.12.5", + "version": "0.12.6-next.1", "description": "A Backstage plugin that helps represent API entities in the frontend", "backstage": { "role": "frontend-plugin", diff --git a/plugins/app-visualizer/CHANGELOG.md b/plugins/app-visualizer/CHANGELOG.md index 48e85f1b71..8f4e96c8a3 100644 --- a/plugins/app-visualizer/CHANGELOG.md +++ b/plugins/app-visualizer/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-app-visualizer +## 0.1.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/core-plugin-api@1.10.5 + ## 0.1.17 ### Patch Changes diff --git a/plugins/app-visualizer/package.json b/plugins/app-visualizer/package.json index b2e680bb2b..ffeed3d9df 100644 --- a/plugins/app-visualizer/package.json +++ b/plugins/app-visualizer/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app-visualizer", - "version": "0.1.17", + "version": "0.1.18-next.0", "description": "Visualizes the Backstage app structure", "backstage": { "role": "frontend-plugin", diff --git a/plugins/app/CHANGELOG.md b/plugins/app/CHANGELOG.md index fecb28b9c3..741916869a 100644 --- a/plugins/app/CHANGELOG.md +++ b/plugins/app/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-app +## 0.1.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/integration-react@1.2.6-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/theme@0.6.4 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-react@0.4.32 + ## 0.1.7 ### Patch Changes diff --git a/plugins/app/package.json b/plugins/app/package.json index a47e489ac0..7812e4d65b 100644 --- a/plugins/app/package.json +++ b/plugins/app/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app", - "version": "0.1.7", + "version": "0.1.8-next.0", "backstage": { "role": "frontend-plugin", "pluginId": "app", diff --git a/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md b/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md index 858ba95b83..4d5fd1b84d 100644 --- a/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-auth-backend-module-aws-alb-provider +## 0.4.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.5-next.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/errors@1.2.7 + +## 0.4.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.5-next.0 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/errors@1.2.7 + ## 0.4.1 ### Patch Changes diff --git a/plugins/auth-backend-module-aws-alb-provider/package.json b/plugins/auth-backend-module-aws-alb-provider/package.json index cafbc0b5c1..43d86c0187 100644 --- a/plugins/auth-backend-module-aws-alb-provider/package.json +++ b/plugins/auth-backend-module-aws-alb-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-aws-alb-provider", - "version": "0.4.1", + "version": "0.4.2-next.1", "description": "The aws-alb provider module for the Backstage auth backend.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-bitbucket-provider/CHANGELOG.md b/plugins/auth-backend-module-bitbucket-provider/CHANGELOG.md index b5c72b6744..85035baf9e 100644 --- a/plugins/auth-backend-module-bitbucket-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-bitbucket-provider/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-backend-module-bitbucket-provider +## 0.3.2-next.0 + +### Patch Changes + +- 5d10f99: Enabled persistency of scopes for Bitbucket Cloud. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + ## 0.3.1 ### Patch Changes diff --git a/plugins/auth-backend-module-bitbucket-provider/package.json b/plugins/auth-backend-module-bitbucket-provider/package.json index e481a4b108..63795134b9 100644 --- a/plugins/auth-backend-module-bitbucket-provider/package.json +++ b/plugins/auth-backend-module-bitbucket-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-bitbucket-provider", - "version": "0.3.1", + "version": "0.3.2-next.0", "description": "The bitbucket-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-bitbucket-provider/src/authenticator.ts b/plugins/auth-backend-module-bitbucket-provider/src/authenticator.ts index a2d8275964..e07d9caf98 100644 --- a/plugins/auth-backend-module-bitbucket-provider/src/authenticator.ts +++ b/plugins/auth-backend-module-bitbucket-provider/src/authenticator.ts @@ -28,6 +28,7 @@ export const bitbucketAuthenticator = createOAuthAuthenticator({ PassportOAuthAuthenticatorHelper.defaultProfileTransform, scopes: { required: ['account'], + persist: true, }, initialize({ callbackUrl, config }) { const clientID = config.getString('clientId'); diff --git a/plugins/auth-backend-module-bitbucket-provider/src/module.test.ts b/plugins/auth-backend-module-bitbucket-provider/src/module.test.ts index f1426d1b0d..6dddfb1d63 100644 --- a/plugins/auth-backend-module-bitbucket-provider/src/module.test.ts +++ b/plugins/auth-backend-module-bitbucket-provider/src/module.test.ts @@ -73,6 +73,7 @@ describe('authModuleBitbucketProvider', () => { expect(decodeOAuthState(startUrl.searchParams.get('state')!)).toEqual({ env: 'development', nonce: decodeURIComponent(nonceCookie.value), + scope: 'account', }); }); }); diff --git a/plugins/auth-backend-module-oidc-provider/CHANGELOG.md b/plugins/auth-backend-module-oidc-provider/CHANGELOG.md index 0441c68756..5993e542c3 100644 --- a/plugins/auth-backend-module-oidc-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-oidc-provider/CHANGELOG.md @@ -1,5 +1,41 @@ # @backstage/plugin-auth-backend-module-oidc-provider +## 0.4.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.5-next.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/types@1.2.1 + +## 0.4.2-next.0 + +### Patch Changes + +- 7495edf: Added custom timeout setting for oidc provider + + Here is an example of how to use a custom timeout with the configuration: + + ```yaml + auth: + oidc: + production: + clientId: ${AUTH_GOOGLE_CLIENT_ID} + clientSecret: ${AUTH_GOOGLE_CLIENT_SECRET} + timeout: + seconds: 30 + ``` + +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.5-next.0 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/types@1.2.1 + ## 0.4.1 ### Patch Changes diff --git a/plugins/auth-backend-module-oidc-provider/config.d.ts b/plugins/auth-backend-module-oidc-provider/config.d.ts index 409c658c23..8a1df804e6 100644 --- a/plugins/auth-backend-module-oidc-provider/config.d.ts +++ b/plugins/auth-backend-module-oidc-provider/config.d.ts @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - import { HumanDuration } from '@backstage/types'; export interface Config { @@ -33,6 +32,7 @@ export interface Config { tokenSignedResponseAlg?: string; additionalScopes?: string | string[]; prompt?: string; + timeout?: HumanDuration | string; signIn?: { resolvers: Array< | { diff --git a/plugins/auth-backend-module-oidc-provider/package.json b/plugins/auth-backend-module-oidc-provider/package.json index e163ee8d47..ada47d096d 100644 --- a/plugins/auth-backend-module-oidc-provider/package.json +++ b/plugins/auth-backend-module-oidc-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-oidc-provider", - "version": "0.4.1", + "version": "0.4.2-next.1", "description": "The oidc-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", @@ -35,8 +35,10 @@ }, "dependencies": { "@backstage/backend-plugin-api": "workspace:^", + "@backstage/config": "workspace:^", "@backstage/plugin-auth-backend": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", + "@backstage/types": "workspace:^", "express": "^4.18.2", "openid-client": "^5.5.0", "passport": "^0.7.0" diff --git a/plugins/auth-backend-module-oidc-provider/src/authenticator.test.ts b/plugins/auth-backend-module-oidc-provider/src/authenticator.test.ts index 38e134bcd0..c327d4ecc5 100644 --- a/plugins/auth-backend-module-oidc-provider/src/authenticator.test.ts +++ b/plugins/auth-backend-module-oidc-provider/src/authenticator.test.ts @@ -28,6 +28,7 @@ import { ConfigReader } from '@backstage/config'; import { JWK, SignJWT, exportJWK, generateKeyPair } from 'jose'; import { rest } from 'msw'; import express from 'express'; +import { custom } from 'openid-client'; describe('oidcAuthenticator', () => { let implementation: any; @@ -169,6 +170,77 @@ describe('oidcAuthenticator', () => { jest.clearAllMocks(); }); + describe('timeout configuration', () => { + const TEST_URL = new URL('https://test.com'); + + it('should use default timeout when no timeout is configured', async () => { + const { promise } = oidcAuthenticator.initialize({ + callbackUrl: 'https://backstage.test/callback', + config: new ConfigReader({ + metadataUrl: 'https://oidc.test/.well-known/openid-configuration', + clientId: 'clientId', + clientSecret: 'clientSecret', + }), + }); + const { client } = await promise; + + const timeout = client[custom.http_options](TEST_URL, {}).timeout; + + // Check if the HTTP timeout is set to the default value + expect(timeout).toBeDefined(); + expect(timeout).toBe(10000); + }); + + it('should use configured timeout when provided in the config', async () => { + const { promise } = oidcAuthenticator.initialize({ + callbackUrl: 'https://backstage.test/callback', + config: new ConfigReader({ + metadataUrl: 'https://oidc.test/.well-known/openid-configuration', + clientId: 'clientId', + clientSecret: 'clientSecret', + timeout: { + seconds: 30, + }, + }), + }); + const { client } = await promise; + + const timeout = client[custom.http_options](TEST_URL, {}).timeout; + + // Check if the HTTP timeout is set to the configured value (30 seconds) + expect(timeout).toBeDefined(); + expect(timeout).toBe(30000); + }); + + it('should handle invalid timeout configuration gracefully', async () => { + expect(() => { + oidcAuthenticator.initialize({ + callbackUrl: 'https://backstage.test/callback', + config: new ConfigReader({ + metadataUrl: 'https://oidc.test/.well-known/openid-configuration', + clientId: 'clientId', + clientSecret: 'clientSecret', + timeout: 123, // Invalid: should be a duration object + }), + }); + }).toThrow(); + + expect(() => { + oidcAuthenticator.initialize({ + callbackUrl: 'https://backstage.test/callback', + config: new ConfigReader({ + metadataUrl: 'https://oidc.test/.well-known/openid-configuration', + clientId: 'clientId', + clientSecret: 'clientSecret', + timeout: { + invalid: 'value', + }, + }), + }); + }).toThrow(); + }); + }); + describe('#start', () => { let fakeSession: Record; let startRequest: OAuthAuthenticatorStartInput; diff --git a/plugins/auth-backend-module-oidc-provider/src/authenticator.ts b/plugins/auth-backend-module-oidc-provider/src/authenticator.ts index c396ea7034..6e7022f7cf 100644 --- a/plugins/auth-backend-module-oidc-provider/src/authenticator.ts +++ b/plugins/auth-backend-module-oidc-provider/src/authenticator.ts @@ -32,14 +32,18 @@ import { PassportOAuthAuthenticatorHelper, PassportOAuthPrivateInfo, } from '@backstage/plugin-auth-node'; +import { durationToMilliseconds } from '@backstage/types'; +import { readDurationFromConfig } from '@backstage/config'; const HTTP_OPTION_TIMEOUT = 10000; -const httpOptionsProvider: CustomHttpOptionsProvider = (_url, options) => { - return { - ...options, - timeout: HTTP_OPTION_TIMEOUT, +const createHttpOptionsProvider = + ({ timeout }: { timeout?: number }): CustomHttpOptionsProvider => + (_url, options) => { + return { + ...options, + timeout: timeout ?? HTTP_OPTION_TIMEOUT, + }; }; -}; /** * authentication result for the OIDC which includes the token set and user @@ -85,6 +89,15 @@ export const oidcAuthenticator = createOAuthAuthenticator({ ); } + const timeoutMilliseconds = config.has('timeout') + ? durationToMilliseconds( + readDurationFromConfig(config, { key: 'timeout' }), + ) + : undefined; + const httpOptionsProvider = createHttpOptionsProvider({ + timeout: timeoutMilliseconds, + }); + Issuer[custom.http_options] = httpOptionsProvider; const promise = Issuer.discover(metadataUrl).then(issuer => { issuer[custom.http_options] = httpOptionsProvider; diff --git a/plugins/auth-backend/CHANGELOG.md b/plugins/auth-backend/CHANGELOG.md index 73cc1effcb..1f31d1e089 100644 --- a/plugins/auth-backend/CHANGELOG.md +++ b/plugins/auth-backend/CHANGELOG.md @@ -1,5 +1,67 @@ # @backstage/plugin-auth-backend +## 0.24.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend-module-bitbucket-provider@0.3.2-next.0 + - @backstage/plugin-auth-backend-module-atlassian-provider@0.4.1 + - @backstage/plugin-auth-backend-module-auth0-provider@0.2.1 + - @backstage/plugin-auth-backend-module-aws-alb-provider@0.4.2-next.1 + - @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.6 + - @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.2.1 + - @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.4.1 + - @backstage/plugin-auth-backend-module-github-provider@0.3.1 + - @backstage/plugin-auth-backend-module-gitlab-provider@0.3.1 + - @backstage/plugin-auth-backend-module-google-provider@0.3.1 + - @backstage/plugin-auth-backend-module-microsoft-provider@0.3.1 + - @backstage/plugin-auth-backend-module-oauth2-provider@0.4.1 + - @backstage/plugin-auth-backend-module-oidc-provider@0.4.2-next.1 + - @backstage/plugin-auth-backend-module-okta-provider@0.2.1 + - @backstage/plugin-auth-backend-module-onelogin-provider@0.3.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.4.1 + - @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.6 + - @backstage/plugin-catalog-node@1.16.1 + +## 0.24.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend-module-oidc-provider@0.4.2-next.0 + - @backstage/plugin-auth-backend-module-atlassian-provider@0.4.1 + - @backstage/plugin-auth-backend-module-auth0-provider@0.2.1 + - @backstage/plugin-auth-backend-module-bitbucket-provider@0.3.1 + - @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.2.1 + - @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.4.1 + - @backstage/plugin-auth-backend-module-github-provider@0.3.1 + - @backstage/plugin-auth-backend-module-gitlab-provider@0.3.1 + - @backstage/plugin-auth-backend-module-microsoft-provider@0.3.1 + - @backstage/plugin-auth-backend-module-oauth2-provider@0.4.1 + - @backstage/plugin-auth-backend-module-okta-provider@0.2.1 + - @backstage/plugin-auth-backend-module-onelogin-provider@0.3.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-auth-backend-module-aws-alb-provider@0.4.2-next.0 + - @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.6 + - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.4.1 + - @backstage/plugin-auth-backend-module-google-provider@0.3.1 + - @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.6 + - @backstage/plugin-catalog-node@1.16.1 + ## 0.24.4 ### Patch Changes diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index 2173e8a3e1..278e0b66b1 100644 --- a/plugins/auth-backend/package.json +++ b/plugins/auth-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend", - "version": "0.24.4", + "version": "0.24.5-next.1", "description": "A Backstage backend plugin that handles authentication", "backstage": { "role": "backend-plugin", diff --git a/plugins/auth-react/CHANGELOG.md b/plugins/auth-react/CHANGELOG.md index 878b4cb239..779531d9be 100644 --- a/plugins/auth-react/CHANGELOG.md +++ b/plugins/auth-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-react +## 0.1.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + ## 0.1.13 ### Patch Changes diff --git a/plugins/auth-react/package.json b/plugins/auth-react/package.json index f0aacb0335..56aa1de172 100644 --- a/plugins/auth-react/package.json +++ b/plugins/auth-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-react", - "version": "0.1.13", + "version": "0.1.14-next.0", "description": "Web library for the auth plugin", "backstage": { "role": "web-library", diff --git a/plugins/bitbucket-cloud-common/CHANGELOG.md b/plugins/bitbucket-cloud-common/CHANGELOG.md index f68654a896..a672b240f7 100644 --- a/plugins/bitbucket-cloud-common/CHANGELOG.md +++ b/plugins/bitbucket-cloud-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-bitbucket-cloud-common +## 0.2.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + ## 0.2.28 ### Patch Changes diff --git a/plugins/bitbucket-cloud-common/package.json b/plugins/bitbucket-cloud-common/package.json index 40b7814675..3b25c4edc9 100644 --- a/plugins/bitbucket-cloud-common/package.json +++ b/plugins/bitbucket-cloud-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bitbucket-cloud-common", - "version": "0.2.28", + "version": "0.2.29-next.0", "description": "Common functionalities for bitbucket-cloud plugins", "backstage": { "role": "common-library", diff --git a/plugins/catalog-backend-module-aws/CHANGELOG.md b/plugins/catalog-backend-module-aws/CHANGELOG.md index ea21282077..cf558ef5d4 100644 --- a/plugins/catalog-backend-module-aws/CHANGELOG.md +++ b/plugins/catalog-backend-module-aws/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-catalog-backend-module-aws +## 0.4.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.15 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-kubernetes-common@0.9.4 + +## 0.4.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + - @backstage/integration-aws-node@0.1.15 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-kubernetes-common@0.9.4 + ## 0.4.9 ### Patch Changes diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json index dfaa2ff914..cc35e77541 100644 --- a/plugins/catalog-backend-module-aws/package.json +++ b/plugins/catalog-backend-module-aws/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-aws", - "version": "0.4.9", + "version": "0.4.10-next.1", "description": "A Backstage catalog backend module that helps integrate towards AWS", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-azure/CHANGELOG.md b/plugins/catalog-backend-module-azure/CHANGELOG.md index 7fb2802619..e974a5079c 100644 --- a/plugins/catalog-backend-module-azure/CHANGELOG.md +++ b/plugins/catalog-backend-module-azure/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-azure +## 0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + ## 0.3.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-azure/package.json b/plugins/catalog-backend-module-azure/package.json index 6c1638dbf7..132a0ad553 100644 --- a/plugins/catalog-backend-module-azure/package.json +++ b/plugins/catalog-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-azure", - "version": "0.3.3", + "version": "0.3.4-next.0", "description": "A Backstage catalog backend module that helps integrate towards Azure", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md index 20f96900f4..6d23112160 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-backend-module-bitbucket-cloud +## 0.4.7-next.0 + +### Patch Changes + +- 146e41b: Fixed bug in event-based discovery that caused unnecessary API calls to Bitbucket Cloud +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.29-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + ## 0.4.6 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-cloud/package.json b/plugins/catalog-backend-module-bitbucket-cloud/package.json index 0ec2c6cc8e..d8a9cccb4b 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/package.json +++ b/plugins/catalog-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-cloud", - "version": "0.4.6", + "version": "0.4.7-next.0", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket Cloud", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.test.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.test.ts index 489578e853..5b2f9992c9 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.test.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.test.ts @@ -542,31 +542,11 @@ describe('BitbucketCloudEntityProvider', () => { })[0]; server.use( - rest.get( - `https://api.bitbucket.org/2.0/workspaces/test-ws/projects`, - (_req, res, ctx) => { - const response = { - values: [ - { - key: 'TEST', - }, - { - key: 'TEST2', - }, - ], - }; - return res(ctx.json(response)); - }, - ), rest.get( `https://api.bitbucket.org/2.0/workspaces/test-ws/search/code`, (req, res, ctx) => { const query = req.url.searchParams.get('search_query'); - if ( - !query || - !query.includes('repo:test-repo') || - !query.includes('project:TEST') - ) { + if (!query || !query.includes('repo:test-repo')) { return res(ctx.json({ values: [] })); } @@ -643,10 +623,6 @@ describe('BitbucketCloudEntityProvider', () => { entity: addedModule, locationKey: 'bitbucketCloud-provider:myProvider', }, - { - entity: addedModule, - locationKey: 'bitbucketCloud-provider:myProvider', - }, ]; const removedEntities = [ { diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts index e4ba2f2dc0..5beb98ac08 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts @@ -326,6 +326,8 @@ export class BitbucketCloudEntityProvider implements EntityProvider { const optRepoFilter = repoSlug ? ` repo:${repoSlug}` : ''; const query = `"${catalogFilename}" path:${catalogPath}${optRepoFilter}`; + if (repoSlug) return this.processQuery(workspace, query); + const projects = this.client .listProjectsByWorkspace(workspace) .iterateResults(); diff --git a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md index 64a3217dc5..1f0d32d490 100644 --- a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-catalog-backend-module-bitbucket-server +## 0.4.0-next.0 + +### Minor Changes + +- 7b3ed9b: Added the ability for the plugin to receive events coming from Bitbucket Server push webhooks. It then performs a delta mutation on the catalog. + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + ## 0.3.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-server/package.json b/plugins/catalog-backend-module-bitbucket-server/package.json index 0198a5ae66..df8c7fe64d 100644 --- a/plugins/catalog-backend-module-bitbucket-server/package.json +++ b/plugins/catalog-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-server", - "version": "0.3.3", + "version": "0.4.0-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "catalog", @@ -21,16 +21,12 @@ "license": "Apache-2.0", "exports": { ".": "./src/index.ts", - "./alpha": "./src/alpha.ts", "./package.json": "./package.json" }, "main": "src/index.ts", "types": "src/index.ts", "typesVersions": { "*": { - "alpha": [ - "src/alpha.ts" - ], "package.json": [ "package.json" ] @@ -51,17 +47,21 @@ }, "dependencies": { "@backstage/backend-plugin-api": "workspace:^", + "@backstage/catalog-client": "workspace:^", "@backstage/catalog-model": "workspace:^", "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", "@backstage/integration": "workspace:^", + "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", + "@backstage/plugin-events-node": "workspace:^", "p-throttle": "^4.1.1", "uuid": "^11.0.0" }, "devDependencies": { "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", + "@backstage/plugin-events-backend-test-utils": "workspace:^", "luxon": "^3.0.0", "msw": "^1.0.0" }, diff --git a/plugins/catalog-backend-module-bitbucket-server/report-alpha.api.md b/plugins/catalog-backend-module-bitbucket-server/report-alpha.api.md deleted file mode 100644 index 06212c3c60..0000000000 --- a/plugins/catalog-backend-module-bitbucket-server/report-alpha.api.md +++ /dev/null @@ -1,13 +0,0 @@ -## API Report File for "@backstage/plugin-catalog-backend-module-bitbucket-server" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts -import { BackendFeature } from '@backstage/backend-plugin-api'; - -// @alpha (undocumented) -const _feature: BackendFeature; -export default _feature; - -// (No @packageDocumentation comment for this package) -``` diff --git a/plugins/catalog-backend-module-bitbucket-server/report.api.md b/plugins/catalog-backend-module-bitbucket-server/report.api.md index 0da9b78139..7cb13e651f 100644 --- a/plugins/catalog-backend-module-bitbucket-server/report.api.md +++ b/plugins/catalog-backend-module-bitbucket-server/report.api.md @@ -3,13 +3,16 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts +import { AuthService } from '@backstage/backend-plugin-api'; import { BackendFeature } from '@backstage/backend-plugin-api'; import { BitbucketServerIntegrationConfig } from '@backstage/integration'; +import { CatalogService } from '@backstage/plugin-catalog-node'; import { Config } from '@backstage/config'; import { Entity } from '@backstage/catalog-model'; import { EntityProvider } from '@backstage/plugin-catalog-node'; import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; -import { LocationSpec } from '@backstage/plugin-catalog-node'; +import { EventsService } from '@backstage/plugin-events-node'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; import { LoggerService } from '@backstage/backend-plugin-api'; import { SchedulerService } from '@backstage/backend-plugin-api'; import { SchedulerServiceTaskRunner } from '@backstage/backend-plugin-api'; @@ -22,6 +25,11 @@ export class BitbucketServerClient { config: BitbucketServerIntegrationConfig; }): BitbucketServerClient; // (undocumented) + getDefaultBranch(options: { + projectKey: string; + repo: string; + }): Promise; + // (undocumented) getFile(options: { projectKey: string; repo: string; @@ -47,6 +55,16 @@ export class BitbucketServerClient { }; } +// @public (undocumented) +export type BitbucketServerDefaultBranch = { + id: string; + displayId: string; + type: string; + latestCommit: string; + latestChangeset: string; + isDefault: boolean; +}; + // @public export class BitbucketServerEntityProvider implements EntityProvider { connect(connection: EntityProviderConnection): Promise; @@ -55,9 +73,12 @@ export class BitbucketServerEntityProvider implements EntityProvider { config: Config, options: { logger: LoggerService; + events?: EventsService; parser?: BitbucketServerLocationParser; schedule?: SchedulerServiceTaskRunner; scheduler?: SchedulerService; + catalogApi?: CatalogService; + auth?: AuthService; }, ): BitbucketServerEntityProvider[]; getProviderName(): string; @@ -108,6 +129,7 @@ export type BitbucketServerRepository = { }[] >; archived: boolean; + defaultBranch: string; }; // @public (undocumented) diff --git a/plugins/catalog-backend-module-bitbucket-server/src/index.ts b/plugins/catalog-backend-module-bitbucket-server/src/index.ts index f05c9ca0e9..722be03d7a 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/index.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/index.ts @@ -21,12 +21,16 @@ */ export { default } from './module'; + export { BitbucketServerClient } from './lib'; + export type { BitbucketServerProject, BitbucketServerRepository, BitbucketServerPagedResponse, BitbucketServerListOptions, + BitbucketServerDefaultBranch, } from './lib'; + export { BitbucketServerEntityProvider } from './providers'; export type { BitbucketServerLocationParser } from './providers'; diff --git a/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.test.ts b/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.test.ts index 6abcede9de..fbb4054390 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.test.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.test.ts @@ -23,7 +23,12 @@ import { BitbucketServerPagedResponse, paginated, } from './BitbucketServerClient'; -import { BitbucketServerProject, BitbucketServerRepository } from './types'; +import { + BitbucketServerDefaultBranch, + BitbucketServerProject, + BitbucketServerRepository, +} from './types'; +import { NotFoundError } from '@backstage/errors'; const server = setupServer(); @@ -122,6 +127,7 @@ describe('BitbucketServerClient', () => { ], }, archived: false, + defaultBranch: 'master', }, ], }; @@ -200,6 +206,7 @@ describe('BitbucketServerClient', () => { ], }, archived: false, + defaultBranch: 'master', }; return res(ctx.json(response)); @@ -217,4 +224,82 @@ describe('BitbucketServerClient', () => { 'https://bitbucket.mycompany.com/projects/test-project', ); }); + + it('getRepository no repo', async () => { + server.use( + rest.get( + `${config.apiBaseUrl}/projects/test-project/repos/wrong-repo`, + (_, res, ctx) => { + return res(ctx.status(404)); + }, + ), + ); + + const error = async () => { + await client.getRepository({ + projectKey: 'test-project', + repo: 'wrong-repo', + }); + }; + + await expect(error).rejects.toThrow( + "Repository 'wrong-repo' in project 'test-project' does not exist.", + ); + await expect(error).rejects.toThrow(NotFoundError); + }); + + it('getDefaultBranch success', async () => { + server.use( + rest.get( + `${config.apiBaseUrl}/projects/test-project/repos/test-repo/default-branch`, + (req, res, ctx) => { + if ( + req.headers.get('authorization') !== + 'Basic dGVzdC11c2VyOnRlc3QtcHc=' + ) { + return res(ctx.status(400)); + } + const response: BitbucketServerDefaultBranch = { + id: 'refs/heads/master', + displayId: 'master', + type: 'BRANCH', + latestCommit: '0f2f3ae484054696568bf4560ba4da280f7df82a', + latestChangeset: '0f2f3ae484054696568bf4560ba4da280f7df82a', + isDefault: true, + }; + + return res(ctx.json(response)); + }, + ), + ); + + const repo = await client.getDefaultBranch({ + projectKey: 'test-project', + repo: 'test-repo', + }); + expect(repo.displayId).toEqual('master'); + }); + + it('getDefaultBranch endpoint', async () => { + server.use( + rest.get( + `${config.apiBaseUrl}/projects/test-project/repos/wrong-repo/default-branch`, + (_, res, ctx) => { + return res(ctx.status(404)); + }, + ), + ); + + const error = async () => { + await client.getDefaultBranch({ + projectKey: 'test-project', + repo: 'wrong-repo', + }); + }; + + await expect(error).rejects.toThrow( + "Your Bitbucket Server version no longer supports the default branch endpoint or 'wrong-repo' in 'test-project' does not exist.", + ); + await expect(error).rejects.toThrow(NotFoundError); + }); }); diff --git a/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.ts b/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.ts index 3dd61d64e7..70e791c992 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.ts @@ -18,8 +18,14 @@ import { BitbucketServerIntegrationConfig, getBitbucketServerRequestOptions, } from '@backstage/integration'; -import { BitbucketServerProject, BitbucketServerRepository } from './types'; import pThrottle from 'p-throttle'; +import { + BitbucketServerDefaultBranch, + BitbucketServerRepository, +} from './index'; +import { BitbucketServerProject } from './types'; +import { NotFoundError } from '@backstage/errors'; +import { ResponseError } from '@backstage/errors'; // 1 per second const throttle = pThrottle({ @@ -92,7 +98,35 @@ export class BitbucketServerClient { request, getBitbucketServerRequestOptions(this.config), ); - return response.json(); + if (response.ok) { + return response.json(); + } + if (response.status === 404) { + throw new NotFoundError( + `Repository '${options.repo}' in project '${options.projectKey}' does not exist.`, + ); + } + throw await ResponseError.fromResponse(response); + } + + async getDefaultBranch(options: { + projectKey: string; + repo: string; + }): Promise { + const request = `${this.config.apiBaseUrl}/projects/${options.projectKey}/repos/${options.repo}/default-branch`; + const response = await fetch( + request, + getBitbucketServerRequestOptions(this.config), + ); + if (response.ok) { + return response.json(); + } + if (response.status === 404) { + throw new NotFoundError( + `Your Bitbucket Server version no longer supports the default branch endpoint or '${options.repo}' in '${options.projectKey}' does not exist.`, + ); + } + throw await ResponseError.fromResponse(response); } resolvePath(options: { projectKey: string; repo: string; path: string }): { diff --git a/plugins/catalog-backend-module-bitbucket-server/src/lib/index.ts b/plugins/catalog-backend-module-bitbucket-server/src/lib/index.ts index 8b72c9335b..4533cb1305 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/lib/index.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/lib/index.ts @@ -20,6 +20,9 @@ export type { BitbucketServerListOptions, } from './BitbucketServerClient'; export type { + BitbucketServerDefaultBranch, BitbucketServerRepository, + BitbucketServerEvents, BitbucketServerProject, } from './types'; +// export * from './types'; diff --git a/plugins/catalog-backend-module-bitbucket-server/src/lib/types.ts b/plugins/catalog-backend-module-bitbucket-server/src/lib/types.ts index 381eecb493..efdf3d7cf8 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/lib/types.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/lib/types.ts @@ -15,7 +15,7 @@ */ /** @public */ -export type BitbucketServerRepository = { +type BitbucketServerRepository = { project: { key: string; }; @@ -28,9 +28,55 @@ export type BitbucketServerRepository = { }[] >; archived: boolean; + defaultBranch: string; }; /** @public */ -export type BitbucketServerProject = { +type BitbucketServerProject = { key: string; }; + +/** @public */ +type BitbucketServerDefaultBranch = { + id: string; + displayId: string; + type: string; + latestCommit: string; + latestChangeset: string; + isDefault: boolean; +}; + +namespace BitbucketServerEvents { + interface Event { + eventKey: string; + } + + export interface RefsChangedEvent extends Event { + date: string; + actor: Actor; + repository: Repository; + changes: Change[]; + commits: undefined; + ToCommit: undefined; + } + type Actor = { + name?: string; + id: number; + }; + type Change = { + ref: { id: string; displayId: string; type: string }; + }; + type Repository = { + slug: string; + id: number; + name: string; + project: BitbucketServerProject; + }; +} + +export type { + BitbucketServerDefaultBranch, + BitbucketServerProject, + BitbucketServerEvents, + BitbucketServerRepository, +}; diff --git a/plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.test.ts b/plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.test.ts index fbd4fa7a36..f9345170ed 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.test.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.test.ts @@ -16,20 +16,33 @@ import { SchedulerServiceTaskScheduleDefinition } from '@backstage/backend-plugin-api'; import { mockServices, startTestBackend } from '@backstage/backend-test-utils'; +import { createServiceFactory } from '@backstage/backend-plugin-api'; +import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; +import { TestEventsService } from '@backstage/plugin-events-backend-test-utils'; +import { eventsServiceRef } from '@backstage/plugin-events-node'; import { catalogModuleBitbucketServerEntityProvider } from './catalogModuleBitbucketServerEntityProvider'; -import { BitbucketServerEntityProvider } from '../providers'; +import { BitbucketServerEntityProvider } from '../providers/BitbucketServerEntityProvider'; describe('catalogModuleBitbucketServerEntityProvider', () => { it('should register provider at the catalog extension point', async () => { + const events = new TestEventsService(); + const eventsServiceFactory = createServiceFactory({ + service: eventsServiceRef, + deps: {}, + async factory({}) { + return events; + }, + }); let addedProviders: Array | undefined; let usedSchedule: SchedulerServiceTaskScheduleDefinition | undefined; - const extensionPoint = { + const catalogExtensionPointImpl = { addEntityProvider: (providers: any) => { addedProviders = providers; }, }; + const connection = jest.fn() as unknown as EntityProviderConnection; const runner = jest.fn(); const scheduler = mockServices.scheduler.mock({ createScheduledTaskRunner(schedule) { @@ -38,33 +51,35 @@ describe('catalogModuleBitbucketServerEntityProvider', () => { }, }); - const config = { - catalog: { - providers: { - bitbucketServer: { - host: 'bitbucket.mycompany.com', - schedule: { - frequency: 'P1M', - timeout: 'PT3M', + await startTestBackend({ + extensionPoints: [ + [catalogProcessingExtensionPoint, catalogExtensionPointImpl], + ], + features: [ + eventsServiceFactory, + catalogModuleBitbucketServerEntityProvider, + mockServices.rootConfig.factory({ + data: { + catalog: { + providers: { + bitbucketServer: { + host: 'bitbucket.mycompany.com', + schedule: { + frequency: 'P1M', + timeout: 'PT3M', + }, + }, + }, + }, + integrations: { + bitbucketServer: [ + { + host: 'bitbucket.mycompany.com', + }, + ], }, }, - }, - }, - integrations: { - bitbucketServer: [ - { - host: 'bitbucket.mycompany.com', - }, - ], - }, - }; - - await startTestBackend({ - extensionPoints: [[catalogProcessingExtensionPoint, extensionPoint]], - features: [ - catalogModuleBitbucketServerEntityProvider, - mockServices.rootConfig.factory({ data: config }), - mockServices.logger.factory(), + }), scheduler.factory, ], }); @@ -72,9 +87,14 @@ describe('catalogModuleBitbucketServerEntityProvider', () => { expect(usedSchedule?.frequency).toEqual({ months: 1 }); expect(usedSchedule?.timeout).toEqual({ minutes: 3 }); expect(addedProviders?.length).toEqual(1); - expect(addedProviders?.pop()?.getProviderName()).toEqual( + expect(runner).not.toHaveBeenCalled(); + const provider = addedProviders!.pop()!; + expect(provider.getProviderName()).toEqual( 'bitbucketServer-provider:default', ); - expect(runner).not.toHaveBeenCalled(); + await provider.connect(connection); + expect(events.subscribed).toHaveLength(1); + expect(events.subscribed[0].id).toEqual('bitbucketServer-provider:default'); + expect(runner).toHaveBeenCalledTimes(1); }); }); diff --git a/plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.ts b/plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.ts index 2c78d219d9..d66ef4e2a2 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.ts @@ -18,8 +18,10 @@ import { coreServices, createBackendModule, } from '@backstage/backend-plugin-api'; +import { catalogServiceRef } from '@backstage/plugin-catalog-node'; import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; -import { BitbucketServerEntityProvider } from '../providers'; +import { eventsServiceRef } from '@backstage/plugin-events-node'; +import { BitbucketServerEntityProvider } from '../providers/BitbucketServerEntityProvider'; /** * @public @@ -31,14 +33,28 @@ export const catalogModuleBitbucketServerEntityProvider = createBackendModule({ env.registerInit({ deps: { catalog: catalogProcessingExtensionPoint, + catalogApi: catalogServiceRef, config: coreServices.rootConfig, + events: eventsServiceRef, logger: coreServices.logger, scheduler: coreServices.scheduler, + auth: coreServices.auth, }, - async init({ catalog, config, logger, scheduler }) { + async init({ + catalog, + catalogApi, + config, + events, + logger, + scheduler, + auth, + }) { const providers = BitbucketServerEntityProvider.fromConfig(config, { + catalogApi, + events, logger, scheduler, + auth, }); catalog.addEntityProvider(providers); diff --git a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.test.ts b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.test.ts index 05e0ea6a01..ba4e3e0411 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.test.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.test.ts @@ -18,17 +18,30 @@ import { SchedulerService, SchedulerServiceTaskRunner, SchedulerServiceTaskInvocationDefinition, + BackstageCredentials, } from '@backstage/backend-plugin-api'; import { mockServices, registerMswTestHooks, } from '@backstage/backend-test-utils'; import { ConfigReader } from '@backstage/config'; -import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; +import { + CatalogService, + DeferredEntity, + EntityProviderConnection, + locationSpecToLocationEntity, +} from '@backstage/plugin-catalog-node'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; -import { BitbucketServerEntityProvider } from './BitbucketServerEntityProvider'; +import { + BitbucketServerEntityProvider, + toDeferredEntities, +} from './BitbucketServerEntityProvider'; import { BitbucketServerPagedResponse } from '../lib'; +import { Entity, LocationEntity } from '@backstage/catalog-model'; +import { BitbucketServerEvents } from '../lib/index'; +import { DefaultEventsService } from '@backstage/plugin-events-node'; +import { catalogServiceMock } from '@backstage/plugin-catalog-node/testUtils'; class PersistingTaskRunner implements SchedulerServiceTaskRunner { private tasks: SchedulerServiceTaskInvocationDefinition[] = []; @@ -57,9 +70,17 @@ function pagedResponse(values: any): BitbucketServerPagedResponse { const logger = mockServices.logger.mock(); +const authService = mockServices.auth.mock(); + +const events = DefaultEventsService.create({ logger }); + const server = setupServer(); -function setupStubs(projects: Project[], baseUrl: string) { +function setupStubs( + projects: Project[], + baseUrl: string, + defaultBranch: string, +) { // Stub projects server.use( rest.get(`${baseUrl}/rest/api/1.0/projects`, (_, res, ctx) => { @@ -93,6 +114,7 @@ function setupStubs(projects: Project[], baseUrl: string) { ], }, archived: repo.archived ?? false, + defaultBranch: defaultBranch, }); } return res(ctx.json(pagedResponse(response))); @@ -102,6 +124,102 @@ function setupStubs(projects: Project[], baseUrl: string) { } } +const host = 'bitbucket.mycompany.com'; +const targetPath = `/catalog-info.yaml`; +const test1RepoUrl = `https://${host}/projects/TEST/repos/test1/browse`; + +function setupRepositoryReqHandler(defaultBranch: string) { + server.use( + rest.get( + `https://${host}/rest/api/1.0/projects/TEST/repos/test1`, + (_, res, ctx) => { + const response = { + slug: 'test1', + id: 1, + name: 'test1', + project: { + key: 'TEST', + id: 1, + name: 'TEST', + links: { + self: [ + { + href: `https://${host}/projects/TEST`, + }, + ], + }, + }, + links: { + self: [ + { + href: `${test1RepoUrl}`, + }, + ], + }, + defaultBranch: defaultBranch, + }; + return res(ctx.json(response)); + }, + ), + ); +} + +const repoPushEvent: BitbucketServerEvents.RefsChangedEvent = { + eventKey: 'repo:refs_changed', + date: '2017-09-19T09:45:32+1000', + actor: { + name: 'admin', + id: 1, + }, + repository: { + slug: 'test1', + id: 84, + name: 'test1', + project: { + key: 'TEST', + }, + }, + changes: [ + { + ref: { + id: 'refs/heads/master', + displayId: 'master', + type: 'BRANCH', + }, + }, + ], + commits: undefined, + ToCommit: undefined, +}; +const repoPushEventParams = { + topic: 'bitbucketServer.repo:refs_changed', + eventPayload: repoPushEvent, + metadata: { 'x-event-key': 'repo:refs_changed' }, +}; + +const createLocationEntity = ( + repoUrl: string, + path: string, + defaultBranch: string, +): LocationEntity => { + const target = `${repoUrl}${path}`; + + const entity = locationSpecToLocationEntity({ + location: { + type: 'url', + target: target, + presence: 'optional', + }, + }); + entity.metadata.annotations = { + ...entity.metadata.annotations, + [`${host}/repo-url`]: target, + ['bitbucket.org/default-branch']: defaultBranch, + }; + + return entity; +}; + describe('BitbucketServerEntityProvider', () => { registerMswTestHooks(server); afterEach(() => { @@ -157,6 +275,7 @@ describe('BitbucketServerEntityProvider', () => { }); const providers = BitbucketServerEntityProvider.fromConfig(config, { logger, + events, schedule, }); @@ -191,6 +310,7 @@ describe('BitbucketServerEntityProvider', () => { }); const providers = BitbucketServerEntityProvider.fromConfig(config, { logger, + events, schedule, }); @@ -204,7 +324,6 @@ describe('BitbucketServerEntityProvider', () => { }); it('apply full update on scheduled execution with filters', async () => { - const host = 'bitbucket.mycompany.com'; const config = new ConfigReader({ integrations: { bitbucketServer: [ @@ -253,6 +372,7 @@ describe('BitbucketServerEntityProvider', () => { { key: 'other-project', repos: [{ name: 'other-repo' }] }, ], `https://${host}`, + 'master', ); await provider.connect(entityProviderConnection); @@ -270,6 +390,7 @@ describe('BitbucketServerEntityProvider', () => { annotations: { 'backstage.io/managed-by-location': `url:${url}`, 'backstage.io/managed-by-origin-location': `url:${url}`, + 'bitbucket.org/default-branch': 'master', }, name: 'generated-77f4323822420990f8c3e3c981d38c2dec4ae3a6', }, @@ -291,7 +412,6 @@ describe('BitbucketServerEntityProvider', () => { }); it('apply full update on scheduled execution without filters', async () => { - const host = 'bitbucket.mycompany.com'; const config = new ConfigReader({ integrations: { bitbucketServer: [ @@ -329,6 +449,7 @@ describe('BitbucketServerEntityProvider', () => { { key: 'other-project', repos: [{ name: 'other-repo' }] }, ], `https://${host}`, + 'master', ); await provider.connect(entityProviderConnection); @@ -345,6 +466,7 @@ describe('BitbucketServerEntityProvider', () => { annotations: { 'backstage.io/managed-by-location': `url:https://${host}/projects/project-test/repos/repo-test/browse/catalog-info.yaml`, 'backstage.io/managed-by-origin-location': `url:https://${host}/projects/project-test/repos/repo-test/browse/catalog-info.yaml`, + 'bitbucket.org/default-branch': 'master', }, name: 'generated-77f4323822420990f8c3e3c981d38c2dec4ae3a6', }, @@ -364,6 +486,7 @@ describe('BitbucketServerEntityProvider', () => { annotations: { 'backstage.io/managed-by-location': `url:https://${host}/projects/other-project/repos/other-repo/browse/catalog-info.yaml`, 'backstage.io/managed-by-origin-location': `url:https://${host}/projects/other-project/repos/other-repo/browse/catalog-info.yaml`, + 'bitbucket.org/default-branch': 'master', }, name: 'generated-d8d4944c30c2906dfee172ddda9537f9893b2c0f', }, @@ -441,7 +564,6 @@ describe('BitbucketServerEntityProvider', () => { }); it('apply full update with schedule in config', async () => { - const host = 'bitbucket.mycompany.com'; const config = new ConfigReader({ integrations: { bitbucketServer: [ @@ -488,6 +610,7 @@ describe('BitbucketServerEntityProvider', () => { { key: 'other-project', repos: [{ name: 'other-repo' }] }, ], `https://${host}`, + 'master', ); await provider.connect(entityProviderConnection); @@ -504,6 +627,7 @@ describe('BitbucketServerEntityProvider', () => { annotations: { 'backstage.io/managed-by-location': `url:https://${host}/projects/project-test/repos/repo-test/browse/catalog-info.yaml`, 'backstage.io/managed-by-origin-location': `url:https://${host}/projects/project-test/repos/repo-test/browse/catalog-info.yaml`, + 'bitbucket.org/default-branch': 'master', }, name: 'generated-77f4323822420990f8c3e3c981d38c2dec4ae3a6', }, @@ -523,6 +647,7 @@ describe('BitbucketServerEntityProvider', () => { annotations: { 'backstage.io/managed-by-location': `url:https://${host}/projects/other-project/repos/other-repo/browse/catalog-info.yaml`, 'backstage.io/managed-by-origin-location': `url:https://${host}/projects/other-project/repos/other-repo/browse/catalog-info.yaml`, + 'bitbucket.org/default-branch': 'master', }, name: 'generated-d8d4944c30c2906dfee172ddda9537f9893b2c0f', }, @@ -542,4 +667,351 @@ describe('BitbucketServerEntityProvider', () => { entities: expectedEntities, }); }); + + it('Multiple location entities to deferred entities', async () => { + const schedule = new PersistingTaskRunner(); + const config = new ConfigReader({ + catalog: { + providers: { + bitbucketServer: { + host: host, + }, + }, + }, + integrations: { + bitbucketServer: [ + { + host: host, + }, + ], + }, + }); + const providers = BitbucketServerEntityProvider.fromConfig(config, { + logger, + events, + schedule, + }); + + expect(providers).toHaveLength(1); + expect(providers[0].getProviderName()).toEqual( + 'bitbucketServer-provider:default', + ); + + const locationEntities = [ + { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Location', + metadata: { + annotations: { + 'backstage.io/managed-by-location': `url:https://${host}/projects/project-test/repos/repo-test/browse/catalog-info.yaml`, + 'backstage.io/managed-by-origin-location': `url:https://${host}/projects/project-test/repos/repo-test/browse/catalog-info.yaml`, + [`${host}/repo-url`]: `https://${host}/projects/project-test/repos/repo-test/browse/catalog-info.yaml`, + 'bitbucket.org/default-branch': 'master', + }, + name: 'generated-77f4323822420990f8c3e3c981d38c2dec4ae3a6', + }, + spec: { + presence: 'optional', + target: `https://${host}/projects/project-test/repos/repo-test/browse/catalog-info.yaml`, + type: 'url', + }, + }, + { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Location', + metadata: { + annotations: { + 'backstage.io/managed-by-location': `url:https://${host}/projects/other-project/repos/other-repo/browse/catalog-info.yaml`, + 'backstage.io/managed-by-origin-location': `url:https://${host}/projects/other-project/repos/other-repo/browse/catalog-info.yaml`, + [`${host}/repo-url`]: `https://${host}/projects/other-project/repos/other-repo/browse/catalog-info.yaml`, + 'bitbucket.org/default-branch': 'master', + }, + name: 'generated-d8d4944c30c2906dfee172ddda9537f9893b2c0f', + }, + spec: { + presence: 'optional', + target: `https://${host}/projects/other-project/repos/other-repo/browse/catalog-info.yaml`, + type: 'url', + }, + }, + ]; + + const deferredEntities = toDeferredEntities( + locationEntities, + providers[0].getProviderName(), + ); + + expect(deferredEntities).toEqual([ + { + locationKey: providers[0].getProviderName(), + entity: locationEntities[0], + }, + { + locationKey: providers[0].getProviderName(), + entity: locationEntities[1], + }, + ]); + }); + + it('refresh onRepoPush', async () => { + const schedule = new PersistingTaskRunner(); + const keptModule = createLocationEntity( + test1RepoUrl, + `/kept-module:${targetPath}`, + 'master', + ); + const entityProviderConnection: EntityProviderConnection = { + applyMutation: jest.fn(), + refresh: jest.fn(), + }; + + setupRepositoryReqHandler('master'); + + // authService.getOwnServiceCredentials(); + + const config = new ConfigReader({ + integrations: { + bitbucketServer: [ + { + host: host, + }, + ], + }, + catalog: { + providers: { + bitbucketServer: { + mainProvider: { + host: host, + apiBaseUrl: `https://${host}/rest/api/1.0`, + catalogPath: `/kept-module:/catalog-info.yaml`, + defaultBranch: 'master', + }, + }, + }, + }, + }); + + const catalogApi = catalogServiceMock.mock({ + getEntities: async ( + request: { filter: Record }, + credentials: { credentials: BackstageCredentials }, + ): Promise<{ items: Entity[] }> => { + if ( + credentials.credentials !== + (await authService.getOwnServiceCredentials()) || + request.filter.kind !== 'Location' || + request.filter[`metadata.annotations.${host}/repo-url`] !== + `${test1RepoUrl}/kept-module:${targetPath}` + ) { + return { items: [] }; + } + return { + items: [keptModule], + }; + }, + }); + + const provider = BitbucketServerEntityProvider.fromConfig(config, { + catalogApi: catalogApi, + logger, + schedule, + events, + auth: authService, + })[0]; + + await provider.connect(entityProviderConnection); + await events.publish(repoPushEventParams); + + expect(entityProviderConnection.refresh).toHaveBeenCalledTimes(1); + expect(entityProviderConnection.refresh).toHaveBeenCalledWith({ + keys: [`url:${test1RepoUrl}/kept-module:${targetPath}`], + }); + expect(entityProviderConnection.applyMutation).toHaveBeenCalledTimes(0); + }); + + it('no refresh onRepoPush due to different default branch', async () => { + const schedule = new PersistingTaskRunner(); + const keptModule = createLocationEntity( + test1RepoUrl, + `/kept-module:${targetPath}`, + 'main', + ); + const entityProviderConnection: EntityProviderConnection = { + applyMutation: jest.fn(), + refresh: jest.fn(), + }; + + setupRepositoryReqHandler('main'); + + const config = new ConfigReader({ + integrations: { + bitbucketServer: [ + { + host: host, + }, + ], + }, + catalog: { + providers: { + bitbucketServer: { + mainProvider: { + host: host, + apiBaseUrl: `https://${host}/rest/api/1.0`, + catalogPath: `/kept-module:/catalog-info.yaml`, + }, + }, + }, + }, + }); + + const catalogApi = catalogServiceMock.mock({ + getEntities: async ( + request: { filter: Record }, + credentials: { credentials: BackstageCredentials }, + ): Promise<{ items: Entity[] }> => { + if ( + credentials.credentials !== + (await authService.getOwnServiceCredentials()) || + request.filter.kind !== 'Location' || + request.filter[`metadata.annotations.${host}/repo-url`] !== + `${test1RepoUrl}/kept-module:${targetPath}` + ) { + return { items: [] }; + } + return { + items: [keptModule], + }; + }, + }); + + const provider = BitbucketServerEntityProvider.fromConfig(config, { + catalogApi: catalogApi, + logger, + schedule, + events, + auth: authService, + })[0]; + + await provider.connect(entityProviderConnection); + await events.publish(repoPushEventParams); + + expect(entityProviderConnection.refresh).toHaveBeenCalledTimes(0); + expect(entityProviderConnection.applyMutation).toHaveBeenCalledTimes(0); + }); + + it('add onRepoPush', async () => { + const schedule = new PersistingTaskRunner(); + setupRepositoryReqHandler('master'); + authService.getPluginRequestToken.mockResolvedValue({ + token: 'fake-token', + }); + const addedModule = createLocationEntity( + test1RepoUrl, + `/added-module:${targetPath}`, + 'master', + ); + + const entityProviderConnection: EntityProviderConnection = { + applyMutation: jest.fn(), + refresh: jest.fn(), + }; + + const config = new ConfigReader({ + integrations: { + bitbucketServer: [ + { + host: host, + }, + ], + }, + catalog: { + providers: { + bitbucketServer: { + mainProvider: { + host: host, + apiBaseUrl: `https://${host}/rest/api/1.0`, + catalogPath: `/added-module:/catalog-info.yaml`, + }, + }, + }, + }, + }); + + const catalogApi = catalogServiceMock({ entities: [] }); + const provider = BitbucketServerEntityProvider.fromConfig(config, { + catalogApi: catalogApi, + logger, + schedule, + events, + auth: authService, + })[0]; + + await provider.connect(entityProviderConnection); + await events.publish(repoPushEventParams); + const addedEntities = [ + { + entity: addedModule, + locationKey: 'bitbucketServer-provider:mainProvider', + }, + ]; + const removedEntities: DeferredEntity[] = []; + + expect(entityProviderConnection.refresh).toHaveBeenCalledTimes(1); + expect(entityProviderConnection.refresh).toHaveBeenCalledWith({ + keys: [], + }); + expect(entityProviderConnection.applyMutation).toHaveBeenCalledTimes(1); + expect(entityProviderConnection.applyMutation).toHaveBeenCalledWith({ + type: 'delta', + added: addedEntities, + removed: removedEntities, + }); + }); + + it('fail add onRepoPush from wrong default branch', async () => { + const schedule = new PersistingTaskRunner(); + setupRepositoryReqHandler('main'); + + const entityProviderConnection: EntityProviderConnection = { + applyMutation: jest.fn(), + refresh: jest.fn(), + }; + + const config = new ConfigReader({ + integrations: { + bitbucketServer: [ + { + host: host, + }, + ], + }, + catalog: { + providers: { + bitbucketServer: { + mainProvider: { + host: host, + apiBaseUrl: `https://${host}/rest/api/1.0`, + catalogPath: `/added-module:/catalog-info.yaml`, + }, + }, + }, + }, + }); + + const catalogApi = catalogServiceMock({ entities: [] }); + const provider = BitbucketServerEntityProvider.fromConfig(config, { + catalogApi: catalogApi as any as CatalogService, + logger, + schedule, + events, + auth: authService, + })[0]; + + await provider.connect(entityProviderConnection); + await events.publish(repoPushEventParams); + + expect(entityProviderConnection.refresh).toHaveBeenCalledTimes(0); + + expect(entityProviderConnection.applyMutation).toHaveBeenCalledTimes(0); + }); }); diff --git a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.ts b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.ts index 46f492d64c..b462f8756a 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Entity } from '@backstage/catalog-model'; +import { Entity, LocationEntity } from '@backstage/catalog-model'; import { Config } from '@backstage/config'; import { InputError } from '@backstage/errors'; import { @@ -24,6 +24,8 @@ import { import { EntityProvider, EntityProviderConnection, + DeferredEntity, + CatalogService, } from '@backstage/plugin-catalog-node'; import * as uuid from 'uuid'; import { BitbucketServerClient, paginated } from '../lib'; @@ -36,10 +38,16 @@ import { defaultBitbucketServerLocationParser, } from './BitbucketServerLocationParser'; import { + AuthService, + BackstageCredentials, LoggerService, SchedulerService, SchedulerServiceTaskRunner, } from '@backstage/backend-plugin-api'; +import { BitbucketServerEvents } from '../lib'; +import { EventsService } from '@backstage/plugin-events-node'; + +const TOPIC_REPO_REFS_CHANGED = 'bitbucketServer.repo:refs_changed'; /** * Discovers catalog files located in Bitbucket Server. @@ -56,14 +64,23 @@ export class BitbucketServerEntityProvider implements EntityProvider { private readonly logger: LoggerService; private readonly scheduleFn: () => Promise; private connection?: EntityProviderConnection; + private readonly catalogApi?: CatalogService; + private readonly events?: EventsService; + private readonly auth?: AuthService; + private eventConfigErrorThrown = false; + private readonly targetAnnotation: string; + private readonly defaultBranchAnnotation: string; static fromConfig( config: Config, options: { logger: LoggerService; + events?: EventsService; parser?: BitbucketServerLocationParser; schedule?: SchedulerServiceTaskRunner; scheduler?: SchedulerService; + catalogApi?: CatalogService; + auth?: AuthService; }, ): BitbucketServerEntityProvider[] { const integrations = ScmIntegrations.fromConfig(config); @@ -98,6 +115,9 @@ export class BitbucketServerEntityProvider implements EntityProvider { options.logger, taskRunner, options.parser, + options.catalogApi, + options.events, + options.auth, ); }); } @@ -108,6 +128,9 @@ export class BitbucketServerEntityProvider implements EntityProvider { logger: LoggerService, taskRunner: SchedulerServiceTaskRunner, parser?: BitbucketServerLocationParser, + catalogApi?: CatalogService, + events?: EventsService, + auth?: AuthService, ) { this.integration = integration; this.config = config; @@ -116,6 +139,11 @@ export class BitbucketServerEntityProvider implements EntityProvider { target: this.getProviderName(), }); this.scheduleFn = this.createScheduleFn(taskRunner); + this.catalogApi = catalogApi; + this.auth = auth; + this.targetAnnotation = `${this.config.host.split(':')[0]}/repo-url`; + this.defaultBranchAnnotation = 'bitbucket.org/default-branch'; + this.events = events; } private createScheduleFn( @@ -154,6 +182,22 @@ export class BitbucketServerEntityProvider implements EntityProvider { async connect(connection: EntityProviderConnection): Promise { this.connection = connection; await this.scheduleFn(); + + if (this.events) { + await this.events.subscribe({ + id: this.getProviderName(), + topics: [TOPIC_REPO_REFS_CHANGED], + onEvent: async params => { + if (params.topic !== TOPIC_REPO_REFS_CHANGED) { + return; + } + + await this.onRepoPush( + params.eventPayload as BitbucketServerEvents.RefsChangedEvent, + ); + }, + }); + } } async refresh(logger: LoggerService) { @@ -218,10 +262,245 @@ export class BitbucketServerEntityProvider implements EntityProvider { presence: 'optional', }, })) { + if (entity.metadata.annotations === undefined) { + entity.metadata.annotations = {}; + } + if (repository.defaultBranch === undefined) { + const defaultBranchResponse = await client.getDefaultBranch({ + repo: repository.slug, + projectKey: project.key, + }); + entity.metadata.annotations[this.defaultBranchAnnotation] = + defaultBranchResponse.displayId; + } else { + entity.metadata.annotations[this.defaultBranchAnnotation] = + repository.defaultBranch; + } result.push(entity); } } } return result; } + + private isDefaultBranchPush( + defaultBranch: String, + event: BitbucketServerEvents.RefsChangedEvent, + ): boolean { + return event.changes.some(c => defaultBranch === c.ref.displayId); + } + + /** + * Checks if the provider is able to handle events + * @returns Boolean + */ + private canHandleEvents(): boolean { + if (this.catalogApi && this.auth) { + return true; + } + + if (!this.eventConfigErrorThrown) { + this.eventConfigErrorThrown = true; + throw new Error( + `${this.getProviderName()} not well configured to handle repo:push. Missing CatalogApi and/or AuthService.`, + ); + } + + return false; + } + + private async getLocationEntity( + event: BitbucketServerEvents.RefsChangedEvent, + ): Promise { + const client = BitbucketServerClient.fromConfig({ + config: this.integration.config, + }); + const result: Entity[] = []; + try { + const repository = await client.getRepository({ + projectKey: event.repository.project.key, + repo: event.repository.slug, + }); + + for await (const entity of this.parser({ + client, + logger: this.logger, + location: { + type: 'url', + target: `${repository.links.self[0].href}${this.config.catalogPath}`, + presence: 'optional', + }, + })) { + entity.metadata.annotations![ + this.targetAnnotation + ] = `${repository.links.self[0].href}${this.config.catalogPath}`; + + if (entity.metadata.annotations === undefined) { + entity.metadata.annotations = {}; + } + + if (repository.defaultBranch === undefined) { + const defaultBranchResponse = await client.getDefaultBranch({ + repo: repository.slug, + projectKey: event.repository.project.key, + }); + entity.metadata.annotations[this.defaultBranchAnnotation] = + defaultBranchResponse.displayId; + } else { + entity.metadata.annotations[this.defaultBranchAnnotation] = + repository.defaultBranch; + } + result.push(entity); + } + } catch (error: any) { + if (error.name === 'NotFoundError') { + this.logger.error(error.message); + } + } + + return result; + } + + private async onRepoPush( + event: BitbucketServerEvents.RefsChangedEvent, + ): Promise { + if (!this.canHandleEvents()) { + this.logger.error( + 'Bitbucket Server catalog entity provider is not set up to handle events. Missing authService or catalogApi.', + ); + return; + } + + if (!this.connection) { + throw new Error('Not initialized'); + } + + const repoSlug = event.repository.slug; + const catalogRepoUrl: string = `https://${this.config.host}/projects/${event.repository.project.key}/repos/${repoSlug}/browse${this.config.catalogPath}`; + this.logger.info(`handle repo:push event for ${catalogRepoUrl}`); + const targets = await this.getLocationEntity(event); + if (targets.length === 0) { + this.logger.error('Failed to create location entity.'); + return; + } + const existing = await this.findExistingLocations( + catalogRepoUrl, + await this.auth!.getOwnServiceCredentials(), + ); + const stillExisting: LocationEntity[] = []; + const removed: DeferredEntity[] = []; + existing.forEach(item => { + if ( + targets.find( + value => + value.metadata.annotations![this.targetAnnotation] === + item.spec.target, + ) + ) { + stillExisting.push(item); + } else { + removed.push({ + locationKey: this.getProviderName(), + entity: item, + }); + } + }); + + const added = await this.getAddedEntities(targets, existing); + + if ( + stillExisting.length > 0 && + stillExisting[0].metadata.annotations![this.defaultBranchAnnotation] !== + undefined && + !this.isDefaultBranchPush( + stillExisting[0].metadata.annotations![this.defaultBranchAnnotation], + event, + ) + ) { + return; + } else if ( + added.length > 0 && + added[0].entity.metadata.annotations![this.defaultBranchAnnotation] !== + undefined && + !this.isDefaultBranchPush( + added[0].entity.metadata.annotations![this.defaultBranchAnnotation], + event, + ) + ) { + return; + } else if ( + removed.length > 0 && + removed[0].entity.metadata.annotations![this.defaultBranchAnnotation] !== + undefined && + !this.isDefaultBranchPush( + removed[0].entity.metadata.annotations![this.defaultBranchAnnotation], + event, + ) + ) { + return; + } + + const promises: Promise[] = [ + this.connection.refresh({ + keys: stillExisting.map(entity => `url:${entity.spec.target}`), + }), + ]; + + if (added.length > 0 || removed.length > 0) { + promises.push( + this.connection.applyMutation({ + type: 'delta', + added: added, + removed: removed, + }), + ); + } + + await Promise.all(promises); + + return; + } + + private async getAddedEntities( + targets: Entity[], + existing: LocationEntity[], + ): Promise { + const added: DeferredEntity[] = toDeferredEntities( + targets.filter( + target => + !existing.find( + item => + item.spec.target === + target.metadata.annotations![this.targetAnnotation], + ), + ), + this.getProviderName(), + ); + return added; + } + + private async findExistingLocations( + catalogRepoUrl: string, + credentials: BackstageCredentials, + ): Promise { + const filter: Record = {}; + filter.kind = 'Location'; + filter[`metadata.annotations.${this.targetAnnotation}`] = catalogRepoUrl; + + return this.catalogApi!.getEntities({ filter }, { credentials }).then( + result => result.items, + ) as Promise; + } +} + +export function toDeferredEntities( + targets: Entity[], + locationKey: string, +): DeferredEntity[] { + return targets.map(entity => { + return { + locationKey, + entity, + }; + }); } diff --git a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProviderConfig.ts b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProviderConfig.ts index 018ff23069..3b921b6bab 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProviderConfig.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProviderConfig.ts @@ -48,10 +48,8 @@ export function readProviderConfigs( // simple/single config variant return [readProviderConfig(DEFAULT_PROVIDER_ID, providersConfig)]; } - return providersConfig.keys().map(id => { const providerConfig = providersConfig.getConfig(id); - return readProviderConfig(id, providerConfig); }); } diff --git a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerLocationParser.ts b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerLocationParser.ts index 6aea23387e..1c48d5e7bd 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerLocationParser.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerLocationParser.ts @@ -14,13 +14,11 @@ * limitations under the License. */ -import { - LocationSpec, - locationSpecToLocationEntity, -} from '@backstage/plugin-catalog-node'; +import { locationSpecToLocationEntity } from '@backstage/plugin-catalog-node'; import { Entity } from '@backstage/catalog-model'; -import { BitbucketServerClient } from '../lib'; import { LoggerService } from '@backstage/backend-plugin-api'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; +import { BitbucketServerClient } from '../lib'; /** * A custom callback that reacts to finding a location by yielding entities. diff --git a/plugins/catalog-backend-module-gerrit/CHANGELOG.md b/plugins/catalog-backend-module-gerrit/CHANGELOG.md index c8f939d15b..fba580260f 100644 --- a/plugins/catalog-backend-module-gerrit/CHANGELOG.md +++ b/plugins/catalog-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-gerrit +## 0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + ## 0.3.0 ### Minor Changes diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json index 112239d1ca..dbd1e0b984 100644 --- a/plugins/catalog-backend-module-gerrit/package.json +++ b/plugins/catalog-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gerrit", - "version": "0.3.0", + "version": "0.3.1-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "catalog", diff --git a/plugins/catalog-backend-module-github-org/CHANGELOG.md b/plugins/catalog-backend-module-github-org/CHANGELOG.md index d0647ba4e1..e533d16eb9 100644 --- a/plugins/catalog-backend-module-github-org/CHANGELOG.md +++ b/plugins/catalog-backend-module-github-org/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-catalog-backend-module-github-org +## 0.3.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-github@0.8.0-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + +## 0.3.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-github@0.7.12-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + ## 0.3.8 ### Patch Changes diff --git a/plugins/catalog-backend-module-github-org/package.json b/plugins/catalog-backend-module-github-org/package.json index cb68676e62..eb83845f1d 100644 --- a/plugins/catalog-backend-module-github-org/package.json +++ b/plugins/catalog-backend-module-github-org/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-github-org", - "version": "0.3.8", + "version": "0.3.9-next.1", "description": "The github-org backend module for the catalog plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-github/CHANGELOG.md b/plugins/catalog-backend-module-github/CHANGELOG.md index 629a5bfe94..fff55f9942 100644 --- a/plugins/catalog-backend-module-github/CHANGELOG.md +++ b/plugins/catalog-backend-module-github/CHANGELOG.md @@ -1,5 +1,44 @@ # @backstage/plugin-catalog-backend-module-github +## 0.8.0-next.1 + +### Minor Changes + +- f0c22eb: **BREAKING**: Explicitly rejects branch names containing a slash character. + + The module now rejects any configuration that contains slashes in branch names. The reason for this is that the ingestion will run into downstream problems if they were let through. If you had configuration with a slash in the branch name in `filters.branch`, your application may fail to start up. + + If you are affected by this, please move over to using branches that do not have slashes in them. + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-catalog-backend@1.32.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + +## 0.7.12-next.0 + +### Patch Changes + +- 16648ef: Added `validateLocationsExist` to the config definition where it was missing. +- Updated dependencies + - @backstage/plugin-catalog-backend@1.32.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/integration@1.16.2 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + ## 0.7.11 ### Patch Changes diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json index 240571df53..9511aa1857 100644 --- a/plugins/catalog-backend-module-github/package.json +++ b/plugins/catalog-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-github", - "version": "0.7.11", + "version": "0.8.0-next.1", "description": "A Backstage catalog backend module that helps integrate towards GitHub", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-github/src/providers/GithubEntityProviderConfig.test.ts b/plugins/catalog-backend-module-github/src/providers/GithubEntityProviderConfig.test.ts index d00cbc888c..bddb4d27cd 100644 --- a/plugins/catalog-backend-module-github/src/providers/GithubEntityProviderConfig.test.ts +++ b/plugins/catalog-backend-module-github/src/providers/GithubEntityProviderConfig.test.ts @@ -311,4 +311,24 @@ describe('readProviderConfigs', () => { expect(() => readProviderConfigs(config)).toThrow(); }); + + it('throws an error when filters.branch contains a slash', () => { + const config = new ConfigReader({ + catalog: { + providers: { + github: { + invalidBranchUser: { + organization: 'test-org', + catalogPath: '/*/catalog-info.yaml', + filters: { + branch: 'test/a', + }, + }, + }, + }, + }, + }); + + expect(() => readProviderConfigs(config)).toThrow(); + }); }); diff --git a/plugins/catalog-backend-module-github/src/providers/GithubEntityProviderConfig.ts b/plugins/catalog-backend-module-github/src/providers/GithubEntityProviderConfig.ts index 2e2592b70a..781239978f 100644 --- a/plugins/catalog-backend-module-github/src/providers/GithubEntityProviderConfig.ts +++ b/plugins/catalog-backend-module-github/src/providers/GithubEntityProviderConfig.ts @@ -104,6 +104,12 @@ function readProviderConfig( ); } + if (branchPattern?.includes('/')) { + throw new Error( + 'Error while processing GitHub provider config. Slash characters (/) are not allowed in filters.branch', + ); + } + const schedule = config.has('schedule') ? readSchedulerServiceTaskScheduleDefinitionFromConfig( config.getConfig('schedule'), diff --git a/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md b/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md index 87843783a9..d7307272e5 100644 --- a/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-catalog-backend-module-gitlab-org +## 0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-gitlab@0.6.5-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + +## 0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-gitlab@0.6.5-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + ## 0.2.7 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitlab-org/package.json b/plugins/catalog-backend-module-gitlab-org/package.json index 883360efd2..00e986f3a9 100644 --- a/plugins/catalog-backend-module-gitlab-org/package.json +++ b/plugins/catalog-backend-module-gitlab-org/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gitlab-org", - "version": "0.2.7", + "version": "0.2.8-next.1", "description": "The gitlab-org backend module for the catalog plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-gitlab/CHANGELOG.md b/plugins/catalog-backend-module-gitlab/CHANGELOG.md index 0893e2c8ad..94ce0e148f 100644 --- a/plugins/catalog-backend-module-gitlab/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-catalog-backend-module-gitlab +## 0.6.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + +## 0.6.5-next.0 + +### Patch Changes + +- a568cda: add filter for repos by membership and topics +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/integration@1.16.2 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + ## 0.6.4 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitlab/config.d.ts b/plugins/catalog-backend-module-gitlab/config.d.ts index ce1cda50e7..e41de67208 100644 --- a/plugins/catalog-backend-module-gitlab/config.d.ts +++ b/plugins/catalog-backend-module-gitlab/config.d.ts @@ -72,6 +72,18 @@ export interface Config { * Should be in the format group/subgroup/repo, with no leading or trailing slashes. */ excludeRepos?: string[]; + + /** + * (Optional) If true, limit by repositories that the current user is a member of. + * See: https://docs.gitlab.com/api/projects/#list-projects + */ + membership?: boolean; + + /** + * (Optional) List of topic names. Limit results to repositories that match all of given topics. + * See: https://docs.gitlab.com/api/projects/#list-projects + */ + topics?: string; }; }; }; diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json index daa63096b7..3e0c0ed49a 100644 --- a/plugins/catalog-backend-module-gitlab/package.json +++ b/plugins/catalog-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gitlab", - "version": "0.6.4", + "version": "0.6.5-next.1", "description": "A Backstage catalog backend module that helps integrate towards GitLab", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-gitlab/report.api.md b/plugins/catalog-backend-module-gitlab/report.api.md index e2577553d3..5b7bfadf1d 100644 --- a/plugins/catalog-backend-module-gitlab/report.api.md +++ b/plugins/catalog-backend-module-gitlab/report.api.md @@ -120,6 +120,8 @@ export type GitlabProviderConfig = { includeArchivedRepos?: boolean; excludeRepos?: string[]; includeUsersWithoutSeat?: boolean; + membership?: boolean; + topics?: string; }; // @public diff --git a/plugins/catalog-backend-module-gitlab/src/lib/client.ts b/plugins/catalog-backend-module-gitlab/src/lib/client.ts index f5ed760b21..9053d68554 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/client.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/client.ts @@ -41,6 +41,8 @@ export type CommonListOptions = { interface ListProjectOptions extends CommonListOptions { archived?: boolean; group?: string; + membership?: boolean; + topics?: string; } interface UserListOptions extends CommonListOptions { diff --git a/plugins/catalog-backend-module-gitlab/src/lib/types.ts b/plugins/catalog-backend-module-gitlab/src/lib/types.ts index e25f9bacf4..864eca7dfe 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/types.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/types.ts @@ -248,6 +248,18 @@ export type GitlabProviderConfig = { * Defaults to `false` */ includeUsersWithoutSeat?: boolean; + + /** + * If true, the membership parameter is set to true in the GitLab API request. + * See: https://docs.gitlab.com/api/projects/#list-projects + */ + membership?: boolean; + + /** + * Optional comma seperated list of topics to filter projects by, as specified in the GitLab API documentation: + * https://docs.gitlab.com/api/projects/#list-projects + */ + topics?: string; }; /** diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts index 66a6247295..8bf749c275 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts @@ -214,6 +214,8 @@ export class GitlabDiscoveryEntityProvider implements EntityProvider { page: 1, per_page: 50, ...(!this.config.includeArchivedRepos && { archived: false }), + ...(this.config.membership && { membership: true }), + ...(this.config.topics && { topics: this.config.topics }), }, ); diff --git a/plugins/catalog-backend-module-gitlab/src/providers/config.test.ts b/plugins/catalog-backend-module-gitlab/src/providers/config.test.ts index e1798df184..8790a3fe53 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/config.test.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/config.test.ts @@ -65,6 +65,8 @@ describe('config', () => { excludeRepos: [], restrictUsersToGroup: false, includeUsersWithoutSeat: false, + membership: undefined, + topics: undefined, }), ); }); @@ -109,6 +111,8 @@ describe('config', () => { excludeRepos: [], restrictUsersToGroup: false, includeUsersWithoutSeat: true, + membership: undefined, + topics: undefined, }), ); }); @@ -153,6 +157,8 @@ describe('config', () => { skipForkedRepos: true, includeArchivedRepos: false, includeUsersWithoutSeat: false, + membership: undefined, + topics: undefined, }), ); }); @@ -197,6 +203,8 @@ describe('config', () => { skipForkedRepos: false, includeArchivedRepos: true, includeUsersWithoutSeat: false, + membership: undefined, + topics: undefined, }), ); }); @@ -242,6 +250,8 @@ describe('config', () => { includeArchivedRepos: false, excludeRepos: ['foo/bar', 'quz/qux'], includeUsersWithoutSeat: false, + membership: undefined, + topics: undefined, }), ); }); @@ -287,6 +297,8 @@ describe('config', () => { restrictUsersToGroup: false, excludeRepos: [], includeUsersWithoutSeat: false, + membership: undefined, + topics: undefined, schedule: { frequency: { minutes: 30 }, timeout: { @@ -336,4 +348,188 @@ describe('config', () => { expect(result).toHaveLength(1); expect(result[0].group).toEqual(''); }); + + it('valid config with membership', () => { + const config = new ConfigReader({ + catalog: { + providers: { + gitlab: { + test: { + group: 'group', + host: 'host', + branch: 'not-master', + fallbackBranch: 'main', + entityFilename: 'custom-file.yaml', + membership: true, + }, + }, + }, + }, + }); + + const result = readGitlabConfigs(config); + expect(result).toHaveLength(1); + result.forEach(r => + expect(r).toStrictEqual({ + id: 'test', + group: 'group', + branch: 'not-master', + fallbackBranch: 'main', + host: 'host', + catalogFile: 'custom-file.yaml', + projectPattern: /[\s\S]*/, + groupPattern: /[\s\S]*/, + userPattern: /[\s\S]*/, + orgEnabled: false, + allowInherited: false, + relations: [], + schedule: undefined, + restrictUsersToGroup: false, + excludeRepos: [], + skipForkedRepos: false, + includeUsersWithoutSeat: false, + includeArchivedRepos: false, + membership: true, + topics: undefined, + }), + ); + }); + + it('valid config with empyt topics', () => { + const config = new ConfigReader({ + catalog: { + providers: { + gitlab: { + test: { + group: 'group', + host: 'host', + branch: 'not-master', + fallbackBranch: 'main', + entityFilename: 'custom-file.yaml', + topics: [], + }, + }, + }, + }, + }); + + const result = readGitlabConfigs(config); + expect(result).toHaveLength(1); + result.forEach(r => + expect(r).toStrictEqual({ + id: 'test', + group: 'group', + branch: 'not-master', + fallbackBranch: 'main', + host: 'host', + catalogFile: 'custom-file.yaml', + projectPattern: /[\s\S]*/, + groupPattern: /[\s\S]*/, + userPattern: /[\s\S]*/, + orgEnabled: false, + allowInherited: false, + relations: [], + schedule: undefined, + restrictUsersToGroup: false, + excludeRepos: [], + skipForkedRepos: false, + includeUsersWithoutSeat: false, + includeArchivedRepos: false, + membership: undefined, + topics: undefined, + }), + ); + }); + + it('valid config with single topics', () => { + const config = new ConfigReader({ + catalog: { + providers: { + gitlab: { + test: { + group: 'group', + host: 'host', + branch: 'not-master', + fallbackBranch: 'main', + entityFilename: 'custom-file.yaml', + topics: ['topic1'], + }, + }, + }, + }, + }); + + const result = readGitlabConfigs(config); + expect(result).toHaveLength(1); + result.forEach(r => + expect(r).toStrictEqual({ + id: 'test', + group: 'group', + branch: 'not-master', + fallbackBranch: 'main', + host: 'host', + catalogFile: 'custom-file.yaml', + projectPattern: /[\s\S]*/, + groupPattern: /[\s\S]*/, + userPattern: /[\s\S]*/, + orgEnabled: false, + allowInherited: false, + relations: [], + schedule: undefined, + restrictUsersToGroup: false, + excludeRepos: [], + skipForkedRepos: false, + includeUsersWithoutSeat: false, + includeArchivedRepos: false, + membership: undefined, + topics: 'topic1', + }), + ); + }); + + it('valid config with multiple topics', () => { + const config = new ConfigReader({ + catalog: { + providers: { + gitlab: { + test: { + group: 'group', + host: 'host', + branch: 'not-master', + fallbackBranch: 'main', + entityFilename: 'custom-file.yaml', + topics: ['topic1', 'topic2', 'topic3'], + }, + }, + }, + }, + }); + + const result = readGitlabConfigs(config); + expect(result).toHaveLength(1); + result.forEach(r => + expect(r).toStrictEqual({ + id: 'test', + group: 'group', + branch: 'not-master', + fallbackBranch: 'main', + host: 'host', + catalogFile: 'custom-file.yaml', + projectPattern: /[\s\S]*/, + groupPattern: /[\s\S]*/, + userPattern: /[\s\S]*/, + orgEnabled: false, + allowInherited: false, + relations: [], + schedule: undefined, + restrictUsersToGroup: false, + excludeRepos: [], + skipForkedRepos: false, + includeUsersWithoutSeat: false, + includeArchivedRepos: false, + membership: undefined, + topics: 'topic1,topic2,topic3', + }), + ); + }); }); diff --git a/plugins/catalog-backend-module-gitlab/src/providers/config.ts b/plugins/catalog-backend-module-gitlab/src/providers/config.ts index bf59bb0d36..5b50fce5b1 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/config.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/config.ts @@ -66,6 +66,11 @@ function readGitlabConfig(id: string, config: Config): GitlabProviderConfig { const includeUsersWithoutSeat = config.getOptionalBoolean('includeUsersWithoutSeat') ?? false; + const membership = config.getOptionalBoolean('membership'); + + const topicsArray = config.getOptionalStringArray('topics'); + const topics = topicsArray?.length ? topicsArray.join(',') : undefined; + return { id, group, @@ -85,6 +90,8 @@ function readGitlabConfig(id: string, config: Config): GitlabProviderConfig { excludeRepos, restrictUsersToGroup, includeUsersWithoutSeat, + membership, + topics, }; } diff --git a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md index cb0b578d80..99326b355c 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md +++ b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/plugin-catalog-backend-module-incremental-ingestion +## 0.6.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/plugin-catalog-backend@1.32.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + - @backstage/plugin-permission-common@0.8.4 + +## 0.6.5-next.0 + +### Patch Changes + +- 27d1031: fixed misleading example location annotations in docs +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/plugin-catalog-backend@1.32.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + - @backstage/plugin-permission-common@0.8.4 + ## 0.6.4 ### Patch Changes diff --git a/plugins/catalog-backend-module-incremental-ingestion/README.md b/plugins/catalog-backend-module-incremental-ingestion/README.md index 2535fbe8e3..7673ca08ab 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/README.md +++ b/plugins/catalog-backend-module-incremental-ingestion/README.md @@ -208,12 +208,20 @@ export class MyIncrementalEntityProvider The last step is to implement the actual `next` method that will accept the cursor, call the API, process the result and return the result. ```ts +import { + ANNOTATION_LOCATION, + ANNOTATION_ORIGIN_LOCATION, +} from '@backstage/catalog-model'; +import { IncrementalEntityProvider } from '@backstage/plugin-catalog-backend-module-incremental-ingestion'; + export class MyIncrementalEntityProvider implements IncrementalEntityProvider { token: string; + mySource: string; - constructor(token: string) { + constructor(token: string, mySource: string) { this.token = token; + this.mySource = mySource; } getProviderName() { @@ -230,6 +238,7 @@ export class MyIncrementalEntityProvider implements IncrementalEntityProvider> { const { apiClient } = context; + const location = `${this.getProviderName()}:${this.mySource}`; // call your API with the current cursor const data = await apiClient.getServices(cursor); @@ -249,8 +258,8 @@ export class MyIncrementalEntityProvider implements IncrementalEntityProvider; // @alpha (undocumented) const _default: FrontendPlugin< diff --git a/plugins/catalog-import/report.api.md b/plugins/catalog-import/report.api.md index e31ef8defe..66a39e8b90 100644 --- a/plugins/catalog-import/report.api.md +++ b/plugins/catalog-import/report.api.md @@ -15,13 +15,13 @@ import { FetchApi } from '@backstage/core-plugin-api'; import { FieldErrors } from 'react-hook-form'; import { InfoCardVariants } from '@backstage/core-components'; import { JSX as JSX_2 } from 'react'; +import { NestedValue } from 'react-hook-form'; import { default as React_2 } from 'react'; import { RouteRef } from '@backstage/core-plugin-api'; import { ScmAuthApi } from '@backstage/integration-react'; import { ScmIntegrationRegistry } from '@backstage/integration'; import { SubmitHandler } from 'react-hook-form'; import { TextFieldProps } from '@material-ui/core/TextField/TextField'; -import { UnpackNestedValue } from 'react-hook-form'; import { UseFormProps } from 'react-hook-form'; import { UseFormReturn } from 'react-hook-form'; @@ -361,6 +361,17 @@ export interface StepPrepareCreatePullRequestProps { ) => React_2.ReactNode; } +// @public @deprecated +export type UnpackNestedValue = T extends NestedValue + ? U + : T extends Date | FileList | File | Blob + ? T + : T extends object + ? { + [K in keyof T]: UnpackNestedValue; + } + : T; + // Warnings were encountered during analysis: // // src/api/CatalogImportApi.d.ts:25:5 - (ae-forgotten-export) The symbol "PartialEntity" needs to be exported by the entry point index.d.ts diff --git a/plugins/catalog-import/src/alpha.tsx b/plugins/catalog-import/src/alpha.tsx index cf63c92338..ab6e3f2a68 100644 --- a/plugins/catalog-import/src/alpha.tsx +++ b/plugins/catalog-import/src/alpha.tsx @@ -38,6 +38,8 @@ import { CatalogImportClient, catalogImportApiRef } from './api'; import { rootRouteRef } from './plugin'; import { catalogApiRef } from '@backstage/plugin-catalog-react'; +export * from './translation'; + // TODO: It's currently possible to override the import page with a custom one. We need to decide // whether this type of override is typically done with an input or by overriding the entire extension. const catalogImportPage = PageBlueprint.make({ diff --git a/plugins/catalog-import/src/components/DefaultImportPage/DefaultImportPage.tsx b/plugins/catalog-import/src/components/DefaultImportPage/DefaultImportPage.tsx index fa89ac2caf..cdff61fe73 100644 --- a/plugins/catalog-import/src/components/DefaultImportPage/DefaultImportPage.tsx +++ b/plugins/catalog-import/src/components/DefaultImportPage/DefaultImportPage.tsx @@ -28,6 +28,8 @@ import { useTheme } from '@material-ui/core/styles'; import React from 'react'; import { ImportInfoCard } from '../ImportInfoCard'; import { ImportStepper } from '../ImportStepper'; +import { useTranslationRef } from '@backstage/core-plugin-api/alpha'; +import { catalogImportTranslationRef } from '../../translation'; /** * The default catalog import page. @@ -35,6 +37,7 @@ import { ImportStepper } from '../ImportStepper'; * @public */ export const DefaultImportPage = () => { + const { t } = useTranslationRef(catalogImportTranslationRef); const theme = useTheme(); const configApi = useApi(configApiRef); const isMobile = useMediaQuery(theme.breakpoints.down('sm')); @@ -54,7 +57,7 @@ export const DefaultImportPage = () => { return ( -
+
{supportTitle} diff --git a/plugins/catalog-import/src/components/ImportInfoCard/ImportInfoCard.test.tsx b/plugins/catalog-import/src/components/ImportInfoCard/ImportInfoCard.test.tsx index c33de77ffd..caa6be223d 100644 --- a/plugins/catalog-import/src/components/ImportInfoCard/ImportInfoCard.test.tsx +++ b/plugins/catalog-import/src/components/ImportInfoCard/ImportInfoCard.test.tsx @@ -25,6 +25,8 @@ import { screen } from '@testing-library/react'; import React from 'react'; import { CatalogImportApi, catalogImportApiRef } from '../../api'; import { ImportInfoCard } from './ImportInfoCard'; +import { useTranslationRef } from '@backstage/core-plugin-api/alpha'; +import { catalogImportTranslationRef } from '../../translation'; describe('', () => { let apis: TestApiRegistry; @@ -50,6 +52,14 @@ describe('', () => { }); it('renders without exploding', async () => { + let translatedText = ''; + + const TestComponent = () => { + const { t } = useTranslationRef(catalogImportTranslationRef); + translatedText = t('importInfoCard.title'); + return ; + }; + await renderInTestApp( ', () => { [catalogImportApiRef, catalogImportApi], ]} > - + , ); - - expect( - screen.getByText('Register an existing component'), - ).toBeInTheDocument(); + expect(screen.getByText(translatedText)).toBeInTheDocument(); }); it('renders section on GitHub discovery if supported', async () => { diff --git a/plugins/catalog-import/src/components/ImportInfoCard/ImportInfoCard.tsx b/plugins/catalog-import/src/components/ImportInfoCard/ImportInfoCard.tsx index be8a457572..c0790006e5 100644 --- a/plugins/catalog-import/src/components/ImportInfoCard/ImportInfoCard.tsx +++ b/plugins/catalog-import/src/components/ImportInfoCard/ImportInfoCard.tsx @@ -21,6 +21,8 @@ import Typography from '@material-ui/core/Typography'; import React from 'react'; import { catalogImportApiRef } from '../../api'; import { useCatalogFilename } from '../../hooks'; +import { useTranslationRef } from '@backstage/core-plugin-api/alpha'; +import { catalogImportTranslationRef } from '../../translation'; /** * Props for {@link ImportInfoCard}. @@ -43,6 +45,7 @@ export const ImportInfoCard = (props: ImportInfoCardProps) => { exampleRepositoryUrl = 'https://github.com/backstage/backstage', } = props; + const { t } = useTranslationRef(catalogImportTranslationRef); const configApi = useApi(configApiRef); const appTitle = configApi.getOptionalString('app.title') || 'Backstage'; const catalogImportApi = useApi(catalogImportApiRef); @@ -53,7 +56,7 @@ export const ImportInfoCard = (props: ImportInfoCardProps) => { return ( = T extends NestedValue + ? U + : T extends Date | FileList | File | Blob + ? T + : T extends object + ? { + [K in keyof T]: UnpackNestedValue; + } + : T; + /** * Props for {@link StepPrepareCreatePullRequest}. * diff --git a/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/index.ts b/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/index.ts index ce1cd40e19..3340d40f84 100644 --- a/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/index.ts +++ b/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/index.ts @@ -23,4 +23,7 @@ export type { PreviewCatalogInfoComponentProps } from './PreviewCatalogInfoCompo export { PreviewPullRequestComponent } from './PreviewPullRequestComponent'; export type { PreviewPullRequestComponentProps } from './PreviewPullRequestComponent'; export { StepPrepareCreatePullRequest } from './StepPrepareCreatePullRequest'; -export type { StepPrepareCreatePullRequestProps } from './StepPrepareCreatePullRequest'; +export type { + StepPrepareCreatePullRequestProps, + UnpackNestedValue, +} from './StepPrepareCreatePullRequest'; diff --git a/plugins/catalog-import/src/translation.ts b/plugins/catalog-import/src/translation.ts new file mode 100644 index 0000000000..353e09056b --- /dev/null +++ b/plugins/catalog-import/src/translation.ts @@ -0,0 +1,28 @@ +/* + * 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 { createTranslationRef } from '@backstage/core-plugin-api/alpha'; + +/** @alpha */ +export const catalogImportTranslationRef = createTranslationRef({ + id: 'catalog-import', + messages: { + pageTitle: 'Register an existing component', + importInfoCard: { + title: 'Register an existing component', + }, + }, +}); diff --git a/plugins/catalog-react/CHANGELOG.md b/plugins/catalog-react/CHANGELOG.md index 54e3ddd668..a445409f4e 100644 --- a/plugins/catalog-react/CHANGELOG.md +++ b/plugins/catalog-react/CHANGELOG.md @@ -1,5 +1,47 @@ # @backstage/plugin-catalog-react +## 1.16.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/integration-react@1.2.6-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/frontend-test-utils@0.3.1-next.0 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-permission-react@0.4.32 + +## 1.16.1-next.0 + +### Patch Changes + +- 186d016: Add `operation` to alpha `defaultEntityContentGroups`. +- 221ddba: Fix offset pagination to reset when updating filters in `useEntityList` +- Updated dependencies + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/frontend-test-utils@0.3.0 + - @backstage/integration-react@1.2.5 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-permission-react@0.4.32 + ## 1.16.0 ### Minor Changes diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index 07ced3ad6d..8ccce1d5d8 100644 --- a/plugins/catalog-react/package.json +++ b/plugins/catalog-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-react", - "version": "1.16.0", + "version": "1.16.1-next.1", "description": "A frontend library that helps other Backstage plugins interact with the catalog", "backstage": { "role": "web-library", diff --git a/plugins/catalog-unprocessed-entities/CHANGELOG.md b/plugins/catalog-unprocessed-entities/CHANGELOG.md index f0444cc950..d02f2a7dff 100644 --- a/plugins/catalog-unprocessed-entities/CHANGELOG.md +++ b/plugins/catalog-unprocessed-entities/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-catalog-unprocessed-entities +## 0.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + +## 0.2.16-next.0 + +### Patch Changes + +- ba88bfa: Added confirmation popup for delete entities in Catalog Unprocessed Entities plugin +- 2479827: Fixed the `convertTimeToLocalTimezone` function in the FailedEntities component to correctly parse ISO 8601 date strings and set the timezone to the current local timezone. +- Updated dependencies + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.10.0 + ## 0.2.15 ### Patch Changes diff --git a/plugins/catalog-unprocessed-entities/package.json b/plugins/catalog-unprocessed-entities/package.json index d4995d35f3..ec949ef230 100644 --- a/plugins/catalog-unprocessed-entities/package.json +++ b/plugins/catalog-unprocessed-entities/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-unprocessed-entities", - "version": "0.2.15", + "version": "0.2.16-next.1", "backstage": { "role": "frontend-plugin", "pluginId": "catalog-unprocessed-entities", diff --git a/plugins/catalog-unprocessed-entities/src/components/DeleteEntityConfirmationDialog.tsx b/plugins/catalog-unprocessed-entities/src/components/DeleteEntityConfirmationDialog.tsx new file mode 100644 index 0000000000..be93817d69 --- /dev/null +++ b/plugins/catalog-unprocessed-entities/src/components/DeleteEntityConfirmationDialog.tsx @@ -0,0 +1,66 @@ +/* + * Copyright 2021 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 Button from '@material-ui/core/Button'; +import Dialog from '@material-ui/core/Dialog'; +import DialogActions from '@material-ui/core/DialogActions'; +import DialogTitle from '@material-ui/core/DialogTitle'; +import React, { useState } from 'react'; +import { assertError } from '@backstage/errors'; + +interface DeleteEntityConfirmationProps { + open: boolean; + onClose: () => any; + onConfirm: () => any; +} + +export function DeleteEntityConfirmationDialog( + props: DeleteEntityConfirmationProps, +) { + const { open, onClose, onConfirm } = props; + const [busy, setBusy] = useState(false); + const onDelete = async () => { + setBusy(true); + try { + onConfirm(); + } catch (err) { + assertError(err); + } finally { + setBusy(false); + } + }; + + return ( + + + Are you sure you want to delete this entity? + + + + + + + ); +} diff --git a/plugins/catalog-unprocessed-entities/src/components/FailedEntities.tsx b/plugins/catalog-unprocessed-entities/src/components/FailedEntities.tsx index 65e6eb731e..32a7b42eb4 100644 --- a/plugins/catalog-unprocessed-entities/src/components/FailedEntities.tsx +++ b/plugins/catalog-unprocessed-entities/src/components/FailedEntities.tsx @@ -34,6 +34,7 @@ import { EntityDialog } from './EntityDialog'; import { catalogUnprocessedEntitiesApiRef } from '../api'; import useAsync from 'react-use/esm/useAsync'; import DeleteIcon from '@material-ui/icons/Delete'; +import { DeleteEntityConfirmationDialog } from './DeleteEntityConfirmationDialog'; const useStyles = makeStyles((theme: Theme) => ({ errorBox: { @@ -92,18 +93,15 @@ const RenderErrorContext = ({ * Converts input datetime which lacks timezone info into user's local time so that they can * easily understand the times. */ -const convertTimeToLocalTimezone = (strDateTime: string | Date) => { - const dateTime = DateTime.fromFormat( - strDateTime.toLocaleString(), - 'yyyy-MM-dd hh:mm:ss', - { - zone: 'UTC', - }, - ); +export const convertTimeToLocalTimezone = (dateTime: string | Date) => { + const isoDateTime = + typeof dateTime === 'string' ? dateTime : dateTime.toISOString(); - const dateTimeLocalTz = dateTime.setZone(DateTime.local().zoneName); + const strDateTime = DateTime.fromISO(isoDateTime, { + zone: DateTime.local().zoneName, + }); - return dateTimeLocalTz.toFormat('yyyy-MM-dd hh:mm:ss ZZZZ'); + return strDateTime.toFormat('yyyy-MM-dd hh:mm:ss ZZZZ'); }; export const FailedEntities = () => { @@ -117,6 +115,13 @@ export const FailedEntities = () => { const [, setSelectedSearchTerm] = useState(''); const unprocessedEntityApi = useApi(catalogUnprocessedEntitiesApiRef); const alertApi = useApi(alertApiRef); + const [selectedEntityId, setSelectedEntityId] = useState( + undefined, + ); + const [selectedEntityRef, setSelectedEntityRef] = useState< + string | undefined + >(undefined); + const [confirmationDialogOpen, setConfirmationDialogOpen] = useState(false); if (loading) { return ; @@ -125,25 +130,34 @@ export const FailedEntities = () => { return ; } - const handleDelete = async ({ + const handleDelete = ({ entityId, entityRef, }: { entityId: string; entityRef: string; }) => { + setSelectedEntityId(entityId); + setSelectedEntityRef(entityRef); + setConfirmationDialogOpen(true); + }; + + const cleanUpAfterRemoval = async () => { try { - await unprocessedEntityApi.delete(entityId); - alertApi.post({ - message: `Entity ${entityRef} has been deleted`, - severity: 'success', - }); + if (selectedEntityId) { + await unprocessedEntityApi.delete(selectedEntityId); + alertApi.post({ + message: `Entity ${selectedEntityRef} has been deleted`, + severity: 'success', + }); + } } catch (e) { alertApi.post({ - message: `Ran into an issue when deleting ${entityRef}. Please try again later.`, + message: `Ran into an issue when deleting ${selectedEntityRef}. Please try again later.`, severity: 'error', }); } + setConfirmationDialogOpen(false); }; const columns: TableColumn[] = [ @@ -213,8 +227,8 @@ export const FailedEntities = () => { return ( - await handleDelete({ + onClick={() => + handleDelete({ entityId: entity_id, entityRef: entity_ref, }) @@ -228,37 +242,46 @@ export const FailedEntities = () => { ]; return ( - - No failed entities found - - } - onSearchChange={(searchTerm: string) => setSelectedSearchTerm(searchTerm)} - detailPanel={({ rowData }) => { - const errors = (rowData as UnprocessedEntity).errors; - return ( - <> - {errors?.map((e, idx) => { - return ( - - - {e.name} - - - - - ); - })} - - ); - }} - /> + <> +
+ No failed entities found + + } + onSearchChange={(searchTerm: string) => + setSelectedSearchTerm(searchTerm) + } + detailPanel={({ rowData }) => { + const errors = (rowData as UnprocessedEntity).errors; + return ( + <> + {errors?.map((e, idx) => { + return ( + + + {e.name} + + + + + ); + })} + + ); + }} + /> + setConfirmationDialogOpen(false)} + onConfirm={cleanUpAfterRemoval} + /> + ); }; diff --git a/plugins/catalog-unprocessed-entities/src/plugin.test.ts b/plugins/catalog-unprocessed-entities/src/plugin.test.ts index add3d677f0..ebeb24f4ab 100644 --- a/plugins/catalog-unprocessed-entities/src/plugin.test.ts +++ b/plugins/catalog-unprocessed-entities/src/plugin.test.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { convertTimeToLocalTimezone } from './components/FailedEntities'; import { catalogUnprocessedEntitiesPlugin } from './plugin'; describe('catalog-unprocessed-entities', () => { @@ -20,3 +21,29 @@ describe('catalog-unprocessed-entities', () => { expect(catalogUnprocessedEntitiesPlugin).toBeDefined(); }); }); + +describe('components/FailedEntities/convertTimeToLocalTimezone', () => { + it('should correctly a UTC ISO string to local time', () => { + const utcTime = '2024-09-03T08:15:08.088Z'; + const localTime = convertTimeToLocalTimezone(utcTime); + expect(localTime).toBe('2024-09-03 08:15:08 UTC'); + }); + + it('should correctly convert a UTC Date object to local time', () => { + const utcTime = new Date('2024-09-03T08:15:08.088Z'); + const localTime = convertTimeToLocalTimezone(utcTime); + expect(localTime).toBe('2024-09-03 08:15:08 UTC'); + }); + + it('should return "Invalid Date" for an invalid date string', () => { + const invalidTime = 'invalid-date-string'; + const localTime = convertTimeToLocalTimezone(invalidTime); + expect(localTime).toBe('Invalid DateTime'); + }); + + it('should handle empty string input', () => { + const emptyString = ''; + const localTime = convertTimeToLocalTimezone(emptyString); + expect(localTime).toBe('Invalid DateTime'); + }); +}); diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md index b4bafe3e9f..a1fe022d9e 100644 --- a/plugins/catalog/CHANGELOG.md +++ b/plugins/catalog/CHANGELOG.md @@ -1,5 +1,51 @@ # @backstage/plugin-catalog +## 1.29.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/integration-react@1.2.6-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/plugin-search-react@1.8.8-next.0 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-permission-react@0.4.32 + - @backstage/plugin-scaffolder-common@1.5.10 + - @backstage/plugin-search-common@1.2.17 + +## 1.29.0-next.0 + +### Minor Changes + +- 9454ef9: Added support of filtering based on system columns in catalog table + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/integration-react@1.2.5 + - @backstage/types@1.2.1 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-permission-react@0.4.32 + - @backstage/plugin-scaffolder-common@1.5.10 + - @backstage/plugin-search-common@1.2.17 + - @backstage/plugin-search-react@1.8.7 + ## 1.28.0 ### Minor Changes diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index e8605e0db4..51675d225e 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog", - "version": "1.28.0", + "version": "1.29.0-next.1", "description": "The Backstage plugin for browsing the Backstage catalog", "backstage": { "role": "frontend-plugin", diff --git a/plugins/catalog/src/components/CatalogTable/columns.tsx b/plugins/catalog/src/components/CatalogTable/columns.tsx index d5362badda..87de8bfc91 100644 --- a/plugins/catalog/src/components/CatalogTable/columns.tsx +++ b/plugins/catalog/src/components/CatalogTable/columns.tsx @@ -62,6 +62,18 @@ export const columnFactories = Object.freeze({ return { title: 'System', field: 'resolved.partOfSystemRelationTitle', + customFilterAndSearch: (query, row) => { + if (!row.resolved.partOfSystemRelations) { + return false; + } + + const systemNames = row.resolved.partOfSystemRelations.map( + ref => ref.name, + ); // Extract system names from entityRefs + + const searchText = systemNames.join(', ').toLocaleUpperCase('en-US'); + return searchText.includes(query.toLocaleUpperCase('en-US')); + }, render: ({ resolved }) => ( Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { BackendFeature } from '@backstage/backend-plugin-api'; + +// @public +const eventsModuleBitbucketServerEventRouter: BackendFeature; +export default eventsModuleBitbucketServerEventRouter; +``` diff --git a/plugins/events-backend-module-bitbucket-server/src/index.ts b/plugins/events-backend-module-bitbucket-server/src/index.ts new file mode 100644 index 0000000000..8a765ecfdf --- /dev/null +++ b/plugins/events-backend-module-bitbucket-server/src/index.ts @@ -0,0 +1,23 @@ +/* + * Copyright 2020 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. + */ + +/** + * The module "bitbucket-server" for the Backstage backend plugin "events-backend" + * adding an event router for Bitbucket Server. + * + * @packageDocumentation + */ +export { eventsModuleBitbucketServerEventRouter as default } from './service/eventsModuleBitbucketServerEventRouter'; diff --git a/plugins/events-backend-module-bitbucket-server/src/router/BitbucketServerEventRouter.test.ts b/plugins/events-backend-module-bitbucket-server/src/router/BitbucketServerEventRouter.test.ts new file mode 100644 index 0000000000..6fdb4020f3 --- /dev/null +++ b/plugins/events-backend-module-bitbucket-server/src/router/BitbucketServerEventRouter.test.ts @@ -0,0 +1,53 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { TestEventsService } from '@backstage/plugin-events-backend-test-utils'; +import { BitbucketServerEventRouter } from './BitbucketServerEventRouter'; + +describe('BitbucketServerEventRouter', () => { + const events = new TestEventsService(); + const eventRouter = new BitbucketServerEventRouter({ events }); + const topic = 'bitbucketServer'; + const eventPayload = { test: 'payload' }; + const metadata = { 'x-event-key': 'test:type' }; + + beforeEach(() => { + events.reset(); + }); + + it('subscribed to topic', () => { + eventRouter.subscribe(); + + expect(events.subscribed).toHaveLength(1); + expect(events.subscribed[0].id).toEqual('BitbucketServerEventRouter'); + expect(events.subscribed[0].topics).toEqual([topic]); + }); + + it('no x-event-key', () => { + eventRouter.onEvent({ topic, eventPayload }); + + expect(events.published).toEqual([]); + }); + + it('with x-event-key', () => { + eventRouter.onEvent({ topic, eventPayload, metadata }); + + expect(events.published.length).toBe(1); + expect(events.published[0].topic).toEqual('bitbucketServer.test:type'); + expect(events.published[0].eventPayload).toEqual(eventPayload); + expect(events.published[0].metadata).toEqual(metadata); + }); +}); diff --git a/plugins/events-backend-module-bitbucket-server/src/router/BitbucketServerEventRouter.ts b/plugins/events-backend-module-bitbucket-server/src/router/BitbucketServerEventRouter.ts new file mode 100644 index 0000000000..45031cc5f3 --- /dev/null +++ b/plugins/events-backend-module-bitbucket-server/src/router/BitbucketServerEventRouter.ts @@ -0,0 +1,45 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + EventParams, + EventsService, + SubTopicEventRouter, +} from '@backstage/plugin-events-node'; + +/** + * Subscribes to the generic `bitbucketServer` topic + * and publishes the events under the more concrete sub-topic + * depending on the `x-event-key` provided. + * + * @public + */ +export class BitbucketServerEventRouter extends SubTopicEventRouter { + constructor(options: { events: EventsService }) { + super({ + events: options.events, + topic: 'bitbucketServer', + }); + } + + protected getSubscriberId(): string { + return 'BitbucketServerEventRouter'; + } + + protected determineSubTopic(params: EventParams): string | undefined { + return params.metadata?.['x-event-key'] as string | undefined; + } +} diff --git a/plugins/events-backend-module-bitbucket-server/src/service/eventsModuleBitbucketServerEventRouter.ts b/plugins/events-backend-module-bitbucket-server/src/service/eventsModuleBitbucketServerEventRouter.ts new file mode 100644 index 0000000000..2a8a26358b --- /dev/null +++ b/plugins/events-backend-module-bitbucket-server/src/service/eventsModuleBitbucketServerEventRouter.ts @@ -0,0 +1,44 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { createBackendModule } from '@backstage/backend-plugin-api'; +import { eventsServiceRef } from '@backstage/plugin-events-node'; +import { BitbucketServerEventRouter } from '../router/BitbucketServerEventRouter'; + +/** + * Module for the events-backend plugin, adding an event router for Bitbucket Server. + * + * Registers the `BitbucketServerEventRouter`. + * + * @public + */ +export const eventsModuleBitbucketServerEventRouter = createBackendModule({ + pluginId: 'events', + moduleId: 'bitbucket-server-event-router', + register(env) { + env.registerInit({ + deps: { + events: eventsServiceRef, + }, + async init({ events }) { + const eventRouter = new BitbucketServerEventRouter({ + events, + }); + await eventRouter.subscribe(); + }, + }); + }, +}); diff --git a/plugins/events-backend-module-bitbucket-server/src/service/eventsModuleBitbucketServerRouter.test.ts b/plugins/events-backend-module-bitbucket-server/src/service/eventsModuleBitbucketServerRouter.test.ts new file mode 100644 index 0000000000..a66c000089 --- /dev/null +++ b/plugins/events-backend-module-bitbucket-server/src/service/eventsModuleBitbucketServerRouter.test.ts @@ -0,0 +1,41 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { createServiceFactory } from '@backstage/backend-plugin-api'; +import { startTestBackend } from '@backstage/backend-test-utils'; +import { TestEventsService } from '@backstage/plugin-events-backend-test-utils'; +import { eventsServiceRef } from '@backstage/plugin-events-node'; +import { eventsModuleBitbucketServerEventRouter } from './eventsModuleBitbucketServerEventRouter'; + +describe('eventsModuleBitbucketServerEventRouter', () => { + it('should be correctly wired and set up', async () => { + const events = new TestEventsService(); + const eventsServiceFactory = createServiceFactory({ + service: eventsServiceRef, + deps: {}, + async factory({}) { + return events; + }, + }); + + await startTestBackend({ + features: [eventsServiceFactory, eventsModuleBitbucketServerEventRouter], + }); + + expect(events.subscribed).toHaveLength(1); + expect(events.subscribed[0].id).toEqual('BitbucketServerEventRouter'); + }); +}); diff --git a/plugins/catalog-backend-module-bitbucket-server/src/alpha.ts b/plugins/events-backend-module-bitbucket-server/src/setupTests.ts similarity index 78% rename from plugins/catalog-backend-module-bitbucket-server/src/alpha.ts rename to plugins/events-backend-module-bitbucket-server/src/setupTests.ts index cba672ce49..d3232290a7 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/alpha.ts +++ b/plugins/events-backend-module-bitbucket-server/src/setupTests.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Backstage Authors + * Copyright 2020 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. @@ -14,8 +14,4 @@ * limitations under the License. */ -import { default as feature } from './module'; - -/** @alpha */ -const _feature = feature; -export default _feature; +export {}; diff --git a/plugins/example-todo-list/CHANGELOG.md b/plugins/example-todo-list/CHANGELOG.md index a86064e755..9db0a2b099 100644 --- a/plugins/example-todo-list/CHANGELOG.md +++ b/plugins/example-todo-list/CHANGELOG.md @@ -1,5 +1,13 @@ # @internal/plugin-todo-list +## 1.0.38-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/core-plugin-api@1.10.5 + ## 1.0.37 ### Patch Changes diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json index 9624d38529..5ad9c979b9 100644 --- a/plugins/example-todo-list/package.json +++ b/plugins/example-todo-list/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list", - "version": "1.0.37", + "version": "1.0.38-next.0", "backstage": { "role": "frontend-plugin", "pluginId": "todo-list", diff --git a/plugins/home-react/CHANGELOG.md b/plugins/home-react/CHANGELOG.md index 375a66d89a..f4309d3d88 100644 --- a/plugins/home-react/CHANGELOG.md +++ b/plugins/home-react/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-home-react +## 0.1.25-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/core-plugin-api@1.10.5 + +## 0.1.25-next.0 + +### Patch Changes + +- 2e4cb15: Fixes auto-hiding of content divider when title not specified +- Updated dependencies + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + ## 0.1.24 ### Patch Changes diff --git a/plugins/home-react/package.json b/plugins/home-react/package.json index b93115978e..47d7fff29c 100644 --- a/plugins/home-react/package.json +++ b/plugins/home-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-home-react", - "version": "0.1.24", + "version": "0.1.25-next.1", "description": "A Backstage plugin that contains react components helps you build a home page", "backstage": { "role": "web-library", diff --git a/plugins/home/CHANGELOG.md b/plugins/home/CHANGELOG.md index 269085753f..3fbc06a5a2 100644 --- a/plugins/home/CHANGELOG.md +++ b/plugins/home/CHANGELOG.md @@ -1,5 +1,39 @@ # @backstage/plugin-home +## 0.8.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/plugin-home-react@0.1.25-next.1 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.16.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/theme@0.6.4 + +## 0.8.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/plugin-home-react@0.1.25-next.0 + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.16.0 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/theme@0.6.4 + ## 0.8.6 ### Patch Changes diff --git a/plugins/home/package.json b/plugins/home/package.json index 77f566c84b..a213c7d306 100644 --- a/plugins/home/package.json +++ b/plugins/home/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-home", - "version": "0.8.6", + "version": "0.8.7-next.1", "description": "A Backstage plugin that helps you build a home page", "backstage": { "role": "frontend-plugin", diff --git a/plugins/kubernetes-cluster/CHANGELOG.md b/plugins/kubernetes-cluster/CHANGELOG.md index 23754b7f63..690d94fca9 100644 --- a/plugins/kubernetes-cluster/CHANGELOG.md +++ b/plugins/kubernetes-cluster/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-kubernetes-cluster +## 0.0.24-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/plugin-kubernetes-react@0.5.6-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.5 + - @backstage/plugin-kubernetes-common@0.9.4 + - @backstage/plugin-permission-react@0.4.32 + +## 0.0.24-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/plugin-kubernetes-common@0.9.4 + - @backstage/plugin-kubernetes-react@0.5.5 + - @backstage/plugin-permission-react@0.4.32 + ## 0.0.23 ### Patch Changes diff --git a/plugins/kubernetes-cluster/package.json b/plugins/kubernetes-cluster/package.json index 5a6646fe6a..d94c872871 100644 --- a/plugins/kubernetes-cluster/package.json +++ b/plugins/kubernetes-cluster/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-cluster", - "version": "0.0.23", + "version": "0.0.24-next.1", "description": "A Backstage plugin that shows details of Kubernetes clusters", "backstage": { "role": "frontend-plugin", diff --git a/plugins/kubernetes-react/CHANGELOG.md b/plugins/kubernetes-react/CHANGELOG.md index 9e1024b32e..ce9d9b75f5 100644 --- a/plugins/kubernetes-react/CHANGELOG.md +++ b/plugins/kubernetes-react/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-kubernetes-react +## 0.5.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-kubernetes-common@0.9.4 + ## 0.5.5 ### Patch Changes diff --git a/plugins/kubernetes-react/package.json b/plugins/kubernetes-react/package.json index 4a9d6dd264..bf3b49a6f5 100644 --- a/plugins/kubernetes-react/package.json +++ b/plugins/kubernetes-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-react", - "version": "0.5.5", + "version": "0.5.6-next.0", "description": "Web library for the kubernetes-react plugin", "backstage": { "role": "web-library", diff --git a/plugins/kubernetes/CHANGELOG.md b/plugins/kubernetes/CHANGELOG.md index 71e613138e..643d2ca2e7 100644 --- a/plugins/kubernetes/CHANGELOG.md +++ b/plugins/kubernetes/CHANGELOG.md @@ -1,5 +1,36 @@ # @backstage/plugin-kubernetes +## 0.12.6-next.1 + +### Patch Changes + +- b877e46: Added New Frontend System filter for the Kubernetes tab to use `isKubernetesAvailable` to control its visibility +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/plugin-kubernetes-react@0.5.6-next.0 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.5 + - @backstage/plugin-kubernetes-common@0.9.4 + - @backstage/plugin-permission-react@0.4.32 + +## 0.12.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/plugin-kubernetes-common@0.9.4 + - @backstage/plugin-kubernetes-react@0.5.5 + - @backstage/plugin-permission-react@0.4.32 + ## 0.12.5 ### Patch Changes diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index b683b9eed1..b11016d140 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes", - "version": "0.12.5", + "version": "0.12.6-next.1", "description": "A Backstage plugin that integrates towards Kubernetes", "backstage": { "role": "frontend-plugin", diff --git a/plugins/kubernetes/src/alpha/entityContents.tsx b/plugins/kubernetes/src/alpha/entityContents.tsx index 7b6dc78e4b..2d27cd66b2 100644 --- a/plugins/kubernetes/src/alpha/entityContents.tsx +++ b/plugins/kubernetes/src/alpha/entityContents.tsx @@ -17,6 +17,7 @@ import React from 'react'; import { compatWrapper } from '@backstage/core-compat-api'; import { EntityContentBlueprint } from '@backstage/plugin-catalog-react/alpha'; +import { isKubernetesAvailable } from '../Router'; export const entityKubernetesContent = EntityContentBlueprint.make({ name: 'kubernetes', @@ -24,7 +25,7 @@ export const entityKubernetesContent = EntityContentBlueprint.make({ defaultPath: '/kubernetes', defaultTitle: 'Kubernetes', defaultGroup: 'deployment', - filter: 'kind:component,resource', + filter: isKubernetesAvailable, loader: () => import('./KubernetesContentPage').then(m => compatWrapper(), diff --git a/plugins/notifications-backend-module-slack/.eslintrc.js b/plugins/notifications-backend-module-slack/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/notifications-backend-module-slack/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/notifications-backend-module-slack/CHANGELOG.md b/plugins/notifications-backend-module-slack/CHANGELOG.md new file mode 100644 index 0000000000..09eec1a02b --- /dev/null +++ b/plugins/notifications-backend-module-slack/CHANGELOG.md @@ -0,0 +1,19 @@ +# @backstage/plugin-notifications-backend-module-slack + +## 0.1.0-next.0 + +### Minor Changes + +- 552170d: Added a new Slack NotificationProcessor for use with the notifications plugin + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-notifications-common@0.0.8 + - @backstage/plugin-notifications-node@0.2.13 diff --git a/plugins/notifications-backend-module-slack/README.md b/plugins/notifications-backend-module-slack/README.md new file mode 100644 index 0000000000..f730ede78a --- /dev/null +++ b/plugins/notifications-backend-module-slack/README.md @@ -0,0 +1,5 @@ +# @backstage/plugin-notifications-backend-module-slack + +The Slack backend module for the notifications plugin. + +See [Built-in Processors](https://backstage.io/docs/notifications/processors/#built-in-processors) for detailed documentation diff --git a/plugins/notifications-backend-module-slack/catalog-info.yaml b/plugins/notifications-backend-module-slack/catalog-info.yaml new file mode 100644 index 0000000000..327ae8239f --- /dev/null +++ b/plugins/notifications-backend-module-slack/catalog-info.yaml @@ -0,0 +1,10 @@ +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: backstage-plugin-notifications-backend-module-slack + title: '@backstage/plugin-notifications-backend-module-slack' + description: The slack backend module for the notifications plugin. +spec: + lifecycle: experimental + type: backstage-backend-plugin-module + owner: maintainers diff --git a/plugins/notifications-backend-module-slack/config.d.ts b/plugins/notifications-backend-module-slack/config.d.ts new file mode 100644 index 0000000000..8cd450940e --- /dev/null +++ b/plugins/notifications-backend-module-slack/config.d.ts @@ -0,0 +1,34 @@ +/* + * 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. + */ +export interface Config { + notifications?: { + processors?: { + slack?: Array<{ + /** + * Slack Bot Token. Usually starts with `xoxb-`. + * @visibility secret + */ + token?: string; + /** + * Broadcast notification receivers when receiver is set to config + * These can be Slack User IDs, Slack User Email addresses, Slack Channel + * Names, or Slack Channel IDs. Any valid identifier that chat.postMessage can accept. + */ + broadcastChannels?: string[]; + }>; + }; + }; +} diff --git a/plugins/notifications-backend-module-slack/package.json b/plugins/notifications-backend-module-slack/package.json new file mode 100644 index 0000000000..f288f427dd --- /dev/null +++ b/plugins/notifications-backend-module-slack/package.json @@ -0,0 +1,61 @@ +{ + "name": "@backstage/plugin-notifications-backend-module-slack", + "version": "0.1.0-next.0", + "description": "The slack backend module for the notifications plugin.", + "backstage": { + "role": "backend-plugin-module", + "pluginId": "notifications", + "pluginPackage": "@backstage/plugin-notifications-backend" + }, + "publishConfig": { + "access": "public", + "main": "dist/index.cjs.js", + "types": "dist/index.d.ts" + }, + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/notifications-backend-module-slack" + }, + "license": "Apache-2.0", + "main": "src/index.ts", + "types": "src/index.ts", + "files": [ + "dist", + "config.d.ts" + ], + "scripts": { + "build": "backstage-cli package build", + "clean": "backstage-cli package clean", + "lint": "backstage-cli package lint", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack", + "start": "backstage-cli package start", + "test": "backstage-cli package test" + }, + "dependencies": { + "@backstage/backend-plugin-api": "workspace:^", + "@backstage/catalog-client": "workspace:^", + "@backstage/catalog-model": "workspace:^", + "@backstage/config": "workspace:^", + "@backstage/errors": "workspace:^", + "@backstage/plugin-notifications-common": "workspace:^", + "@backstage/plugin-notifications-node": "workspace:^", + "@backstage/types": "workspace:^", + "@opentelemetry/api": "^1.9.0", + "@slack/bolt": "^3.21.4", + "@slack/types": "^2.14.0", + "@slack/web-api": "^7.5.0", + "dataloader": "^2.0.0", + "p-throttle": "^4.1.1" + }, + "devDependencies": { + "@backstage/backend-test-utils": "workspace:^", + "@backstage/cli": "workspace:^", + "@backstage/plugin-catalog-node": "workspace:^", + "@backstage/test-utils": "workspace:^", + "@faker-js/faker": "^8.4.1", + "msw": "^2.0.0" + }, + "configSchema": "config.d.ts" +} diff --git a/plugins/notifications-backend-module-slack/report.api.md b/plugins/notifications-backend-module-slack/report.api.md new file mode 100644 index 0000000000..3c4ddb494d --- /dev/null +++ b/plugins/notifications-backend-module-slack/report.api.md @@ -0,0 +1,14 @@ +## API Report File for "@backstage/plugin-notifications-backend-module-slack" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { BackendFeature } from '@backstage/backend-plugin-api'; + +// @public +export const ANNOTATION_SLACK_BOT_NOTIFY = 'slack.com/bot-notify'; + +// @public +const notificationsModuleSlack: BackendFeature; +export default notificationsModuleSlack; +``` diff --git a/plugins/notifications-backend-module-slack/src/index.ts b/plugins/notifications-backend-module-slack/src/index.ts new file mode 100644 index 0000000000..f8a9e248f7 --- /dev/null +++ b/plugins/notifications-backend-module-slack/src/index.ts @@ -0,0 +1,24 @@ +/* + * 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. + */ + +/** + * The slack backend module for the notifications plugin. + * + * @packageDocumentation + */ + +export { ANNOTATION_SLACK_BOT_NOTIFY } from './lib'; +export { notificationsModuleSlack as default } from './module'; diff --git a/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.test.ts b/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.test.ts new file mode 100644 index 0000000000..4c891ed3ab --- /dev/null +++ b/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.test.ts @@ -0,0 +1,371 @@ +/* + * 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 { mockServices } from '@backstage/backend-test-utils'; +import { SlackNotificationProcessor } from './SlackNotificationProcessor'; +import { catalogServiceMock } from '@backstage/plugin-catalog-node/testUtils'; +import { WebClient } from '@slack/web-api'; +import { Entity } from '@backstage/catalog-model'; + +jest.mock('@slack/web-api', () => { + const mockSlack = { + chat: { + postMessage: jest.fn(() => ({ + ok: true, + ts: '1234567890.123456', + channel: 'C12345678', + })), + }, + conversations: { + list: jest.fn(() => ({ + ok: true, + channels: [{ id: 'C12345678', name: 'test' }], + })), + }, + users: { + list: jest.fn(() => ({ + ok: true, + members: [ + { + id: 'U12345678', + name: 'test', + profile: { email: 'test@example.com' }, + real_name: 'Test User', + is_bot: false, + is_app_user: false, + deleted: false, + }, + ], + })), + }, + }; + return { WebClient: jest.fn(() => mockSlack) }; +}); + +const DEFAULT_ENTITIES_RESPONSE = { + items: [ + { + kind: 'User', + metadata: { + name: 'mock', + namespace: 'default', + annotations: { + 'slack.com/bot-notify': 'U12345678', + }, + }, + spec: { + type: 'service', + owner: 'group:default/mock', + }, + } as unknown as Entity, + { + kind: 'Group', + metadata: { + name: 'mock', + namespace: 'default', + annotations: { + 'slack.com/bot-notify': 'C12345678', + }, + }, + } as unknown as Entity, + ], +}; + +describe('SlackNotificationProcessor', () => { + const logger = mockServices.logger.mock(); + const auth = mockServices.auth(); + const discovery = mockServices.discovery(); + const config = mockServices.rootConfig({ + data: { + app: { + baseUrl: 'https://example.org', + }, + notifications: { + processors: { + slack: [ + { + token: 'mock-token', + }, + ], + }, + }, + }, + }); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should send a notification to a group', async () => { + const slack = new WebClient(); + + const processor = SlackNotificationProcessor.fromConfig(config, { + auth, + discovery, + logger, + catalog: catalogServiceMock({ + entities: DEFAULT_ENTITIES_RESPONSE.items, + }), + slack, + })[0]; + + await processor.processOptions({ + recipients: { type: 'entity', entityRef: 'group:default/mock' }, + payload: { title: 'notification' }, + }); + + expect(slack.chat.postMessage).toHaveBeenCalledWith({ + channel: 'C12345678', + text: 'notification', + attachments: [ + { + color: '#00A699', + blocks: [ + { + type: 'section', + accessory: { + type: 'button', + text: { + type: 'plain_text', + text: 'View More', + }, + action_id: 'button-action', + }, + }, + { + type: 'context', + elements: [ + { + type: 'plain_text', + text: 'Severity: normal', + emoji: true, + }, + { + type: 'plain_text', + text: 'Topic: N/A', + emoji: true, + }, + ], + }, + ], + fallback: 'notification', + }, + ], + }); + }); + + describe('when a user notification is sent directly', () => { + it('should send a notification to a user', async () => { + const slack = new WebClient(); + + const processor = SlackNotificationProcessor.fromConfig(config, { + auth, + discovery, + logger, + catalog: catalogServiceMock({ + entities: DEFAULT_ENTITIES_RESPONSE.items, + }), + slack, + })[0]; + + await processor.postProcess( + { + origin: 'plugin', + id: '1234', + user: 'user:default/mock', + created: new Date(), + payload: { + title: 'notification', + link: '/catalog/user/default/jane.doe', + }, + }, + { + recipients: { type: 'entity', entityRef: 'user:default/mock' }, + payload: { title: 'notification' }, + }, + ); + + expect(slack.chat.postMessage).toHaveBeenCalledWith({ + channel: 'U12345678', + text: 'notification', + attachments: [ + { + color: '#00A699', + blocks: [ + { + type: 'section', + accessory: { + type: 'button', + text: { + type: 'plain_text', + text: 'View More', + }, + action_id: 'button-action', + }, + }, + { + type: 'context', + elements: [ + { + type: 'plain_text', + text: 'Severity: normal', + emoji: true, + }, + { + type: 'plain_text', + text: 'Topic: N/A', + emoji: true, + }, + ], + }, + ], + fallback: 'notification', + }, + ], + }); + }); + }); + + describe('when a user notification is expanded from a group', () => { + it('should not send a notification', async () => { + const slack = new WebClient(); + + const processor = SlackNotificationProcessor.fromConfig(config, { + auth, + discovery, + logger, + catalog: catalogServiceMock({ + entities: DEFAULT_ENTITIES_RESPONSE.items, + }), + slack, + })[0]; + + await processor.postProcess( + { + origin: 'plugin', + id: '1234', + user: 'user:default/mock', + created: new Date(), + payload: { + title: 'notification', + link: '/catalog/user/default/jane.doe', + }, + }, + { + recipients: { type: 'entity', entityRef: 'group:default/group' }, + payload: { title: 'notification' }, + }, + ); + + expect(slack.chat.postMessage).not.toHaveBeenCalled(); + }); + }); + + describe('when broadcast channels are not configured', () => { + it('should not send broadcast messages', async () => { + const slack = new WebClient(); + + const processor = SlackNotificationProcessor.fromConfig(config, { + auth, + discovery, + logger, + catalog: catalogServiceMock({ + entities: DEFAULT_ENTITIES_RESPONSE.items, + }), + slack, + })[0]; + + await processor.processOptions({ + recipients: { type: 'broadcast' }, + payload: { title: 'notification' }, + }); + + await processor.postProcess( + { + origin: 'plugin', + id: '1234', + user: null, + created: new Date(), + payload: { + title: 'notification', + link: '/catalog/user/default/jane.doe', + }, + }, + { + recipients: { type: 'broadcast' }, + payload: { title: 'notification' }, + }, + ); + expect(slack.chat.postMessage).not.toHaveBeenCalled(); + }); + }); + + describe('when broadcast channels are configured', () => { + it('should send broadcast messages', async () => { + const slack = new WebClient(); + const broadcastConfig = mockServices.rootConfig({ + data: { + app: { + baseUrl: 'https://example.org', + }, + notifications: { + processors: { + slack: [ + { + token: 'mock-token', + broadcastChannels: ['C12345678', 'D12345678'], + }, + ], + }, + }, + }, + }); + + const processor = SlackNotificationProcessor.fromConfig(broadcastConfig, { + auth, + discovery, + logger, + catalog: catalogServiceMock({ + entities: DEFAULT_ENTITIES_RESPONSE.items, + }), + slack, + })[0]; + + await processor.processOptions({ + recipients: { type: 'broadcast' }, + payload: { title: 'notification' }, + }); + + await processor.postProcess( + { + origin: 'plugin', + id: '1234', + user: null, + created: new Date(), + payload: { + title: 'notification', + link: '/catalog/user/default/jane.doe', + }, + }, + { + recipients: { type: 'broadcast' }, + payload: { title: 'notification' }, + }, + ); + expect(slack.chat.postMessage).toHaveBeenCalledTimes(2); + }); + }); +}); diff --git a/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.ts b/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.ts new file mode 100644 index 0000000000..3328c55408 --- /dev/null +++ b/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.ts @@ -0,0 +1,291 @@ +/* + * 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 { + AuthService, + DiscoveryService, + LoggerService, +} from '@backstage/backend-plugin-api'; +import { CatalogApi } from '@backstage/catalog-client'; +import { Entity, parseEntityRef } from '@backstage/catalog-model'; +import { Config } from '@backstage/config'; +import { NotFoundError } from '@backstage/errors'; +import { Notification } from '@backstage/plugin-notifications-common'; +import { + NotificationProcessor, + NotificationSendOptions, +} from '@backstage/plugin-notifications-node'; +import { durationToMilliseconds } from '@backstage/types'; +import { Counter, metrics } from '@opentelemetry/api'; +import { ChatPostMessageArguments, WebClient } from '@slack/web-api'; +import DataLoader from 'dataloader'; +import pThrottle from 'p-throttle'; +import { ANNOTATION_SLACK_BOT_NOTIFY } from './constants'; +import { toChatPostMessageArgs } from './util'; + +export class SlackNotificationProcessor implements NotificationProcessor { + private readonly logger: LoggerService; + private readonly catalog: CatalogApi; + private readonly auth: AuthService; + private readonly slack: WebClient; + private readonly sendNotifications; + private readonly messagesSent: Counter; + private readonly messagesFailed: Counter; + private readonly broadcastChannels?: string[]; + + static fromConfig( + config: Config, + options: { + auth: AuthService; + discovery: DiscoveryService; + logger: LoggerService; + catalog: CatalogApi; + slack?: WebClient; + broadcastChannels?: string[]; + }, + ): SlackNotificationProcessor[] { + const slackConfig = + config.getOptionalConfigArray('notifications.processors.slack') ?? []; + return slackConfig.map(c => { + const token = c.getString('token'); + const slack = options.slack ?? new WebClient(token); + const broadcastChannels = c.getOptionalStringArray('broadcastChannels'); + return new SlackNotificationProcessor({ + slack, + broadcastChannels, + ...options, + }); + }); + } + + private constructor(options: { + slack: WebClient; + auth: AuthService; + discovery: DiscoveryService; + logger: LoggerService; + catalog: CatalogApi; + broadcastChannels?: string[]; + }) { + const { auth, catalog, logger, slack, broadcastChannels } = options; + this.logger = logger; + this.catalog = catalog; + this.auth = auth; + this.slack = slack; + this.broadcastChannels = broadcastChannels; + + const meter = metrics.getMeter('default'); + this.messagesSent = meter.createCounter( + 'notifications.processors.slack.sent.count', + { + description: 'Number of messages sent to Slack successfully', + }, + ); + this.messagesFailed = meter.createCounter( + 'notifications.processors.slack.error.count', + { + description: 'Number of messages that failed to send to Slack', + }, + ); + + const throttle = pThrottle({ + limit: 10, + interval: durationToMilliseconds({ minutes: 1 }), + }); + const throttled = throttle((opts: ChatPostMessageArguments) => + this.sendNotification(opts), + ); + this.sendNotifications = async (opts: ChatPostMessageArguments[]) => { + const results = await Promise.allSettled( + opts.map(message => throttled(message)), + ); + + let successCount = 0; + let failureCount = 0; + + results.forEach(result => { + if (result.status === 'fulfilled') { + successCount++; + } else { + this.logger.error( + `Failed to send Slack channel notification: ${result.reason.message}`, + ); + failureCount++; + } + }); + + this.messagesSent.add(successCount); + this.messagesFailed.add(failureCount); + }; + } + + getName(): string { + return 'SlackNotificationProcessor'; + } + + async processOptions( + options: NotificationSendOptions, + ): Promise { + if (options.recipients.type !== 'entity') { + return options; + } + + const entityRefs = [options.recipients.entityRef].flat(); + + const outbound: ChatPostMessageArguments[] = []; + await Promise.all( + entityRefs.map(async entityRef => { + const compoundEntityRef = parseEntityRef(entityRef); + // skip users as they are sent direct messages + if (compoundEntityRef.kind === 'user') { + return; + } + + let channel; + try { + channel = await this.getSlackNotificationTarget(entityRef); + } catch (error) { + this.logger.error( + `Failed to get Slack channel for entity: ${ + (error as Error).message + }`, + ); + return; + } + + if (!channel) { + this.logger.debug(`No Slack channel found for entity: ${entityRef}`); + return; + } + + this.logger.debug( + `Sending notification with payload: ${JSON.stringify( + options.payload, + )}`, + ); + + const payload = toChatPostMessageArgs({ + channel, + payload: options.payload, + }); + + this.logger.debug( + `Sending Slack channel notification: ${JSON.stringify(payload)}`, + ); + outbound.push(payload); + }), + ); + + console.log('dispatching message'); + await this.sendNotifications(outbound); + + return options; + } + + async postProcess( + notification: Notification, + options: NotificationSendOptions, + ): Promise { + const destinations: string[] = []; + + // Handle broadcast case + if (notification.user === null) { + destinations.push(...(this.broadcastChannels ?? [])); + } else if (options.recipients.type === 'entity') { + // Handle user-specific notification + const entityRefs = [options.recipients.entityRef].flat(); + if (entityRefs.some(e => parseEntityRef(e).kind === 'group')) { + // We've already dispatched a slack channel message, so let's not send a DM. + return; + } + + const destination = await this.getSlackNotificationTarget( + notification.user, + ); + + if (!destination) { + this.logger.error( + `No slack.com/bot-notify annotation found for user: ${notification.user}`, + ); + return; + } + + destinations.push(destination); + } + + // If no destinations, nothing to do + if (destinations.length === 0) { + return; + } + + // Prepare outbound messages + const outbound = destinations.map(channel => + toChatPostMessageArgs({ channel, payload: options.payload }), + ); + + // Log debug info + outbound.forEach(payload => { + this.logger.debug(`Sending notification: ${JSON.stringify(payload)}`); + }); + + // Send notifications + await this.sendNotifications(outbound); + } + + async getEntities( + entityRefs: readonly string[], + ): Promise<(Entity | undefined)[]> { + const { token } = await this.auth.getPluginRequestToken({ + onBehalfOf: await this.auth.getOwnServiceCredentials(), + targetPluginId: 'catalog', + }); + + const response = await this.catalog.getEntitiesByRefs( + { + entityRefs: entityRefs.slice(), + fields: [`metadata.annotations.${ANNOTATION_SLACK_BOT_NOTIFY}`], + }, + { + token, + }, + ); + + return response.items; + } + + async getSlackNotificationTarget( + entityRef: string, + ): Promise { + const entityLoader = new DataLoader( + entityRefs => this.getEntities(entityRefs), + ); + const entity = await entityLoader.load(entityRef); + + if (!entity) { + console.log(`Entity not found: ${entityRef}`); + throw new NotFoundError(`Entity not found: ${entityRef}`); + } + + return entity?.metadata?.annotations?.[ANNOTATION_SLACK_BOT_NOTIFY]; + } + + async sendNotification(args: ChatPostMessageArguments): Promise { + const response = await this.slack.chat.postMessage(args); + + if (!response.ok) { + throw new Error(`Failed to send notification: ${response.error}`); + } + } +} diff --git a/plugins/notifications-backend-module-slack/src/lib/constants.ts b/plugins/notifications-backend-module-slack/src/lib/constants.ts new file mode 100644 index 0000000000..cdf052da7e --- /dev/null +++ b/plugins/notifications-backend-module-slack/src/lib/constants.ts @@ -0,0 +1,29 @@ +/* + * 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. + */ + +/** + * @public + * The annotation key for the entity's Slack ID. This can be + * any valid chat.postMessage destination including: + * - A user ID (U12345678) + * - A channel ID (C12345678) + * - A DM ID (D12345678) + * - A group ID (S12345678) + * + * It can also be a user's email address or a channel name, + * however IDs are preferred. + */ +export const ANNOTATION_SLACK_BOT_NOTIFY = 'slack.com/bot-notify'; diff --git a/plugins/notifications-backend-module-slack/src/lib/index.ts b/plugins/notifications-backend-module-slack/src/lib/index.ts new file mode 100644 index 0000000000..97835063b3 --- /dev/null +++ b/plugins/notifications-backend-module-slack/src/lib/index.ts @@ -0,0 +1,18 @@ +/* + * 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. + */ + +export { SlackNotificationProcessor } from './SlackNotificationProcessor'; +export * from './constants'; diff --git a/plugins/notifications-backend-module-slack/src/lib/types.ts b/plugins/notifications-backend-module-slack/src/lib/types.ts new file mode 100644 index 0000000000..bd87e9656c --- /dev/null +++ b/plugins/notifications-backend-module-slack/src/lib/types.ts @@ -0,0 +1,20 @@ +/* + * 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. + */ + +export interface SlackNotificationOptions { + url: string; + payload: string; +} diff --git a/plugins/notifications-backend-module-slack/src/lib/util.ts b/plugins/notifications-backend-module-slack/src/lib/util.ts new file mode 100644 index 0000000000..5e2adbeec5 --- /dev/null +++ b/plugins/notifications-backend-module-slack/src/lib/util.ts @@ -0,0 +1,94 @@ +/* + * 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 { + NotificationPayload, + NotificationSeverity, +} from '@backstage/plugin-notifications-common'; +import { ChatPostMessageArguments, KnownBlock } from '@slack/web-api'; + +export function toChatPostMessageArgs(options: { + channel: string; + payload: NotificationPayload; +}): ChatPostMessageArguments { + const { channel, payload } = options; + + const args: ChatPostMessageArguments = { + channel, + text: payload.title, + attachments: [ + { + color: getColor(payload.severity), + blocks: toSlackBlockKit(payload), + fallback: payload.title, + }, + ], + }; + + return args; +} + +export function toSlackBlockKit(payload: NotificationPayload): KnownBlock[] { + const { description, link, severity, topic } = payload; + return [ + { + type: 'section', + ...(description && { + text: { + type: 'mrkdwn', + text: description ?? 'No description provided', + }, + }), + accessory: { + type: 'button', + text: { + type: 'plain_text', + text: 'View More', + }, + ...(link && { url: link }), + action_id: 'button-action', + }, + }, + { + type: 'context', + elements: [ + { + type: 'plain_text', + text: `Severity: ${severity ?? 'normal'}`, + emoji: true, + }, + { + type: 'plain_text', + text: `Topic: ${topic ?? 'N/A'}`, + emoji: true, + }, + ], + }, + ]; +} + +function getColor(severity: NotificationSeverity | undefined) { + switch (severity) { + case 'critical': + return '#FF0000'; // Red + case 'high': + return '#FFA500'; // Orange + case 'low': + case 'normal': + default: + return '#00A699'; // Neutral color + } +} diff --git a/plugins/notifications-backend-module-slack/src/module.ts b/plugins/notifications-backend-module-slack/src/module.ts new file mode 100644 index 0000000000..cb096dabba --- /dev/null +++ b/plugins/notifications-backend-module-slack/src/module.ts @@ -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, + createBackendModule, +} from '@backstage/backend-plugin-api'; +import { CatalogClient } from '@backstage/catalog-client'; +import { notificationsProcessingExtensionPoint } from '@backstage/plugin-notifications-node'; +import { SlackNotificationProcessor } from './lib/SlackNotificationProcessor'; + +/** + * The Slack notification processor for use with the notifications plugin. + * This allows sending of notifications via Slack DMs or to channels. + * + * @public + */ +export const notificationsModuleSlack = createBackendModule({ + pluginId: 'notifications', + moduleId: 'slack', + register(reg) { + reg.registerInit({ + deps: { + auth: coreServices.auth, + config: coreServices.rootConfig, + discovery: coreServices.discovery, + logger: coreServices.logger, + notifications: notificationsProcessingExtensionPoint, + }, + async init({ auth, config, discovery, logger, notifications }) { + const catalogClient = new CatalogClient({ + discoveryApi: discovery, + }); + + notifications.addProcessor( + SlackNotificationProcessor.fromConfig(config, { + auth, + discovery, + logger, + catalog: catalogClient, + }), + ); + }, + }); + }, +}); diff --git a/plugins/notifications-backend/CHANGELOG.md b/plugins/notifications-backend/CHANGELOG.md index d6f4073b95..68574f67f6 100644 --- a/plugins/notifications-backend/CHANGELOG.md +++ b/plugins/notifications-backend/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-notifications-backend +## 0.5.5-next.0 + +### Patch Changes + +- 9a6080e: Allow throttling notification sending not to block the system with huge amount of receiving users +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + - @backstage/plugin-notifications-common@0.0.8 + - @backstage/plugin-notifications-node@0.2.13 + - @backstage/plugin-signals-node@0.1.18 + ## 0.5.4 ### Patch Changes diff --git a/plugins/notifications-backend/config.d.ts b/plugins/notifications-backend/config.d.ts new file mode 100644 index 0000000000..5dd795f8d3 --- /dev/null +++ b/plugins/notifications-backend/config.d.ts @@ -0,0 +1,32 @@ +/* + * 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 { HumanDuration } from '@backstage/types'; + +export interface Config { + /** + * Configuration options for notifications-backend + */ + notifications?: { + /** + * Concurrency limit for notification sending, defaults to 10 + */ + concurrencyLimit?: number; + /** + * Throttle duration between notification sending, defaults to 50ms + */ + throttleInterval?: HumanDuration | string; + }; +} diff --git a/plugins/notifications-backend/package.json b/plugins/notifications-backend/package.json index e770465e89..6ff822716d 100644 --- a/plugins/notifications-backend/package.json +++ b/plugins/notifications-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-backend", - "version": "0.5.4", + "version": "0.5.5-next.0", "backstage": { "role": "backend-plugin", "pluginId": "notifications", @@ -26,6 +26,7 @@ "types": "src/index.ts", "files": [ "dist", + "config.d.ts", "migrations/**/*.{js,d.ts}" ], "scripts": { @@ -49,9 +50,11 @@ "@backstage/plugin-notifications-common": "workspace:^", "@backstage/plugin-notifications-node": "workspace:^", "@backstage/plugin-signals-node": "workspace:^", + "@backstage/types": "workspace:^", "express": "^4.17.1", "express-promise-router": "^4.1.0", "knex": "^3.0.0", + "p-throttle": "^4.1.1", "uuid": "^11.0.0", "winston": "^3.2.1", "yn": "^4.0.0" @@ -68,5 +71,6 @@ "@types/supertest": "^2.0.8", "msw": "^1.0.0", "supertest": "^7.0.0" - } + }, + "configSchema": "config.d.ts" } diff --git a/plugins/notifications-backend/src/service/router.ts b/plugins/notifications-backend/src/service/router.ts index 88b327a025..89639e3abf 100644 --- a/plugins/notifications-backend/src/service/router.ts +++ b/plugins/notifications-backend/src/service/router.ts @@ -50,7 +50,9 @@ import { } from '@backstage/plugin-notifications-common'; import { parseEntityOrderFieldParams } from './parseEntityOrderFieldParams'; import { getUsersForEntityRef } from './getUsersForEntityRef'; -import { Config } from '@backstage/config'; +import { Config, readDurationFromConfig } from '@backstage/config'; +import { durationToMilliseconds } from '@backstage/types'; +import pThrottle from 'p-throttle'; /** @internal */ export interface RouterOptions { @@ -84,6 +86,19 @@ export async function createRouter( const WEB_NOTIFICATION_CHANNEL = 'Web'; const store = await DatabaseNotificationsStore.create({ database }); const frontendBaseUrl = config.getString('app.baseUrl'); + const concurrencyLimit = + config.getOptionalNumber('notifications.concurrencyLimit') ?? 10; + const throttleInterval = config.has('notifications.throttleInterval') + ? durationToMilliseconds( + readDurationFromConfig(config, { + key: 'notifications.throttleInterval', + }), + ) + : 50; + const throttle = pThrottle({ + limit: concurrencyLimit, + interval: throttleInterval, + }); const getUser = async (req: Request) => { const credentials = await httpAuth.credentials(req, { allow: ['user'] }); @@ -524,67 +539,79 @@ export async function createRouter( return notification; }; + const sendUserNotification = async ( + baseNotification: Omit, + user: string, + opts: NotificationSendOptions, + origin: string, + scope?: string, + ): Promise => { + const userNotification = { + ...baseNotification, + id: uuid(), + user, + }; + const notification = await preProcessNotification(userNotification, opts); + + const enabled = await isNotificationsEnabled({ + user, + channel: WEB_NOTIFICATION_CHANNEL, + origin: userNotification.origin, + }); + + let ret = notification; + + if (!enabled) { + postProcessNotification(ret, opts); + return undefined; + } + + let existingNotification; + if (scope) { + existingNotification = await store.getExistingScopeNotification({ + user, + scope, + origin, + }); + } + + if (existingNotification) { + const restored = await store.restoreExistingNotification({ + id: existingNotification.id, + notification, + }); + ret = restored ?? notification; + } else { + await store.saveNotification(notification); + } + + if (signals) { + await signals.publish({ + recipients: { type: 'user', entityRef: [user] }, + message: { + action: 'new_notification', + notification_id: ret.id, + }, + channel: 'notifications', + }); + } + postProcessNotification(ret, opts); + return ret; + }; + const sendUserNotifications = async ( baseNotification: Omit, users: string[], opts: NotificationSendOptions, origin: string, - ) => { - const notifications = []; + ): Promise => { const { scope } = opts.payload; const uniqueUsers = [...new Set(users)]; - for (const user of uniqueUsers) { - const userNotification = { - ...baseNotification, - id: uuid(), - user, - }; - const notification = await preProcessNotification(userNotification, opts); - - const enabled = await isNotificationsEnabled({ - user, - channel: WEB_NOTIFICATION_CHANNEL, - origin: userNotification.origin, - topic: userNotification.payload.topic ?? null, - }); - - let ret = notification; - if (enabled) { - let existingNotification; - if (scope) { - existingNotification = await store.getExistingScopeNotification({ - user, - scope, - origin, - }); - } - - if (existingNotification) { - const restored = await store.restoreExistingNotification({ - id: existingNotification.id, - notification, - }); - ret = restored ?? notification; - } else { - await store.saveNotification(notification); - } - - notifications.push(ret); - - if (signals) { - await signals.publish({ - recipients: { type: 'user', entityRef: [user] }, - message: { - action: 'new_notification', - notification_id: ret.id, - }, - channel: 'notifications', - }); - } - } - postProcessNotification(ret, opts); - } - return notifications; + const throttled = throttle((user: string) => + sendUserNotification(baseNotification, user, opts, origin, scope), + ); + const sent = await Promise.all(uniqueUsers.map(user => throttled(user))); + return sent.filter(n => n !== undefined); }; const createNotificationHandler = async ( diff --git a/plugins/notifications/CHANGELOG.md b/plugins/notifications/CHANGELOG.md index 8aa3efaffd..9239f7ebb2 100644 --- a/plugins/notifications/CHANGELOG.md +++ b/plugins/notifications/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-notifications +## 0.5.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/theme@0.6.4 + - @backstage/types@1.2.1 + - @backstage/plugin-notifications-common@0.0.8 + - @backstage/plugin-signals-react@0.0.11 + +## 0.5.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/theme@0.6.4 + - @backstage/types@1.2.1 + - @backstage/plugin-notifications-common@0.0.8 + - @backstage/plugin-signals-react@0.0.11 + ## 0.5.3 ### Patch Changes diff --git a/plugins/notifications/package.json b/plugins/notifications/package.json index 9c66c05cf5..c3a6030069 100644 --- a/plugins/notifications/package.json +++ b/plugins/notifications/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications", - "version": "0.5.3", + "version": "0.5.4-next.1", "backstage": { "role": "frontend-plugin", "pluginId": "notifications", diff --git a/plugins/org-react/CHANGELOG.md b/plugins/org-react/CHANGELOG.md index 70743c2733..39ac9cf87d 100644 --- a/plugins/org-react/CHANGELOG.md +++ b/plugins/org-react/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-org-react +## 0.1.37-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.5 + +## 0.1.37-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + ## 0.1.36 ### Patch Changes diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json index 3b653e5a1d..63123b63fd 100644 --- a/plugins/org-react/package.json +++ b/plugins/org-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-org-react", - "version": "0.1.36", + "version": "0.1.37-next.1", "backstage": { "role": "web-library", "pluginId": "org", diff --git a/plugins/org/CHANGELOG.md b/plugins/org/CHANGELOG.md index 3fbdfa88d1..beeeee1a39 100644 --- a/plugins/org/CHANGELOG.md +++ b/plugins/org/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-org +## 0.6.38-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.5 + - @backstage/plugin-catalog-common@1.1.3 + +## 0.6.38-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/plugin-catalog-common@1.1.3 + ## 0.6.37 ### Patch Changes diff --git a/plugins/org/package.json b/plugins/org/package.json index ecbe5fd918..c56e049230 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-org", - "version": "0.6.37", + "version": "0.6.38-next.1", "description": "A Backstage plugin that helps you create entity pages for your organization", "backstage": { "role": "frontend-plugin", diff --git a/plugins/scaffolder-backend-module-azure/CHANGELOG.md b/plugins/scaffolder-backend-module-azure/CHANGELOG.md index 37ff6ad5d9..eb1279bf8c 100644 --- a/plugins/scaffolder-backend-module-azure/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-azure/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-scaffolder-backend-module-azure +## 0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.2.8-next.0 + +### Patch Changes + +- 2bd41ce: Made "publish:azure" action idempotent +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + ## 0.2.7 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-azure/package.json b/plugins/scaffolder-backend-module-azure/package.json index bb8bfc1fae..acbb54b2fb 100644 --- a/plugins/scaffolder-backend-module-azure/package.json +++ b/plugins/scaffolder-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-azure", - "version": "0.2.7", + "version": "0.2.8-next.1", "description": "The azure module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md index dd7a76b272..f833b965db 100644 --- a/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket-cloud +## 0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.29-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.2.8-next.0 + +### Patch Changes + +- 5266f1c: Made "publish:bitbucketCloud" action idempotent +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + - @backstage/plugin-bitbucket-cloud-common@0.2.28 + ## 0.2.7 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket-cloud/package.json b/plugins/scaffolder-backend-module-bitbucket-cloud/package.json index 4b5f7cc20d..1d9f875093 100644 --- a/plugins/scaffolder-backend-module-bitbucket-cloud/package.json +++ b/plugins/scaffolder-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-bitbucket-cloud", - "version": "0.2.7", + "version": "0.2.8-next.1", "description": "The Bitbucket Cloud module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md index 05cec9755f..10f6cf2992 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket-server +## 0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + ## 0.2.7 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket-server/package.json b/plugins/scaffolder-backend-module-bitbucket-server/package.json index a3991ed872..d942fb7a55 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/package.json +++ b/plugins/scaffolder-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-bitbucket-server", - "version": "0.2.7", + "version": "0.2.8-next.1", "description": "The Bitbucket Server module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md index ea1b89fcf3..9e4d841858 100644 --- a/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket +## 0.3.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.8-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.8-next.1 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.3.9-next.0 + +### Patch Changes + +- adfceee: Made "publish:bitbucket" action idempotent +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.8-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.8-next.0 + ## 0.3.8 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket/package.json b/plugins/scaffolder-backend-module-bitbucket/package.json index eef31dcc09..7217cdb054 100644 --- a/plugins/scaffolder-backend-module-bitbucket/package.json +++ b/plugins/scaffolder-backend-module-bitbucket/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-bitbucket", - "version": "0.3.8", + "version": "0.3.9-next.1", "description": "The bitbucket module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md index 31f14f6e83..a2faa7cf76 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-scaffolder-backend-module-confluence-to-markdown +## 0.3.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + ## 0.3.7 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json index 68b6e95a32..025b614a8c 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown", - "version": "0.3.7", + "version": "0.3.8-next.1", "description": "The confluence-to-markdown module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md index df7962c753..c07405d001 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-scaffolder-backend-module-cookiecutter +## 0.3.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.3.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + - @backstage/types@1.2.1 + ## 0.3.8 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index cb0024a8c7..fb0dce7ddc 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/package.json +++ b/plugins/scaffolder-backend-module-cookiecutter/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-cookiecutter", - "version": "0.3.8", + "version": "0.3.9-next.1", "description": "A module for the scaffolder backend that lets you template projects using cookiecutter", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gcp/CHANGELOG.md b/plugins/scaffolder-backend-module-gcp/CHANGELOG.md index 2c7f7aad50..ec8f638590 100644 --- a/plugins/scaffolder-backend-module-gcp/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gcp/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-scaffolder-backend-module-gcp +## 0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + ## 0.2.7 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gcp/package.json b/plugins/scaffolder-backend-module-gcp/package.json index 5bbf4fe25d..10512a0ca8 100644 --- a/plugins/scaffolder-backend-module-gcp/package.json +++ b/plugins/scaffolder-backend-module-gcp/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gcp", - "version": "0.2.7", + "version": "0.2.8-next.1", "description": "The GCP Bucket module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md b/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md index 0fd6b23927..ba63ff39ce 100644 --- a/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-scaffolder-backend-module-gerrit +## 0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + ## 0.2.7 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gerrit/package.json b/plugins/scaffolder-backend-module-gerrit/package.json index dbfdc9c4e6..2c74335ddd 100644 --- a/plugins/scaffolder-backend-module-gerrit/package.json +++ b/plugins/scaffolder-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gerrit", - "version": "0.2.7", + "version": "0.2.8-next.1", "description": "The gerrit module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gitea/CHANGELOG.md b/plugins/scaffolder-backend-module-gitea/CHANGELOG.md index ede7fe2edd..b4ab7628a0 100644 --- a/plugins/scaffolder-backend-module-gitea/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gitea/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-scaffolder-backend-module-gitea +## 0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + ## 0.2.7 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gitea/package.json b/plugins/scaffolder-backend-module-gitea/package.json index 4dfe6a7f7a..d502d40204 100644 --- a/plugins/scaffolder-backend-module-gitea/package.json +++ b/plugins/scaffolder-backend-module-gitea/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gitea", - "version": "0.2.7", + "version": "0.2.8-next.1", "description": "The gitea module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-github/CHANGELOG.md b/plugins/scaffolder-backend-module-github/CHANGELOG.md index 63d9cb5f3f..c5f8dbe963 100644 --- a/plugins/scaffolder-backend-module-github/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-github/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-scaffolder-backend-module-github +## 0.6.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.6.2-next.0 + +### Patch Changes + +- 1af427a: Made "github:autolinks:create" action idempotent +- 180ea6e: Made "github:branch-protection:create" action idempotent +- 0be1a1e: Made "publish:github" action idempotent +- a833f0f: Made "github:actions:dispatch" action idempotent +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + - @backstage/types@1.2.1 + ## 0.6.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-github/package.json b/plugins/scaffolder-backend-module-github/package.json index bcd05269b6..34a8b14f41 100644 --- a/plugins/scaffolder-backend-module-github/package.json +++ b/plugins/scaffolder-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-github", - "version": "0.6.1", + "version": "0.6.2-next.1", "description": "The github module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md index 8b6c0cf382..2571c4cdf6 100644 --- a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-scaffolder-backend-module-gitlab +## 0.8.2-next.1 + +### Patch Changes + +- 003dc15: Updated the path field in the `gitlab:group:ensureExists` action to support also strings with multiple segments (e.g. `group/subgroup`) +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.8.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + ## 0.8.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gitlab/package.json b/plugins/scaffolder-backend-module-gitlab/package.json index c241a45114..34c66e3f61 100644 --- a/plugins/scaffolder-backend-module-gitlab/package.json +++ b/plugins/scaffolder-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gitlab", - "version": "0.8.1", + "version": "0.8.2-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.examples.test.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.examples.test.ts index eaeb65ae9c..4d8e0fd0c0 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.examples.test.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.examples.test.ts @@ -243,4 +243,55 @@ describe('gitlab:group:ensureExists', () => { expect(mockContext.output).toHaveBeenCalledWith('groupId', 3); }); + + it(`Should ${examples[5].description}`, async () => { + mockGitlabClient.Groups.search.mockResolvedValue([ + { + id: 1, + full_path: 'group1', + }, + { + id: 2, + full_path: 'group1/group2', + }, + { + id: 3, + full_path: 'group1/group2/group3', + }, + ]); + mockGitlabClient.Groups.create.mockResolvedValue({ + id: 4, + full_path: 'group1/group2/group3/group4', + }); + + const config = new ConfigReader({ + integrations: { + gitlab: [ + { + host: 'gitlab.com', + token: 'tokenlols', + apiBaseUrl: 'https://api.gitlab.com', + }, + ], + }, + }); + const integrations = ScmIntegrations.fromConfig(config); + + const action = createGitlabGroupEnsureExistsAction({ integrations }); + + await action.handler({ + ...mockContext, + input: yaml.parse(examples[5].example).steps[0].input, + }); + + expect(mockGitlabClient.Groups.create).toHaveBeenCalledWith( + 'Group 4', + 'group4', + { + parentId: 3, + }, + ); + + expect(mockContext.output).toHaveBeenCalledWith('groupId', 4); + }); }); diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.examples.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.examples.ts index bbe7ad4722..f379bd38ec 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.examples.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.examples.ts @@ -102,4 +102,25 @@ export const examples: TemplateExample[] = [ ], }), }, + { + description: + 'Create a group nested within another group using path and objects', + example: yaml.stringify({ + steps: [ + { + id: 'gitlabGroup', + name: 'Group', + action: 'gitlab:group:ensureExists', + input: { + repoUrl: 'gitlab.com', + path: [ + 'group1/group2', + { name: 'Group 3', slug: 'group3' }, + { name: 'Group 4', slug: 'group4' }, + ], + }, + }, + ], + }), + }, ]; diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.test.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.test.ts index f9dc12eb54..3d703eb91f 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.test.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.test.ts @@ -94,6 +94,38 @@ describe('gitlab:group:ensureExists', () => { expect(mockContext.output).toHaveBeenCalledWith('groupId', 3); }); + it('should create a new group from pathstring if it does not exists', async () => { + mockGitlabClient.Groups.search.mockResolvedValue([ + { + id: 1, + full_path: 'bar', + }, + { + id: 2, + full_path: 'foo', + }, + ]); + + mockGitlabClient.Groups.create.mockResolvedValue({ + id: 3, + full_path: 'foo/bar', + }); + + await action.handler({ + ...mockContext, + input: { + repoUrl: 'gitlab.com?repo=repo&owner=owner', + path: ['foo/bar', 'baz'], + }, + }); + + expect(mockGitlabClient.Groups.create).toHaveBeenCalledWith('bar', 'bar', { + parentId: 2, + }); + + expect(mockContext.output).toHaveBeenCalledWith('groupId', 3); + }); + it('should create a new group from object if it does not exists', async () => { mockGitlabClient.Groups.search.mockResolvedValue([ { diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.ts index 5be5b7c10d..7e5b03ce04 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.ts @@ -76,11 +76,7 @@ export const createGitlabGroupEnsureExistsAction = (options: { let currentPath: string | null = null; let parentId: number | null = null; - for (const pathElement of path) { - const slug = - typeof pathElement === 'string' ? pathElement : pathElement.slug; - const name = - typeof pathElement === 'string' ? pathElement : pathElement.name; + for (const { name, slug } of pathIterator(path)) { const fullPath: string = currentPath ? `${currentPath}/${slug}` : slug; const result = (await api.Groups.search( fullPath, @@ -119,3 +115,19 @@ export const createGitlabGroupEnsureExistsAction = (options: { }, }); }; + +type PathPart = { name: string; slug: string }; +type PathItem = string | PathPart; + +function* pathIterator(items: PathItem[]): Generator { + for (const item of items) { + if (typeof item === 'string') { + const parts = item.split('/'); + for (const part of parts) { + yield { name: part, slug: part }; + } + } else { + yield item; + } + } +} diff --git a/plugins/scaffolder-backend-module-notifications/CHANGELOG.md b/plugins/scaffolder-backend-module-notifications/CHANGELOG.md index 74a5e47108..3d38259bfe 100644 --- a/plugins/scaffolder-backend-module-notifications/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-notifications/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-scaffolder-backend-module-notifications +## 0.1.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/plugin-notifications-common@0.0.8 + - @backstage/plugin-notifications-node@0.2.13 + +## 0.1.9-next.0 + +### Patch Changes + +- 25a7675: Made "notification:send" action idempotent +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/plugin-notifications-common@0.0.8 + - @backstage/plugin-notifications-node@0.2.13 + ## 0.1.8 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-notifications/package.json b/plugins/scaffolder-backend-module-notifications/package.json index 826a44feaf..7e3b71ee6e 100644 --- a/plugins/scaffolder-backend-module-notifications/package.json +++ b/plugins/scaffolder-backend-module-notifications/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-notifications", - "version": "0.1.8", + "version": "0.1.9-next.1", "description": "The notifications backend module for the scaffolder plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-rails/CHANGELOG.md b/plugins/scaffolder-backend-module-rails/CHANGELOG.md index e1d3e9ff95..b2f7421991 100644 --- a/plugins/scaffolder-backend-module-rails/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-rails/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-scaffolder-backend-module-rails +## 0.5.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.5.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + - @backstage/types@1.2.1 + ## 0.5.7 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index 879d550e8e..446a5a509d 100644 --- a/plugins/scaffolder-backend-module-rails/package.json +++ b/plugins/scaffolder-backend-module-rails/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-rails", - "version": "0.5.7", + "version": "0.5.8-next.1", "description": "A module for the scaffolder backend that lets you template projects using Rails", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md index 5cd2bd197f..3af02bb084 100644 --- a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-scaffolder-backend-module-sentry +## 0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.2.8-next.0 + +### Patch Changes + +- dcda66a: Made "sentry:project:create" action idempotent +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + ## 0.2.7 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-sentry/package.json b/plugins/scaffolder-backend-module-sentry/package.json index 95d01beff8..8d6b9a54a3 100644 --- a/plugins/scaffolder-backend-module-sentry/package.json +++ b/plugins/scaffolder-backend-module-sentry/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-sentry", - "version": "0.2.7", + "version": "0.2.8-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md index ecf673d86d..36299ace6c 100644 --- a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-scaffolder-backend-module-yeoman +## 0.4.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/types@1.2.1 + - @backstage/plugin-scaffolder-node-test-utils@0.2.1-next.1 + +## 0.4.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/types@1.2.1 + - @backstage/plugin-scaffolder-node-test-utils@0.2.1-next.0 + ## 0.4.8 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-yeoman/package.json b/plugins/scaffolder-backend-module-yeoman/package.json index dc61954d69..8efae44eed 100644 --- a/plugins/scaffolder-backend-module-yeoman/package.json +++ b/plugins/scaffolder-backend-module-yeoman/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-yeoman", - "version": "0.4.8", + "version": "0.4.9-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-backend/CHANGELOG.md b/plugins/scaffolder-backend/CHANGELOG.md index e608265d9d..052b828922 100644 --- a/plugins/scaffolder-backend/CHANGELOG.md +++ b/plugins/scaffolder-backend/CHANGELOG.md @@ -1,5 +1,72 @@ # @backstage/plugin-scaffolder-backend +## 1.32.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend-module-gitlab@0.8.2-next.1 + - @backstage/integration@1.16.3-next.0 + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/plugin-bitbucket-cloud-common@0.2.29-next.0 + - @backstage/plugin-scaffolder-backend-module-azure@0.2.8-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.9-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.8-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.8-next.1 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.8-next.1 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.8-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.6.2-next.1 + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.6 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-scaffolder-common@1.5.10 + +## 1.32.0-next.0 + +### Minor Changes + +- 75e4db4: add template-extensions scaffolder service endpoint + +### Patch Changes + +- 497d47a: Document the internal built-in filters, and ensure that the types are validated when using `createTemplateFilter` and `createTemplateGlobalFunction` from the `zod` schema. +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/plugin-scaffolder-backend-module-azure@0.2.8-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.9-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.6.2-next.0 + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.8-next.0 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + - @backstage/types@1.2.1 + - @backstage/plugin-bitbucket-cloud-common@0.2.28 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.6 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-events-node@0.4.9 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.8-next.0 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.8-next.0 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.8-next.0 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.8.2-next.0 + - @backstage/plugin-scaffolder-common@1.5.10 + ## 1.31.0 ### Minor Changes diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index 7285d674a6..b60539ef06 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend", - "version": "1.31.0", + "version": "1.32.0-next.1", "description": "The Backstage backend plugin that helps you create new things", "backstage": { "role": "backend-plugin", diff --git a/plugins/scaffolder-node-test-utils/CHANGELOG.md b/plugins/scaffolder-node-test-utils/CHANGELOG.md index 42097d4520..bc80cf2fd7 100644 --- a/plugins/scaffolder-node-test-utils/CHANGELOG.md +++ b/plugins/scaffolder-node-test-utils/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-scaffolder-node-test-utils +## 0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.1 + - @backstage/backend-test-utils@1.3.2-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/types@1.2.1 + +## 0.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.8.1-next.0 + - @backstage/backend-test-utils@1.3.2-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/types@1.2.1 + ## 0.2.0 ### Minor Changes diff --git a/plugins/scaffolder-node-test-utils/package.json b/plugins/scaffolder-node-test-utils/package.json index 2dcb8b8bbf..de0f9cceab 100644 --- a/plugins/scaffolder-node-test-utils/package.json +++ b/plugins/scaffolder-node-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-node-test-utils", - "version": "0.2.0", + "version": "0.2.1-next.1", "backstage": { "role": "node-library", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-node/CHANGELOG.md b/plugins/scaffolder-node/CHANGELOG.md index 2cb1c30072..abf4493e88 100644 --- a/plugins/scaffolder-node/CHANGELOG.md +++ b/plugins/scaffolder-node/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-scaffolder-node +## 0.8.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-model@1.7.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-scaffolder-common@1.5.10 + +## 0.8.1-next.0 + +### Patch Changes + +- 497d47a: Document the internal built-in filters, and ensure that the types are validated when using `createTemplateFilter` and `createTemplateGlobalFunction` from the `zod` schema. +- Updated dependencies + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-model@1.7.3 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + - @backstage/types@1.2.1 + - @backstage/plugin-scaffolder-common@1.5.10 + ## 0.8.0 ### Minor Changes diff --git a/plugins/scaffolder-node/package.json b/plugins/scaffolder-node/package.json index a3c2921be9..d9185cb24e 100644 --- a/plugins/scaffolder-node/package.json +++ b/plugins/scaffolder-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-node", - "version": "0.8.0", + "version": "0.8.1-next.1", "description": "The plugin-scaffolder-node module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "node-library", diff --git a/plugins/scaffolder-react/CHANGELOG.md b/plugins/scaffolder-react/CHANGELOG.md index 0b16b94983..e2ab979102 100644 --- a/plugins/scaffolder-react/CHANGELOG.md +++ b/plugins/scaffolder-react/CHANGELOG.md @@ -1,5 +1,44 @@ # @backstage/plugin-scaffolder-react +## 1.15.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.5 + - @backstage/theme@0.6.4 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-permission-react@0.4.32 + - @backstage/plugin-scaffolder-common@1.5.10 + +## 1.15.0-next.0 + +### Minor Changes + +- 5890016: add api to retrieve template extensions info from scaffolder-backend + +### Patch Changes + +- 6ed42b7: Scaffolding - Template card - button to show template entity detail +- Updated dependencies + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/theme@0.6.4 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-permission-react@0.4.32 + - @backstage/plugin-scaffolder-common@1.5.10 + ## 1.14.6 ### Patch Changes diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index 6247bbe1d3..79a3c6f411 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-react", - "version": "1.14.6", + "version": "1.15.0-next.1", "description": "A frontend library that helps other Backstage plugins interact with the Scaffolder", "backstage": { "role": "web-library", diff --git a/plugins/scaffolder-react/report.api.md b/plugins/scaffolder-react/report.api.md index d62a2b43d4..23a8a5975d 100644 --- a/plugins/scaffolder-react/report.api.md +++ b/plugins/scaffolder-react/report.api.md @@ -55,11 +55,8 @@ export type Action = { examples?: ActionExample[]; }; -// @public -export type ActionExample = { - description: string; - example: string; -}; +// @public @deprecated +export type ActionExample = ScaffolderUsageExample; // @public export function createScaffolderFieldExtension< @@ -168,6 +165,15 @@ export type LayoutTemplate = NonNullable< // @public export type ListActionsResponse = Array; +// @public +export type ListTemplateExtensionsResponse = { + filters: Record; + globals: { + functions: Record; + values: Record; + }; +}; + // @public export type LogEvent = { type: 'log' | 'completion' | 'cancelled' | 'recovered'; @@ -241,6 +247,7 @@ export interface ScaffolderApi { tasks: ScaffolderTask[]; totalTasks?: number; }>; + listTemplateExtensions?(): Promise; retry?(taskId: string): Promise; scaffold( options: ScaffolderScaffoldOptions, @@ -492,6 +499,13 @@ export type ScaffolderTaskStatus = | 'processing' | 'skipped'; +// @public +export type ScaffolderUsageExample = { + description?: string; + example: string; + notes?: string; +}; + // @public export interface ScaffolderUseTemplateSecrets { // (undocumented) @@ -523,6 +537,33 @@ export type TaskStream = { output?: ScaffolderTaskOutput; }; +// @public +export type TemplateFilter = { + description?: string; + schema?: { + input?: JSONSchema7; + arguments?: JSONSchema7[]; + output?: JSONSchema7; + }; + examples?: ScaffolderUsageExample[]; +}; + +// @public +export type TemplateGlobalFunction = { + description?: string; + schema?: { + arguments?: JSONSchema7[]; + output?: JSONSchema7; + }; + examples?: ScaffolderUsageExample[]; +}; + +// @public +export type TemplateGlobalValue = { + description?: string; + value: JsonValue; +}; + // @public (undocumented) export type TemplateGroupFilter = { title?: React.ReactNode; diff --git a/plugins/scaffolder-react/src/api/types.ts b/plugins/scaffolder-react/src/api/types.ts index 8e4d989a55..cb73704010 100644 --- a/plugins/scaffolder-react/src/api/types.ts +++ b/plugins/scaffolder-react/src/api/types.ts @@ -45,15 +45,24 @@ export type ScaffolderTask = { }; /** - * A single action example + * A single scaffolder usage example * * @public */ -export type ActionExample = { - description: string; +export type ScaffolderUsageExample = { + description?: string; example: string; + notes?: string; }; +/** + * A single action example + * + * @public + * @deprecated in favor of ScaffolderUsageExample + */ +export type ActionExample = ScaffolderUsageExample; + /** * The response shape for a single action in the `listActions` call to the `scaffolder-backend` * @@ -76,6 +85,58 @@ export type Action = { */ export type ListActionsResponse = Array; +/** + * The response shape for a single filter in the `listTemplateExtensions` call to the `scaffolder-backend` + * + * @public + */ +export type TemplateFilter = { + description?: string; + schema?: { + input?: JSONSchema7; + arguments?: JSONSchema7[]; + output?: JSONSchema7; + }; + examples?: ScaffolderUsageExample[]; +}; + +/** + * The response shape for a single global function in the `listTemplateExtensions` call to the `scaffolder-backend` + * + * @public + */ +export type TemplateGlobalFunction = { + description?: string; + schema?: { + arguments?: JSONSchema7[]; + output?: JSONSchema7; + }; + examples?: ScaffolderUsageExample[]; +}; + +/** + * The response shape for a single global value in the `listTemplateExtensions` call to the `scaffolder-backend` + * + * @public + */ +export type TemplateGlobalValue = { + description?: string; + value: JsonValue; +}; + +/** + * The response shape for the `listTemplateExtensions` call to the `scaffolder-backend` + * + * @public + */ +export type ListTemplateExtensionsResponse = { + filters: Record; + globals: { + functions: Record; + values: Record; + }; +}; + /** @public */ export type ScaffolderOutputLink = { title?: string; @@ -236,6 +297,11 @@ export interface ScaffolderApi { */ listActions(): Promise; + /** + * Returns a structure describing the available templating extensions. + */ + listTemplateExtensions?(): Promise; + streamLogs(options: ScaffolderStreamLogsOptions): Observable; dryRun?(options: ScaffolderDryRunOptions): Promise; diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md index 2d02c91ec0..9d055f20a7 100644 --- a/plugins/scaffolder/CHANGELOG.md +++ b/plugins/scaffolder/CHANGELOG.md @@ -1,5 +1,51 @@ # @backstage/plugin-scaffolder +## 1.30.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/integration-react@1.2.6-next.0 + - @backstage/integration@1.16.3-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/plugin-scaffolder-react@1.15.0-next.1 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-permission-react@0.4.32 + - @backstage/plugin-scaffolder-common@1.5.10 + +## 1.30.0-next.0 + +### Minor Changes + +- 5890016: add api to retrieve template extensions info from scaffolder-backend + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.15.0-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/integration@1.16.2 + - @backstage/integration-react@1.2.5 + - @backstage/types@1.2.1 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-permission-react@0.4.32 + - @backstage/plugin-scaffolder-common@1.5.10 + ## 1.29.0 ### Minor Changes diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index f03f9e5a23..fc6c4cff79 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder", - "version": "1.29.0", + "version": "1.30.0-next.1", "description": "The Backstage plugin that helps you create new things", "backstage": { "role": "frontend-plugin", diff --git a/plugins/scaffolder/report.api.md b/plugins/scaffolder/report.api.md index c51423ed83..379e6a98b9 100644 --- a/plugins/scaffolder/report.api.md +++ b/plugins/scaffolder/report.api.md @@ -25,6 +25,7 @@ import { JSX as JSX_2 } from 'react'; import { LayoutOptions as LayoutOptions_2 } from '@backstage/plugin-scaffolder-react'; import { LayoutTemplate as LayoutTemplate_2 } from '@backstage/plugin-scaffolder-react'; import { ListActionsResponse as ListActionsResponse_2 } from '@backstage/plugin-scaffolder-react'; +import { ListTemplateExtensionsResponse } from '@backstage/plugin-scaffolder-react'; import { LogEvent as LogEvent_2 } from '@backstage/plugin-scaffolder-react'; import { Observable } from '@backstage/types'; import { PathParams } from '@backstage/core-plugin-api'; @@ -561,6 +562,8 @@ export class ScaffolderClient implements ScaffolderApi_2 { totalTasks?: number; }>; // (undocumented) + listTemplateExtensions(): Promise; + // (undocumented) retry?(taskId: string): Promise; // (undocumented) scaffold( diff --git a/plugins/scaffolder/src/api.ts b/plugins/scaffolder/src/api.ts index 01e163bb30..85450b012a 100644 --- a/plugins/scaffolder/src/api.ts +++ b/plugins/scaffolder/src/api.ts @@ -24,6 +24,7 @@ import { ResponseError } from '@backstage/errors'; import { ScmIntegrationRegistry } from '@backstage/integration'; import { ListActionsResponse, + ListTemplateExtensionsResponse, LogEvent, ScaffolderApi, ScaffolderDryRunOptions, @@ -324,6 +325,17 @@ export class ScaffolderClient implements ScaffolderApi { return await response.json(); } + async listTemplateExtensions(): Promise { + const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder'); + const response = await this.fetchApi.fetch( + `${baseUrl}/v2/template-extensions`, + ); + if (!response.ok) { + throw ResponseError.fromResponse(response); + } + return response.json(); + } + async cancelTask(taskId: string): Promise { const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder'); const url = `${baseUrl}/v2/tasks/${encodeURIComponent(taskId)}/cancel`; diff --git a/plugins/search-backend-module-techdocs/CHANGELOG.md b/plugins/search-backend-module-techdocs/CHANGELOG.md index 8700e8bc91..030095daf7 100644 --- a/plugins/search-backend-module-techdocs/CHANGELOG.md +++ b/plugins/search-backend-module-techdocs/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-search-backend-module-techdocs +## 0.4.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-node@1.13.2-next.1 + - @backstage/plugin-search-backend-node@1.3.9 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-common@1.2.17 + +## 0.4.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-node@1.13.2-next.0 + - @backstage/plugin-search-backend-node@1.3.9 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-common@1.2.17 + ## 0.4.0 ### Minor Changes diff --git a/plugins/search-backend-module-techdocs/package.json b/plugins/search-backend-module-techdocs/package.json index 9ca1630a7c..68d70cf0a1 100644 --- a/plugins/search-backend-module-techdocs/package.json +++ b/plugins/search-backend-module-techdocs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-techdocs", - "version": "0.4.0", + "version": "0.4.1-next.1", "description": "A module for the search backend that exports techdocs modules", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend/CHANGELOG.md b/plugins/search-backend/CHANGELOG.md index ec5995601d..71504e70ca 100644 --- a/plugins/search-backend/CHANGELOG.md +++ b/plugins/search-backend/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-search-backend +## 2.0.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/plugin-search-backend-node@1.3.9 + - @backstage/backend-openapi-utils@0.5.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-common@1.2.17 + +## 2.0.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/plugin-search-backend-node@1.3.9 + - @backstage/backend-openapi-utils@0.5.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-common@1.2.17 + ## 2.0.0 ### Major Changes diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index 91acb56855..9dd7bbaaa0 100644 --- a/plugins/search-backend/package.json +++ b/plugins/search-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend", - "version": "2.0.0", + "version": "2.0.1-next.1", "description": "The Backstage backend plugin that provides your backstage app with search", "backstage": { "role": "backend-plugin", diff --git a/plugins/search-react/CHANGELOG.md b/plugins/search-react/CHANGELOG.md index d383304b5a..a61e7cf347 100644 --- a/plugins/search-react/CHANGELOG.md +++ b/plugins/search-react/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-search-react +## 1.8.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/theme@0.6.4 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-search-common@1.2.17 + ## 1.8.7 ### Patch Changes diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json index 06050399b5..e9c598bb9c 100644 --- a/plugins/search-react/package.json +++ b/plugins/search-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-react", - "version": "1.8.7", + "version": "1.8.8-next.0", "backstage": { "role": "web-library", "pluginId": "search", diff --git a/plugins/search/CHANGELOG.md b/plugins/search/CHANGELOG.md index 92aa67b880..3683cc07dd 100644 --- a/plugins/search/CHANGELOG.md +++ b/plugins/search/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-search +## 1.4.25-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/plugin-search-react@1.8.8-next.0 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-search-common@1.2.17 + +## 1.4.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-search-common@1.2.17 + - @backstage/plugin-search-react@1.8.7 + ## 1.4.24 ### Patch Changes diff --git a/plugins/search/package.json b/plugins/search/package.json index 7e12ef21d0..9ce7669924 100644 --- a/plugins/search/package.json +++ b/plugins/search/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search", - "version": "1.4.24", + "version": "1.4.25-next.1", "description": "The Backstage plugin that provides your backstage app with search", "backstage": { "role": "frontend-plugin", diff --git a/plugins/signals/CHANGELOG.md b/plugins/signals/CHANGELOG.md index 1eb26393d7..46a5e1832c 100644 --- a/plugins/signals/CHANGELOG.md +++ b/plugins/signals/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-signals +## 0.0.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/theme@0.6.4 + - @backstage/types@1.2.1 + - @backstage/plugin-signals-react@0.0.11 + ## 0.0.17 ### Patch Changes diff --git a/plugins/signals/package.json b/plugins/signals/package.json index 978a35a8b4..20edf59a3e 100644 --- a/plugins/signals/package.json +++ b/plugins/signals/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-signals", - "version": "0.0.17", + "version": "0.0.18-next.0", "backstage": { "role": "frontend-plugin", "pluginId": "signals", diff --git a/plugins/techdocs-addons-test-utils/CHANGELOG.md b/plugins/techdocs-addons-test-utils/CHANGELOG.md index b9bff49e81..bc1d8836de 100644 --- a/plugins/techdocs-addons-test-utils/CHANGELOG.md +++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-techdocs-addons-test-utils +## 1.0.47-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-react@1.2.16-next.0 + - @backstage/integration-react@1.2.6-next.0 + - @backstage/plugin-techdocs@1.12.5-next.1 + - @backstage/plugin-catalog@1.29.0-next.1 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/plugin-search-react@1.8.8-next.0 + - @backstage/core-app-api@1.16.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/test-utils@1.7.6 + +## 1.0.47-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.29.0-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/plugin-techdocs@1.12.5-next.0 + - @backstage/core-app-api@1.16.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/integration-react@1.2.5 + - @backstage/test-utils@1.7.6 + - @backstage/plugin-search-react@1.8.7 + - @backstage/plugin-techdocs-react@1.2.15 + ## 1.0.46 ### Patch Changes diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index 9071a86a93..2ce186c3d9 100644 --- a/plugins/techdocs-addons-test-utils/package.json +++ b/plugins/techdocs-addons-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-addons-test-utils", - "version": "1.0.46", + "version": "1.0.47-next.1", "backstage": { "role": "web-library", "pluginId": "techdocs-addons", diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md index 60246c4903..0f8d4ab885 100644 --- a/plugins/techdocs-backend/CHANGELOG.md +++ b/plugins/techdocs-backend/CHANGELOG.md @@ -1,5 +1,43 @@ # @backstage/plugin-techdocs-backend +## 2.0.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.3-next.0 + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/plugin-techdocs-node@1.13.2-next.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-backend-module-techdocs@0.4.1-next.1 + - @backstage/plugin-techdocs-common@0.1.0 + +## 2.0.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/plugin-techdocs-node@1.13.2-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.4.1-next.0 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/integration@1.16.2 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-node@1.16.1 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-techdocs-common@0.1.0 + ## 2.0.0 ### Major Changes diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index 4f94659b99..0123eba185 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-backend", - "version": "2.0.0", + "version": "2.0.1-next.1", "description": "The Backstage backend plugin that renders technical documentation for your components", "backstage": { "role": "backend-plugin", diff --git a/plugins/techdocs-module-addons-contrib/CHANGELOG.md b/plugins/techdocs-module-addons-contrib/CHANGELOG.md index 1fb5a367b3..18fcd48c02 100644 --- a/plugins/techdocs-module-addons-contrib/CHANGELOG.md +++ b/plugins/techdocs-module-addons-contrib/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-techdocs-module-addons-contrib +## 1.1.23-next.0 + +### Patch Changes + +- 9c12a76: Fixed rendering issues in `ReportIssue` addon for unsupported repository types and improved shadow DOM event handling. The addon now properly prevents initialization when encountering unsupported repository types and correctly handles selection events within the shadow DOM. +- Updated dependencies + - @backstage/plugin-techdocs-react@1.2.16-next.0 + - @backstage/core-components@0.17.1-next.0 + - @backstage/integration-react@1.2.6-next.0 + - @backstage/integration@1.16.3-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/core-plugin-api@1.10.5 + ## 1.1.22 ### Patch Changes diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index 95d0a0832f..0a0d4cb6ed 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-module-addons-contrib", - "version": "1.1.22", + "version": "1.1.23-next.0", "description": "Plugin module for contributed TechDocs Addons", "backstage": { "role": "frontend-plugin-module", diff --git a/plugins/techdocs-module-addons-contrib/src/ReportIssue/IssueLink.tsx b/plugins/techdocs-module-addons-contrib/src/ReportIssue/IssueLink.tsx index eb16476fa6..f0d9b194ce 100644 --- a/plugins/techdocs-module-addons-contrib/src/ReportIssue/IssueLink.tsx +++ b/plugins/techdocs-module-addons-contrib/src/ReportIssue/IssueLink.tsx @@ -48,10 +48,7 @@ const getIcon = ({ type }: Repository) => { }; const getName = ({ type }: Repository) => { - if (type === 'github') { - return 'Github'; - } - return 'Gitlab'; + return type.charAt(0).toLocaleUpperCase('en-US') + type.slice(1); }; const getUrl = (repository: Repository, template: ReportIssueTemplate) => { diff --git a/plugins/techdocs-module-addons-contrib/src/ReportIssue/ReportIssue.test.tsx b/plugins/techdocs-module-addons-contrib/src/ReportIssue/ReportIssue.test.tsx index 459fa1b65e..97df773f76 100644 --- a/plugins/techdocs-module-addons-contrib/src/ReportIssue/ReportIssue.test.tsx +++ b/plugins/techdocs-module-addons-contrib/src/ReportIssue/ReportIssue.test.tsx @@ -116,7 +116,7 @@ describe('ReportIssue', () => { it('renders gitlab link without exploding', async () => { byUrl.mockReturnValue({ type: 'gitlab' }); - const { shadowRoot, getByText } = + const { shadowRoot, getByText, queryByTestId } = await TechDocsAddonTester.buildAddonsInTechDocs([ , ]) @@ -164,6 +164,8 @@ describe('ReportIssue', () => { fireSelectionChangeEvent(window); await waitFor(() => { + expect(queryByTestId('report-issue-addon')).toBeInTheDocument(); + const link = getByText('Open new Gitlab issue'); expect(link).toHaveAttribute( 'href', @@ -180,7 +182,7 @@ describe('ReportIssue', () => { body: options.selection.toString().trim(), }); - const { shadowRoot, getByText } = + const { shadowRoot, getByText, queryByTestId } = await TechDocsAddonTester.buildAddonsInTechDocs([ , ]) @@ -228,6 +230,8 @@ describe('ReportIssue', () => { fireSelectionChangeEvent(window); await waitFor(() => { + expect(queryByTestId('report-issue-addon')).toBeInTheDocument(); + const link = getByText('Open new Gitlab issue'); expect(link).toHaveAttribute( 'href', @@ -235,4 +239,49 @@ describe('ReportIssue', () => { ); }); }); + + it('does not render report issue link for unsupported repository type', async () => { + byUrl.mockReturnValue({ type: 'gerrit', resource: 'gerrit.example.com' }); + + const { shadowRoot, getByText, queryByTestId } = + await TechDocsAddonTester.buildAddonsInTechDocs([ + , + ]) + .withDom( + + + +
+
+ +
+
+ + , + ) + .withApis([[scmIntegrationsApiRef, { byUrl }]]) + .renderWithEffects(); + + (shadowRoot as ShadowRoot & Pick).getSelection = + () => selection; + + await waitFor(() => { + expect(getByText('Edit page')).toBeInTheDocument(); + }); + + fireSelectionChangeEvent(window); + + await waitFor(() => { + expect(queryByTestId('report-issue-addon')).not.toBeInTheDocument(); + }); + }); }); diff --git a/plugins/techdocs-module-addons-contrib/src/ReportIssue/ReportIssue.tsx b/plugins/techdocs-module-addons-contrib/src/ReportIssue/ReportIssue.tsx index a6d8021b9d..3a5511376c 100644 --- a/plugins/techdocs-module-addons-contrib/src/ReportIssue/ReportIssue.tsx +++ b/plugins/techdocs-module-addons-contrib/src/ReportIssue/ReportIssue.tsx @@ -14,39 +14,11 @@ * limitations under the License. */ -import React, { useState, useEffect } from 'react'; - -import { makeStyles, Portal, Paper } from '@material-ui/core'; - -import { useGitTemplate, useGitRepository } from './hooks'; +import React from 'react'; +import { useGitRepository } from './hooks'; import { ReportIssueTemplateBuilder } from './types'; -import { - PAGE_MAIN_CONTENT_SELECTOR, - PAGE_FEEDBACK_LINK_SELECTOR, - ADDON_FEEDBACK_CONTAINER_ID, - ADDON_FEEDBACK_CONTAINER_SELECTOR, -} from './constants'; -import { IssueLink } from './IssueLink'; - -import { - useShadowRootElements, - useShadowRootSelection, -} from '@backstage/plugin-techdocs-react'; - -const useStyles = makeStyles(theme => ({ - root: { - transform: 'translate(-100%, -100%)', - position: 'absolute', - padding: theme.spacing(1), - zIndex: theme.zIndex.tooltip, - background: theme.palette.common.white, - }, -})); - -type Style = { - top: string; - left: string; -}; +import { ADDON_ISSUE_REPO_TYPES_SUPPORTED } from './constants'; +import { ReportIssueAddonContent } from './ReportIssueContent'; /** * Props customizing the Addon. @@ -67,101 +39,24 @@ export type ReportIssueProps = { templateBuilder?: ReportIssueTemplateBuilder; }; -/** - * Show report issue button when text is highlighted - */ export const ReportIssueAddon = ({ debounceTime = 500, - templateBuilder: buildTemplate, + templateBuilder, }: ReportIssueProps) => { - const classes = useStyles(); - const [style, setStyle] = useState