diff --git a/.changeset/blue-dragons-shout.md b/.changeset/blue-dragons-shout.md new file mode 100644 index 0000000000..762234a72b --- /dev/null +++ b/.changeset/blue-dragons-shout.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-gitlab': patch +--- + +`restrictUsersToGroup` should use the entire group path when getting members diff --git a/.changeset/cool-days-sparkle.md b/.changeset/cool-days-sparkle.md new file mode 100644 index 0000000000..1dc9a76df7 --- /dev/null +++ b/.changeset/cool-days-sparkle.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-catalog-backend-module-bitbucket-server': minor +'@backstage/backend-defaults': minor +--- + +Throttles Bitbucket Server API calls diff --git a/.changeset/curly-beans-brake.md b/.changeset/curly-beans-brake.md new file mode 100644 index 0000000000..4afb11578d --- /dev/null +++ b/.changeset/curly-beans-brake.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs': minor +--- + +Add pagination support to TechDocs Index Page and make it the default diff --git a/.changeset/curly-teachers-marry.md b/.changeset/curly-teachers-marry.md new file mode 100644 index 0000000000..9bf771f4d1 --- /dev/null +++ b/.changeset/curly-teachers-marry.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': minor +--- + +Added a new `catalog.disableRelationsCompatibility` configuration option that avoids JSON deserialization and serialization if possible when reading entities. This significantly reduces the memory usage of the catalog, and slightly increases performance, but it removes the backwards compatibility processing that ensures that both `entity.relation[].target` and `entity.relation[].targetRef` are present in returned entities. diff --git a/.changeset/curvy-fishes-rule.md b/.changeset/curvy-fishes-rule.md new file mode 100644 index 0000000000..2ce535166d --- /dev/null +++ b/.changeset/curvy-fishes-rule.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-defaults': patch +--- + +Fix server response time by moving the lifecycle startup hooks back to the plugin lifecycle service. diff --git a/.changeset/dull-ties-film.md b/.changeset/dull-ties-film.md new file mode 100644 index 0000000000..4463d59d91 --- /dev/null +++ b/.changeset/dull-ties-film.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog': minor +--- + +Adds an optional columns attribute to HasSubdomainsCardProps and changes its default columns diff --git a/.changeset/empty-colts-promise.md b/.changeset/empty-colts-promise.md new file mode 100644 index 0000000000..80cea4d42e --- /dev/null +++ b/.changeset/empty-colts-promise.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +Internal refactor of filter parsing logic. diff --git a/.changeset/fast-tools-fix.md b/.changeset/fast-tools-fix.md new file mode 100644 index 0000000000..11807f045e --- /dev/null +++ b/.changeset/fast-tools-fix.md @@ -0,0 +1,10 @@ +--- +'@backstage/backend-defaults': minor +--- + +**BREAKING PRODUCERS**: The `LifecycleMiddlewareOptions.startupRequestPauseTimeout` has been removed. Use the `backend.lifecycle.startupRequestPauseTimeout` setting in your `app-config.yaml` file to customize how the `createLifecycleMiddleware` function should behave. Also the root config service is required as an option when calling the `createLifecycleMiddleware` function: + +```diff +- createLifecycleMiddleware({ lifecycle, startupRequestPauseTimeout }) ++ createLifecycleMiddleware({ config, lifecycle }) +``` diff --git a/.changeset/gold-crabs-agree.md b/.changeset/gold-crabs-agree.md new file mode 100644 index 0000000000..1f345a8c10 --- /dev/null +++ b/.changeset/gold-crabs-agree.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +Use a faster count method on pg when computing some metrics diff --git a/.changeset/good-pens-dance.md b/.changeset/good-pens-dance.md new file mode 100644 index 0000000000..05ebce1bc6 --- /dev/null +++ b/.changeset/good-pens-dance.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-catalog-react': patch +'@backstage/plugin-config-schema': patch +--- + +Internal refactor to break potential circular imports diff --git a/.changeset/green-carpets-smell.md b/.changeset/green-carpets-smell.md new file mode 100644 index 0000000000..0cda68de22 --- /dev/null +++ b/.changeset/green-carpets-smell.md @@ -0,0 +1,7 @@ +--- +'@backstage/backend-plugin-api': patch +--- + +The `RootLifecycleService` now has a new `addBeforeShutdownHook` method, and hooks added through this method will run immediately when a termination event is received. + +The backend will not proceed with the shutdown and run the `Shutdown` hooks until all `BeforeShutdown` hooks have completed. diff --git a/.changeset/heavy-tomatoes-laugh.md b/.changeset/heavy-tomatoes-laugh.md new file mode 100644 index 0000000000..9a4740e209 --- /dev/null +++ b/.changeset/heavy-tomatoes-laugh.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-app-api': minor +--- + +Service factories added by feature loaders now have lower priority and will be ignored if a factory for the same service is added directly by `backend.add(serviceFactory)`. diff --git a/.changeset/honest-buttons-clean.md b/.changeset/honest-buttons-clean.md new file mode 100644 index 0000000000..952aff614b --- /dev/null +++ b/.changeset/honest-buttons-clean.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Revert `css-loader@v7` bump diff --git a/.changeset/large-birds-watch.md b/.changeset/large-birds-watch.md new file mode 100644 index 0000000000..24d63492bc --- /dev/null +++ b/.changeset/large-birds-watch.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-test-utils': patch +--- + +Mock the new `RootLifecycleService.addBeforeShutdownHook` method. diff --git a/.changeset/long-geese-report.md b/.changeset/long-geese-report.md new file mode 100644 index 0000000000..1e638703c9 --- /dev/null +++ b/.changeset/long-geese-report.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-github': patch +--- + +Change `github:environment:create` action to request and use a token when resolving reviewer entity refs from the Backstage catalog. diff --git a/.changeset/lucky-crabs-vanish.md b/.changeset/lucky-crabs-vanish.md new file mode 100644 index 0000000000..158200fb7e --- /dev/null +++ b/.changeset/lucky-crabs-vanish.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-scaffolder-backend-module-github': patch +'@backstage/plugin-scaffolder-backend': patch +'@backstage/create-app': patch +--- + +Add github backend module to create-app and improve error messages diff --git a/.changeset/mighty-birds-rest.md b/.changeset/mighty-birds-rest.md new file mode 100644 index 0000000000..79f1bdd075 --- /dev/null +++ b/.changeset/mighty-birds-rest.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-notifications': minor +--- + +Switched to using the new `/notifications` endpoints. Be sure to update the `notifications` plugin backend before deploying this frontend plugin change. diff --git a/.changeset/odd-days-push.md b/.changeset/odd-days-push.md new file mode 100644 index 0000000000..fd46de029f --- /dev/null +++ b/.changeset/odd-days-push.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-notifications-backend': patch +--- + +Deprecated root '/' endpoints, moving them under `/notifications` instead. diff --git a/.changeset/old-pandas-act.md b/.changeset/old-pandas-act.md new file mode 100644 index 0000000000..7b88652342 --- /dev/null +++ b/.changeset/old-pandas-act.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-github': patch +--- + +Minor spell fix in action parameters diff --git a/.changeset/perfect-fishes-kick.md b/.changeset/perfect-fishes-kick.md new file mode 100644 index 0000000000..b9e7ade993 --- /dev/null +++ b/.changeset/perfect-fishes-kick.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-notifications-backend': minor +--- + +**BREAKING**: Removed redundant `/health` endpoint, switch to using [the built-in endpoint instead](https://backstage.io/docs/backend-system/core-services/root-health). diff --git a/.changeset/pre.json b/.changeset/pre.json index f5f6c0f781..241667c2c5 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -198,74 +198,109 @@ "changesets": [ "beige-chicken-type", "brave-maps-deliver", + "brave-teachers-mate", "brown-monkeys-ring", "chatty-weeks-impress", + "chilly-games-trade", "cold-icons-worry", "cold-jeans-stare", + "cool-days-sparkle", "cuddly-chicken-wink", "cuddly-schools-scream", "curly-hats-tell", "cyan-rocks-divide", + "dry-badgers-prove", "dry-needles-taste", + "dull-bulldogs-learn", + "dull-ties-film", "empty-bugs-deliver", + "empty-colts-promise", "empty-ways-push", "fast-cheetahs-deliver", "few-colts-train", "few-pillows-remember", + "fifty-countries-decide", "five-goats-travel", "fluffy-cobras-sort", "fluffy-falcons-shout", "fluffy-zebras-cheer", "forty-apples-complain", + "forty-ravens-fry", "friendly-dots-thank", + "gold-crabs-agree", "gold-stingrays-cross", + "gorgeous-panthers-count", "great-buttons-cross", + "green-carpets-smell", "happy-forks-listen", "healthy-years-begin", "heavy-needles-poke", + "heavy-tomatoes-laugh", "honest-hornets-double", "hungry-hairs-wait", "itchy-rats-pump", + "itchy-ravens-punch", "khaki-ladybugs-swim", "khaki-shrimps-tease", + "large-birds-watch", "lazy-pants-attack", "lazy-years-float", + "lemon-bulldogs-study", + "lucky-crabs-vanish", "mean-shirts-design", + "mighty-birds-rest", "neat-insects-cough", "new-pandas-perform", "new-rules-teach", "odd-apples-explain", + "odd-days-push", "odd-worms-peel", "old-taxis-exist", "olive-berries-jump", "orange-coins-confess", "orange-moles-kick", + "perfect-fishes-kick", "pink-bees-shake", "pink-pets-jump", "polite-foxes-buy", "poor-hounds-jump", "popular-donkeys-rhyme", + "pretty-kiwis-travel", "real-shirts-cry", "renovate-998a490", + "renovate-9a9f6ed", "renovate-a5f3bd6", + "renovate-e689a2c", "rich-beers-eat", + "rich-maps-invite", + "rich-suns-drive", "rollup-fix-forward", "rollup-release-borked-packages", + "rude-pears-tie", "seven-bulldogs-count", "short-baboons-search", "shy-teachers-count", "silent-pigs-collect", + "silver-actors-care", + "six-eels-add", "sixty-shirts-rescue", "slow-horses-destroy", "slow-singers-jump", + "small-boxes-enjoy", + "smart-islands-judge", + "smooth-bikes-sparkle", "spotty-shoes-exercise", + "stale-hats-exist", "stale-rats-tease", + "strange-brooms-check", "strong-papayas-remember", "swift-kangaroos-drop", "tall-comics-heal", "ten-keys-nail", "thick-items-bathe", + "thin-hotels-explode", "tiny-mice-run", + "twenty-monkeys-applaud", "twenty-parents-judge", "violet-snakes-laugh", "warm-pumpkins-bathe", @@ -273,6 +308,7 @@ "weak-meals-doubt", "wet-rats-exist", "young-carrots-collect", + "young-cobras-add", "young-months-admire" ] } diff --git a/.changeset/pretty-kiwis-travel.md b/.changeset/pretty-kiwis-travel.md new file mode 100644 index 0000000000..f3d5cbeb27 --- /dev/null +++ b/.changeset/pretty-kiwis-travel.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-defaults': patch +--- + +Implements the `DefaultRootLifecycleService.addBeforeShutdownHook` method, and updates `DefaultRootHttpRouterService` and `DefaultRootHealthService` to listen to that event to stop accepting traffic and close service connections. diff --git a/.changeset/renovate-9a9f6ed.md b/.changeset/renovate-9a9f6ed.md new file mode 100644 index 0000000000..9dad75cc3e --- /dev/null +++ b/.changeset/renovate-9a9f6ed.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Updated dependency `@module-federation/enhanced` to `^0.8.0`. diff --git a/.changeset/renovate-e689a2c.md b/.changeset/renovate-e689a2c.md new file mode 100644 index 0000000000..7e4f999289 --- /dev/null +++ b/.changeset/renovate-e689a2c.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-compat-api': patch +--- + +Updated dependency `@oriflame/backstage-plugin-score-card` to `^0.9.0`. diff --git a/.changeset/rich-maps-invite.md b/.changeset/rich-maps-invite.md new file mode 100644 index 0000000000..927d8e9382 --- /dev/null +++ b/.changeset/rich-maps-invite.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-permission-node': patch +--- + +The `createPermissionIntegrationRouter` function now detects and prevents the exposure of duplicate permissions. diff --git a/.changeset/rude-pears-tie.md b/.changeset/rude-pears-tie.md new file mode 100644 index 0000000000..e29d517959 --- /dev/null +++ b/.changeset/rude-pears-tie.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-defaults': patch +--- + +Remove use of the `stoppable` library on the `DefaultRootHttpRouterService` as Node's native http server [close](https://nodejs.org/api/http.html#serverclosecallback) method already drains requests. diff --git a/.changeset/silver-actors-care.md b/.changeset/silver-actors-care.md new file mode 100644 index 0000000000..5391a1d57b --- /dev/null +++ b/.changeset/silver-actors-care.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-react': patch +--- + +Fixed an issue where `` would re-render its children on page load for smaller screens, potentially leading to unnecessary additional backend requests. diff --git a/.changeset/smart-islands-judge.md b/.changeset/smart-islands-judge.md new file mode 100644 index 0000000000..8b21666c4c --- /dev/null +++ b/.changeset/smart-islands-judge.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-scaffolder-react': patch +'@backstage/plugin-scaffolder': patch +--- + +Scaffolder field extensions registered with `FormFieldBlueprint` are now collected in the `useCustomFieldExtensions` hook, enabling them for use in the scaffolder. diff --git a/.changeset/smooth-bikes-sparkle.md b/.changeset/smooth-bikes-sparkle.md new file mode 100644 index 0000000000..0c1eba172b --- /dev/null +++ b/.changeset/smooth-bikes-sparkle.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-gitlab': minor +--- + +Implemented discovery for top-level groups defined in config.group or if undefined global top-level group in Gitlab diff --git a/.changeset/stupid-crabs-wash.md b/.changeset/stupid-crabs-wash.md new file mode 100644 index 0000000000..d9e7f317df --- /dev/null +++ b/.changeset/stupid-crabs-wash.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-backend': patch +--- + +Support fetch pod metrics with custom resources diff --git a/.changeset/twenty-monkeys-applaud.md b/.changeset/twenty-monkeys-applaud.md new file mode 100644 index 0000000000..a1b0c1d338 --- /dev/null +++ b/.changeset/twenty-monkeys-applaud.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': patch +--- + +Resolved an issue where the `templateManagementPermission` was not being exposed through the `/permissions/metadata` endpoint. diff --git a/.changeset/young-cobras-add.md b/.changeset/young-cobras-add.md new file mode 100644 index 0000000000..f9172d3800 --- /dev/null +++ b/.changeset/young-cobras-add.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-app-api': patch +--- + +As soon as a backend termination signal is received, call before shutting down root lifecycle hooks. diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index c7326c5f4e..b31cca1080 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -12,10 +12,12 @@ yarn.lock @backstage/maintainers @backst /docs @backstage/maintainers @backstage/documentation-maintainers /docs/assets/search @backstage/search-maintainers /docs/features/search @backstage/search-maintainers +/docs/dls @backstage/design-system-maintainers /docs/features/techdocs @backstage/techdocs-maintainers /docs/plugins/integrating-search-into-plugins.md @backstage/search-maintainers /packages/cli/src/commands/onboard @backstage/sharks /packages/backend-openapi-utils @backstage/maintainers @backstage/reviewers @backstage/openapi-tooling-maintainers +/packages/canon @backstage/design-system-maintainers /packages/techdocs-cli @backstage/techdocs-maintainers /packages/techdocs-cli-embedded-app @backstage/techdocs-maintainers /plugins/api-docs @backstage/maintainers @backstage/reviewers @backstage/sda-se-reviewers diff --git a/.github/vale/config/vocabularies/Backstage/accept.txt b/.github/vale/config/vocabularies/Backstage/accept.txt index 4f5d3e338d..fc0fd5021e 100644 --- a/.github/vale/config/vocabularies/Backstage/accept.txt +++ b/.github/vale/config/vocabularies/Backstage/accept.txt @@ -80,6 +80,8 @@ cron cronjobs crontab css +cve +CVEs daemonsets Datadog dataflow @@ -95,6 +97,7 @@ deliverables denormalized dependabot deps +deserialization destructured destructuring Deutsche @@ -339,6 +342,7 @@ rebase rebasing Recharts Redash +redis renderer renderers replicasets diff --git a/.github/workflows/api-breaking-changes-comment.yml b/.github/workflows/api-breaking-changes-comment.yml index 15b13810f5..1210db0ccf 100644 --- a/.github/workflows/api-breaking-changes-comment.yml +++ b/.github/workflows/api-breaking-changes-comment.yml @@ -22,7 +22,7 @@ jobs: action: ${{ steps.event.outputs.ACTION }} steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: disable-sudo: true egress-policy: block diff --git a/.github/workflows/api-breaking-changes.yml b/.github/workflows/api-breaking-changes.yml index a6ba0e393b..744c9e62c3 100644 --- a/.github/workflows/api-breaking-changes.yml +++ b/.github/workflows/api-breaking-changes.yml @@ -14,7 +14,7 @@ jobs: if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }} steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -33,7 +33,7 @@ jobs: registry-url: https://registry.npmjs.org/ - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@c5c3b91fe86c59a87cf9782de1f89e48e19d4492 # v0.6.16 with: cache-prefix: linux-v20 diff --git a/.github/workflows/automate_area-labels.yml b/.github/workflows/automate_area-labels.yml index 89e1adc3c3..4529b54c16 100644 --- a/.github/workflows/automate_area-labels.yml +++ b/.github/workflows/automate_area-labels.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/automate_changeset_feedback.yml b/.github/workflows/automate_changeset_feedback.yml index d7e2b56b39..1a29795cce 100644 --- a/.github/workflows/automate_changeset_feedback.yml +++ b/.github/workflows/automate_changeset_feedback.yml @@ -23,7 +23,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -34,7 +34,7 @@ jobs: ref: 'refs/pull/${{ github.event.pull_request.number }}/merge' - name: fetch base run: git fetch --depth 1 origin ${{ github.base_ref }} - - uses: backstage/actions/changeset-feedback@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + - uses: backstage/actions/changeset-feedback@c5c3b91fe86c59a87cf9782de1f89e48e19d4492 # v0.6.16 name: Generate feedback with: diff-ref: 'origin/master' diff --git a/.github/workflows/automate_merge_message.yml b/.github/workflows/automate_merge_message.yml index ece1331730..7923496b3f 100644 --- a/.github/workflows/automate_merge_message.yml +++ b/.github/workflows/automate_merge_message.yml @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/automate_stale.yml b/.github/workflows/automate_stale.yml index b7adc5235a..e61ca20620 100644 --- a/.github/workflows/automate_stale.yml +++ b/.github/workflows/automate_stale.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/ci-noop.yml b/.github/workflows/ci-noop.yml index af7199ede6..a769ce7d50 100644 --- a/.github/workflows/ci-noop.yml +++ b/.github/workflows/ci-noop.yml @@ -40,7 +40,7 @@ jobs: name: Test ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a959b7aa9a..24e74ff0f6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,7 +28,7 @@ jobs: name: Install ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -41,7 +41,7 @@ jobs: registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@c5c3b91fe86c59a87cf9782de1f89e48e19d4492 # v0.6.16 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} @@ -64,7 +64,7 @@ jobs: name: Verify ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -77,7 +77,7 @@ jobs: registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@c5c3b91fe86c59a87cf9782de1f89e48e19d4492 # v0.6.16 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} @@ -225,7 +225,7 @@ jobs: registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@c5c3b91fe86c59a87cf9782de1f89e48e19d4492 # v0.6.16 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} diff --git a/.github/workflows/cron.yml b/.github/workflows/cron.yml index 48ac1db289..5961a9155f 100644 --- a/.github/workflows/cron.yml +++ b/.github/workflows/cron.yml @@ -10,11 +10,11 @@ jobs: timeout-minutes: 10 steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit - - uses: backstage/actions/cron@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + - uses: backstage/actions/cron@c5c3b91fe86c59a87cf9782de1f89e48e19d4492 # v0.6.16 with: app-id: ${{ secrets.BACKSTAGE_GOALIE_APPLICATION_ID }} private-key: ${{ secrets.BACKSTAGE_GOALIE_PRIVATE_KEY }} diff --git a/.github/workflows/deploy_docker-image.yml b/.github/workflows/deploy_docker-image.yml index f0d8d0048d..a7ac58b76a 100644 --- a/.github/workflows/deploy_docker-image.yml +++ b/.github/workflows/deploy_docker-image.yml @@ -20,7 +20,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -37,7 +37,7 @@ jobs: registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@c5c3b91fe86c59a87cf9782de1f89e48e19d4492 # v0.6.16 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} diff --git a/.github/workflows/deploy_microsite.yml b/.github/workflows/deploy_microsite.yml index 9fe2728256..1f18c6ed15 100644 --- a/.github/workflows/deploy_microsite.yml +++ b/.github/workflows/deploy_microsite.yml @@ -23,7 +23,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -65,7 +65,7 @@ jobs: registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@c5c3b91fe86c59a87cf9782de1f89e48e19d4492 # v0.6.16 with: cache-prefix: ${{ runner.os }}-v20.x @@ -91,7 +91,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -105,7 +105,7 @@ jobs: registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@c5c3b91fe86c59a87cf9782de1f89e48e19d4492 # v0.6.16 with: cache-prefix: ${{ runner.os }}-v20.x @@ -158,7 +158,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/deploy_packages.yml b/.github/workflows/deploy_packages.yml index b95a6f9341..c66206ca8d 100644 --- a/.github/workflows/deploy_packages.yml +++ b/.github/workflows/deploy_packages.yml @@ -76,7 +76,7 @@ jobs: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@c5c3b91fe86c59a87cf9782de1f89e48e19d4492 # v0.6.16 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} @@ -147,7 +147,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/issue.yaml b/.github/workflows/issue.yaml index 2cd355b75e..c10f248f6d 100644 --- a/.github/workflows/issue.yaml +++ b/.github/workflows/issue.yaml @@ -16,7 +16,7 @@ jobs: if: github.repository == 'backstage/backstage' steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/pr-review-comment-trigger.yaml b/.github/workflows/pr-review-comment-trigger.yaml index 9ebfbee3b0..b5027d78be 100644 --- a/.github/workflows/pr-review-comment-trigger.yaml +++ b/.github/workflows/pr-review-comment-trigger.yaml @@ -20,7 +20,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/pr-review-comment.yaml b/.github/workflows/pr-review-comment.yaml index 517a978a83..18c39ebbd1 100644 --- a/.github/workflows/pr-review-comment.yaml +++ b/.github/workflows/pr-review-comment.yaml @@ -17,7 +17,7 @@ jobs: steps: # Inspired by https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#using-data-from-the-triggering-workflow - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -40,7 +40,7 @@ jobs: const prNumber = artifact.name.slice('pr_number-'.length) core.setOutput('pr-number', prNumber); - - uses: backstage/actions/re-review@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + - uses: backstage/actions/re-review@c5c3b91fe86c59a87cf9782de1f89e48e19d4492 # v0.6.16 with: app-id: ${{ secrets.BACKSTAGE_GOALIE_APPLICATION_ID }} private-key: ${{ secrets.BACKSTAGE_GOALIE_PRIVATE_KEY }} diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index 7639ac14db..5b8673858b 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -18,12 +18,12 @@ jobs: if: github.repository == 'backstage/backstage' && ( github.event.pull_request || github.event.issue.pull_request ) steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit - name: PR sync - uses: backstage/actions/pr-sync@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/pr-sync@c5c3b91fe86c59a87cf9782de1f89e48e19d4492 # v0.6.16 with: github-token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} app-id: ${{ secrets.BACKSTAGE_GOALIE_APPLICATION_ID }} diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index a379772722..a40c5a0653 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -29,7 +29,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -67,6 +67,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: 'Upload to code-scanning' - uses: github/codeql-action/upload-sarif@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/upload-sarif@babb554ede22fd5605947329c4d04d8e7a0b8155 # v3.27.7 with: sarif_file: results.sarif diff --git a/.github/workflows/sync_canon.yml b/.github/workflows/sync_canon.yml index 9cedb9fc24..189e43215e 100644 --- a/.github/workflows/sync_canon.yml +++ b/.github/workflows/sync_canon.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -22,7 +22,7 @@ jobs: registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@c5c3b91fe86c59a87cf9782de1f89e48e19d4492 # v0.6.16 with: cache-prefix: ${{ runner.os }}-v20.x diff --git a/.github/workflows/sync_code-formatting.yml b/.github/workflows/sync_code-formatting.yml index 4de42669e4..6658f8b850 100644 --- a/.github/workflows/sync_code-formatting.yml +++ b/.github/workflows/sync_code-formatting.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -25,7 +25,7 @@ jobs: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@c5c3b91fe86c59a87cf9782de1f89e48e19d4492 # v0.6.16 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} diff --git a/.github/workflows/sync_dependabot-changesets.yml b/.github/workflows/sync_dependabot-changesets.yml index 31db319229..2c2d5a51d0 100644 --- a/.github/workflows/sync_dependabot-changesets.yml +++ b/.github/workflows/sync_dependabot-changesets.yml @@ -11,7 +11,7 @@ jobs: if: github.actor == 'dependabot[bot]' && github.repository == 'backstage/backstage' steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/sync_release-manifest.yml b/.github/workflows/sync_release-manifest.yml index f2f9e1d819..d4fe6e2fa0 100644 --- a/.github/workflows/sync_release-manifest.yml +++ b/.github/workflows/sync_release-manifest.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -25,7 +25,7 @@ jobs: registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@c5c3b91fe86c59a87cf9782de1f89e48e19d4492 # v0.6.16 with: cache-prefix: ${{ runner.os }}-v20.x diff --git a/.github/workflows/sync_renovate-changesets.yml b/.github/workflows/sync_renovate-changesets.yml index 9331dbdb05..e4d60777cd 100644 --- a/.github/workflows/sync_renovate-changesets.yml +++ b/.github/workflows/sync_renovate-changesets.yml @@ -11,7 +11,7 @@ jobs: if: github.actor == 'renovate[bot]' && github.repository == 'backstage/backstage' steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/sync_snyk-github-issues.yml b/.github/workflows/sync_snyk-github-issues.yml index 20d4f0f144..9084593052 100644 --- a/.github/workflows/sync_snyk-github-issues.yml +++ b/.github/workflows/sync_snyk-github-issues.yml @@ -12,7 +12,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -24,7 +24,7 @@ jobs: node-version: 20.x registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@c5c3b91fe86c59a87cf9782de1f89e48e19d4492 # v0.6.16 with: cache-prefix: ${{ runner.os }}-v20.x diff --git a/.github/workflows/sync_snyk-monitor.yml b/.github/workflows/sync_snyk-monitor.yml index 0c0148e047..6300b1ca4d 100644 --- a/.github/workflows/sync_snyk-monitor.yml +++ b/.github/workflows/sync_snyk-monitor.yml @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -58,6 +58,6 @@ jobs: SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} NODE_OPTIONS: --max-old-space-size=7168 - name: Upload Snyk report - uses: github/codeql-action/upload-sarif@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/upload-sarif@babb554ede22fd5605947329c4d04d8e7a0b8155 # v3.27.7 with: sarif_file: snyk.sarif diff --git a/.github/workflows/sync_version-packages.yml b/.github/workflows/sync_version-packages.yml index 970a5e0e3f..479f65a53a 100644 --- a/.github/workflows/sync_version-packages.yml +++ b/.github/workflows/sync_version-packages.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/verify_accessibility-noop.yml b/.github/workflows/verify_accessibility-noop.yml index 37ce3513e9..9af85ec2d1 100644 --- a/.github/workflows/verify_accessibility-noop.yml +++ b/.github/workflows/verify_accessibility-noop.yml @@ -26,7 +26,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/verify_accessibility.yml b/.github/workflows/verify_accessibility.yml index 41d549cc7a..1c326bc880 100644 --- a/.github/workflows/verify_accessibility.yml +++ b/.github/workflows/verify_accessibility.yml @@ -20,7 +20,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -30,7 +30,7 @@ jobs: with: node-version: 20.x - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@c5c3b91fe86c59a87cf9782de1f89e48e19d4492 # v0.6.16 with: cache-prefix: ${{ runner.os }}-v20.x - name: run Lighthouse CI diff --git a/.github/workflows/verify_codeql.yml b/.github/workflows/verify_codeql.yml index be301559ec..cb40f28f54 100644 --- a/.github/workflows/verify_codeql.yml +++ b/.github/workflows/verify_codeql.yml @@ -42,7 +42,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -55,7 +55,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/init@babb554ede22fd5605947329c4d04d8e7a0b8155 # v3.27.7 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -66,7 +66,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/autobuild@babb554ede22fd5605947329c4d04d8e7a0b8155 # v3.27.7 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -80,4 +80,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/analyze@babb554ede22fd5605947329c4d04d8e7a0b8155 # v3.27.7 diff --git a/.github/workflows/verify_docs-quality.yml b/.github/workflows/verify_docs-quality.yml index 766d289f4c..9a93be4090 100644 --- a/.github/workflows/verify_docs-quality.yml +++ b/.github/workflows/verify_docs-quality.yml @@ -12,7 +12,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/verify_e2e-linux-noop.yml b/.github/workflows/verify_e2e-linux-noop.yml index 1afcd3fe17..4e3eeb2a8c 100644 --- a/.github/workflows/verify_e2e-linux-noop.yml +++ b/.github/workflows/verify_e2e-linux-noop.yml @@ -29,7 +29,7 @@ jobs: name: E2E Linux ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/verify_e2e-linux.yml b/.github/workflows/verify_e2e-linux.yml index 055350a7cf..ef24955b0e 100644 --- a/.github/workflows/verify_e2e-linux.yml +++ b/.github/workflows/verify_e2e-linux.yml @@ -43,7 +43,7 @@ jobs: name: E2E Linux ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -60,7 +60,7 @@ jobs: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@c5c3b91fe86c59a87cf9782de1f89e48e19d4492 # v0.6.16 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} diff --git a/.github/workflows/verify_e2e-techdocs.yml b/.github/workflows/verify_e2e-techdocs.yml index 03c07e716a..454c4c011e 100644 --- a/.github/workflows/verify_e2e-techdocs.yml +++ b/.github/workflows/verify_e2e-techdocs.yml @@ -32,7 +32,7 @@ jobs: name: Techdocs steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/verify_e2e-windows-noop.yml b/.github/workflows/verify_e2e-windows-noop.yml index 3e415b82c6..78d4c1e37f 100644 --- a/.github/workflows/verify_e2e-windows-noop.yml +++ b/.github/workflows/verify_e2e-windows-noop.yml @@ -25,7 +25,7 @@ jobs: name: E2E Windows ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/verify_e2e-windows.yml b/.github/workflows/verify_e2e-windows.yml index bb1612a0f5..3817af2d8a 100644 --- a/.github/workflows/verify_e2e-windows.yml +++ b/.github/workflows/verify_e2e-windows.yml @@ -33,7 +33,7 @@ jobs: name: E2E Windows ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -80,7 +80,7 @@ jobs: uses: browser-actions/setup-chrome@803ef6dfb4fdf22089c9563225d95e4a515820a0 # latest - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@c5c3b91fe86c59a87cf9782de1f89e48e19d4492 # v0.6.16 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} diff --git a/.github/workflows/verify_fossa.yml b/.github/workflows/verify_fossa.yml index e99ad22a9b..126d70b9c8 100644 --- a/.github/workflows/verify_fossa.yml +++ b/.github/workflows/verify_fossa.yml @@ -14,7 +14,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/verify_microsite-noop.yml b/.github/workflows/verify_microsite-noop.yml index f4c5ea4104..85cb1e3fee 100644 --- a/.github/workflows/verify_microsite-noop.yml +++ b/.github/workflows/verify_microsite-noop.yml @@ -21,7 +21,7 @@ jobs: name: Microsite steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/verify_microsite.yml b/.github/workflows/verify_microsite.yml index 26c2414589..2507428ec8 100644 --- a/.github/workflows/verify_microsite.yml +++ b/.github/workflows/verify_microsite.yml @@ -24,7 +24,7 @@ jobs: name: Microsite steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/verify_microsite_accessibility-noop.yml b/.github/workflows/verify_microsite_accessibility-noop.yml index 49721e7f51..7d4028e2dd 100644 --- a/.github/workflows/verify_microsite_accessibility-noop.yml +++ b/.github/workflows/verify_microsite_accessibility-noop.yml @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/verify_microsite_accessibility.yml b/.github/workflows/verify_microsite_accessibility.yml index bdf9e56556..e22241b3e3 100644 --- a/.github/workflows/verify_microsite_accessibility.yml +++ b/.github/workflows/verify_microsite_accessibility.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/verify_storybook-noop.yml b/.github/workflows/verify_storybook-noop.yml index 115c79c9c3..5b41d76e4c 100644 --- a/.github/workflows/verify_storybook-noop.yml +++ b/.github/workflows/verify_storybook-noop.yml @@ -28,7 +28,7 @@ jobs: name: Storybook steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/verify_storybook.yml b/.github/workflows/verify_storybook.yml index 082142be82..5ddd88b92d 100644 --- a/.github/workflows/verify_storybook.yml +++ b/.github/workflows/verify_storybook.yml @@ -28,7 +28,7 @@ jobs: name: Storybook steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -42,20 +42,23 @@ jobs: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@c5c3b91fe86c59a87cf9782de1f89e48e19d4492 # v0.6.16 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} - name: storybook yarn install run: yarn install --immutable working-directory: storybook + # Only for verification, the canon one is what we upload to Chromatic - run: yarn build-storybook + - run: yarn --cwd packages/canon build-storybook + - uses: chromaui/action@0efa3230f403b7848d5d65c6ce140b617fb68380 # v11 with: token: ${{ secrets.GITHUB_TOKEN }} # projectToken intentionally shared to allow collaborators to run Chromatic on forks # https://www.chromatic.com/docs/custom-ci-provider#run-chromatic-on-external-forks-of-open-source-projects - projectToken: 9tzak77m9nj - workingDir: storybook - storybookBuildDir: dist + projectToken: chpt_dab72dc0f97d55b + workingDir: packages/canon + storybookBuildDir: storybook-static diff --git a/.github/workflows/verify_windows.yml b/.github/workflows/verify_windows.yml index 189bcb09cd..e3f6959929 100644 --- a/.github/workflows/verify_windows.yml +++ b/.github/workflows/verify_windows.yml @@ -29,7 +29,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/ADOPTERS.md b/ADOPTERS.md index 1653f8ea88..b31e621938 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -279,3 +279,4 @@ _You can do this by using the [Adopter form](https://info.backstage.spotify.com/ | [Alauda](https://www.alauda.io/) | [Mario](https://github.com/mario-mui) | We use it to centralize and organize the components of our internal development platform. In addition, it provides environment templates for developers to create development testing or others environments | [New10](https://www.new10.com/) | [Cleber Gasparoto](https://github.com/chgasparoto) | We use Backstage as our internal developer portal to catalog services across teams, implement custom Tech Insights for ensuring service standards adoption, and centralize API specifications to streamline development processes and cross-team collaboration. | [Tele2 Kazakhstan](https://tele2.kz/) / [Altel Digital](https://digital.altel.kz/) | [Kuanysh Bekkulov](https://www.linkedin.com/in/kuanysh-bekkulov/), [Alexandr Puzeyev](https://www.linkedin.com/in/alexandr-puzeyev/) | Developer portal: services, components, APIs, and resources; includes documentation (Docs-as-Code), service templates, and plugins for integration with internal systems and tools. +| [Axelerant](https://www.axelerant.com/) | [Zeshan Ziya](https://github.com/zeshanziya) | Developer portal, main gateway to infrastructure, documentation, internal tooling, and service catalog with a focus on project visibility. diff --git a/OWNERS.md b/OWNERS.md index 6f6fea1d67..0932d3386b 100644 --- a/OWNERS.md +++ b/OWNERS.md @@ -10,7 +10,6 @@ Team: @backstage/maintainers | Patrik Oldsberg | Spotify | [Rugvip](https://github.com/Rugvip) | `Rugvip#0019` | | Fredrik Adelöw | Spotify | [freben](https://github.com/freben) | `freben#3926` | | Ben Lambert | Spotify | [benjdlambert](https://github.com/benjdlambert) | `blam#2159` | -| Johan Haals | Spotify | [jhaals](https://github.com/jhaals) | `Johan#0679` | ## Project Areas @@ -27,11 +26,21 @@ Scope: The catalog plugin and catalog model | Ben Lambert | Spotify | Cubic Belugas | [benjdlambert](https://github.com/benjdlambert) | `blam#2159` | | Camila Loiola | Spotify | Cubic Belugas | [camilaibs](http://github.com/camilaibs) | `camilal#0226` | | Fredrik Adelöw | Spotify | Cubic Belugas | [freben](https://github.com/freben) | `freben#3926` | -| Johan Haals | Spotify | Cubic Belugas | [jhaals](https://github.com/jhaals) | `Johan#0679` | | Mihai Tabara | Spotify | Cubic Belugas | [MihaiTabara](http://github.com/MihaiTabara) | `mihait#3107` | | Patrik Oldsberg | Spotify | Cubic Belugas | [Rugvip](https://github.com/Rugvip) | `Rugvip#0019` | | Vincenzo Scamporlino | Spotify | Cubic Belugas | [vinzscam](http://github.com/vinzscam) | `vinzscam#6944` | +### Design System + +Team: @backstage/design-system-maintainers + +Scope: The Backstage design system, component library, as well as surrounding tooling such as Storybook. + +| Name | Organization | Team | GitHub | Discord | +| ------------------- | ------------ | ------------- | --------------------------------------------- | ------------- | +| Charles de Dreuille | Spotify | | [cdedreuille](https://github.com/cdedreuille) | `cdedreuille` | +| Patrik Oldsberg | Spotify | Cubic Belugas | [Rugvip](https://github.com/Rugvip) | `Rugvip` | + ### Home Team: @backstage/home-maintainers @@ -91,7 +100,6 @@ Scope: The Permission Framework and plugins integrating with the permission fram | Ben Lambert | Spotify | Cubic Belugas | [benjdlambert](https://github.com/benjdlambert) | `blam#2159` | | Camila Loiola | Spotify | Cubic Belugas | [camilaibs](http://github.com/camilaibs) | `camilal#0226` | | Fredrik Adelöw | Spotify | Cubic Belugas | [freben](https://github.com/freben) | `freben#3926` | -| Johan Haals | Spotify | Cubic Belugas | [jhaals](https://github.com/jhaals) | `Johan#0679` | | Mihai Tabara | Spotify | Cubic Belugas | [MihaiTabara](http://github.com/MihaiTabara) | `mihait#3107` | | Patrik Oldsberg | Spotify | Cubic Belugas | [Rugvip](https://github.com/Rugvip) | `Rugvip#0019` | | Vincenzo Scamporlino | Spotify | Cubic Belugas | [vinzscam](http://github.com/vinzscam) | `vinzscam#6944` | @@ -218,6 +226,7 @@ Scope: The Backstage Documentation | Maintainer | Organization | GitHub | Discord | | ------------ | ------------ | --------------------------------------------- | -------------- | | Stefan Ålund | Spotify | [stefanalund](https://github.com/stefanalund) | `stalund#9602` | +| Johan Haals | Spotify | [jhaals](https://github.com/jhaals) | `Johan#0679` | ## Emeritus End User Sponsors diff --git a/docs/backend-system/architecture/07-feature-loaders.md b/docs/backend-system/architecture/07-feature-loaders.md index 43954ec443..b2cc574bf9 100644 --- a/docs/backend-system/architecture/07-feature-loaders.md +++ b/docs/backend-system/architecture/07-feature-loaders.md @@ -73,6 +73,29 @@ export default createBackendFeatureLoader({ }); ``` +### Overriding service factories + +Service factories registered by feature loaders have lower priority than ones added directly via `backend.add`. This allows you to use a feature loader for a larger number of service implementations, but still override individual services. + +The ordering in which different feature loaders or service factories are added does not matter. There is also no priority between feature loaders, if two different feature loaders add a factory for the same service, the backend will fail to start. + +```ts +const backend = createBackend(); + +backend.add( + createBackendFeatureLoader({ + async *loader() { + yield import('./commonDiscoveryService'); // discovery service + yield import('./commonRootLoggerService'); // root logger service + }, + }), +); + +backend.add(import('./myDiscoveryService')); // discovery service +``` + +The result of the above example is that the backend starts up with `./myDiscoveryService` as the discovery service implementation, while `./commonDiscoveryService` is ignored. The `./commonRootLoggerService` will still be used. + ### Dynamic logic A feature loader can also be asynchronous, and for example fetch data from an external source to determine which features to load: diff --git a/docs/backend-system/core-services/root-http-router.md b/docs/backend-system/core-services/root-http-router.md index a2316b957b..9ee8599eb5 100644 --- a/docs/backend-system/core-services/root-http-router.md +++ b/docs/backend-system/core-services/root-http-router.md @@ -42,6 +42,29 @@ createBackendPlugin({ ## Configuring the service +### Via `app-config.yaml` + +The `app-config.yaml` file provides configurable options that can be adjusted to meet your `RootHttpRouterService` specific requirements: + +```yaml +backend: + lifecycle: + # (Optional) The maximum time that paused requests will wait for the service to start, before returning an error (defaults to 5 seconds). + # Supported formats: + # - A string in the format of '1d', '2 seconds' etc. as supported by the `ms` library. + # - A standard ISO formatted duration string, e.g. 'P2DT6H' or 'PT1M'. + # - An object with individual units (in plural) as keys, e.g. `{ days: 2, hours: 6 }`. + startupRequestPauseTimeout: { seconds: 10 } + # (Optional) The minimum time that the HTTP server will delay the shutdown of the backend. During this delay health checks will be set to failing, allowing traffic to drain (defaults to 0 seconds). + # Supported formats: + # - A string in the format of '1d', '2 seconds' etc. as supported by the `ms` library. + # - A standard ISO formatted duration string, e.g. 'P2DT6H' or 'PT1M'. + # - An object with individual units (in plural) as keys, e.g. `{ days: 2, hours: 6 }`. + serverShutdownTimeout: { seconds: 20 } +``` + +### Via Code + There's additional options that you can pass to configure the root HTTP Router service. These options are passed when you call `createBackend`. - `indexPath` - optional path to forward all unmatched requests to. Defaults to `/api/app` which is the `app-backend` plugin responsible for serving the frontend application through the backend. diff --git a/docs/features/techdocs/addons.md b/docs/features/techdocs/addons.md index 471e62a57f..fff1f09d71 100644 --- a/docs/features/techdocs/addons.md +++ b/docs/features/techdocs/addons.md @@ -186,7 +186,7 @@ import { useShadowRootElements } from '@backstage/plugin-techdocs-react'; // difference is that you'd set `location` to `TechDocsAddonLocations.Content`. export const MakeAllImagesCatGifsAddon = () => { // This hook can be used to get references to specific elements. If you need - // access to the whole shadow DOM, use the the underlying useShadowRoot() + // access to the whole shadow DOM, use the underlying useShadowRoot() // hook instead. const images = useShadowRootElements(['img']); diff --git a/docs/getting-started/config/database.md b/docs/getting-started/config/database.md index e6d1278b70..699160d550 100644 --- a/docs/getting-started/config/database.md +++ b/docs/getting-started/config/database.md @@ -169,4 +169,4 @@ If you want to read more about the database configuration, here are some helpful - [Configuring Plugin Databases](../../tutorials/configuring-plugin-databases.md#privileges) - [Read more about Knex](http://knexjs.org/), the database wrapper that we use. -- [Install pgAdmin 4](https://www.pgadmin.org/), a helpful tool for querying your database. +- [Install `pgAdmin` 4](https://www.pgadmin.org/), a helpful tool for querying your database. diff --git a/docs/getting-started/keeping-backstage-updated.md b/docs/getting-started/keeping-backstage-updated.md index a641523215..a811a33383 100644 --- a/docs/getting-started/keeping-backstage-updated.md +++ b/docs/getting-started/keeping-backstage-updated.md @@ -32,7 +32,7 @@ dependencies that they have between each other. :::tip -To make the the version bump process even easier and more streamlined we highly recommend using the [Backstage yarn plugin](#managing-package-versions-with-the-backstage-yarn-plugin) +To make the version bump process even easier and more streamlined we highly recommend using the [Backstage yarn plugin](#managing-package-versions-with-the-backstage-yarn-plugin) ::: diff --git a/docs/integrations/gitlab/org.md b/docs/integrations/gitlab/org.md index 66ce117aa0..8249a97c24 100644 --- a/docs/integrations/gitlab/org.md +++ b/docs/integrations/gitlab/org.md @@ -170,7 +170,7 @@ catalog: yourProviderId: host: gitlab.com orgEnabled: true - group: org/teams # Required for gitlab.com when `orgEnabled: true`. Optional for self managed. Must not end with slash. Accepts only groups under the provided path (which will be stripped) + group: org/teams # Required for gitlab.com when `orgEnabled: true`. Optional for self managed. Must not end with slash. Accepts only this group and groups under the provided path (which will be stripped) relations: # Optional - INHERITED # Optional. Members of any ancestor groups will also be considered members of the current group. - DESCENDANTS # Optional. Members of any descendant groups will also be considered members of the current group. @@ -240,7 +240,7 @@ catalog: yourProviderId: host: gitlab.com ## Could also be self hosted. orgEnabled: true - group: org/teams # Required for gitlab.com when `orgEnabled: true`. Optional for self managed. Must not end with slash. Accepts only groups under the provided path (which will be stripped) + group: org/teams # Required for gitlab.com when `orgEnabled: true`. Optional for self managed. Must not end with slash. Accepts only this group and groups under the provided path (which will be stripped) restrictUsersToGroup: true # Optional: Backstage will ingest only users directly assigned to org/teams. includeUsersWithoutSeat: false # Optional: Set to true to include users without paid seat, only applicable for SaaS ``` diff --git a/docs/notifications/index.md b/docs/notifications/index.md index b44b04ef4e..bb8a7dc246 100644 --- a/docs/notifications/index.md +++ b/docs/notifications/index.md @@ -385,7 +385,7 @@ Refer to the [service-to-service auth documentation](https://backstage.io/docs/a An example request for creating a broadcast notification might look like: ```bash -curl -X POST https://[BACKSTAGE_BACKEND]/api/notifications -H "Content-Type: application/json" -H "Authorization: Bearer YOUR_BASE64_SHARED_KEY_TOKEN" -d '{"recipients":{"type":"broadcast"},"payload": {"title": "Title of broadcast message","link": "http://foo.com/bar","severity": "high","topic": "The topic"}}' +curl -X POST https://[BACKSTAGE_BACKEND]/api/notifications/notifications -H "Content-Type: application/json" -H "Authorization: Bearer YOUR_BASE64_SHARED_KEY_TOKEN" -d '{"recipients":{"type":"broadcast"},"payload": {"title": "Title of broadcast message","link": "http://foo.com/bar","severity": "high","topic": "The topic"}}' ``` ## Additional info diff --git a/docs/overview/adopting.md b/docs/overview/adopting.md index 5b6c3bcaed..a6053d0f85 100644 --- a/docs/overview/adopting.md +++ b/docs/overview/adopting.md @@ -94,31 +94,31 @@ Examples of tactics we have used to evangelize Backstage internally: These are some of the metrics that you can use to verify if Backstage has a successful impact on your software development process: -- **Onboarding time** Time until new engineers are productive. At Spotify we +- **Onboarding time** - Time until new engineers are productive. At Spotify we measure this as the time until the employee has merged their 10th PR (this metric was down 55% two years after deploying Backstage). Even though you may not be onboarding engineers at a rapid pace, this metric is a great proxy for the overall complexity of your ecosystem. Reducing it will therefore benefit your whole engineering organization, not just new joiners. -- **Number of merges per developer/day** Less time spent jumping between +- **Number of merges per developer/day** - Less time spent jumping between different tools and looking for information means more time to focus on shipping code. A second level of bottlenecks can be identified if you categorize contributions by domain (services, web, data, etc). -- **Deploys to production** Cousin to the metric above: How many times does an +- **Deploys to production** - Cousin to the metric above: How many times does an engineer push changes into production. -- **MTTR** With clear ownership of all the pieces in your microservices +- **MTTR** - With clear ownership of all the pieces in your microservices ecosystem and all tools integrated into one place, Backstage makes it quicker for teams to find the root cause of failures, and fix them. -- **Context switching** Reducing context switching can help engineers stay in +- **Context switching** - Reducing context switching can help engineers stay in the "zone". We measure the number of different tools an engineer has to interact with in order to get a certain job done (e.g. push a change, follow it into production and validate it did not break anything). -- **T-shapedness** A +- **T-shapedness** - A [T-shaped](https://medium.com/@jchyip/why-t-shaped-people-e8706198e437) engineer is someone that is able to contribute to different domains of engineering. Teams with T-shaped people have fewer bottlenecks and can @@ -126,10 +126,10 @@ successful impact on your software development process: since tools and infrastructure are consistent between domains, and information is available centrally. -- **eNPS** Surveys asking about how productive people feel, how easy it is to +- **eNPS** - Surveys asking about how productive people feel, how easy it is to find information and overall satisfaction with internal tools. -- **Fragmentation** _(Experimental)_ Backstage +- **Fragmentation** _(Experimental)_ - Backstage [Software Templates](../features/software-templates/index.md) help drive standardization in your software ecosystem. By measuring the variance in technology between different software components it is possible to get a sense diff --git a/docs/releases/v1.34.0-next.2-changelog.md b/docs/releases/v1.34.0-next.2-changelog.md new file mode 100644 index 0000000000..7be3b11c59 --- /dev/null +++ b/docs/releases/v1.34.0-next.2-changelog.md @@ -0,0 +1,2268 @@ +# Release v1.34.0-next.2 + +Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.34.0-next.2](https://backstage.github.io/upgrade-helper/?to=1.34.0-next.2) + +## @backstage/backend-app-api@1.1.0-next.2 + +### Minor Changes + +- ebf083d: Service factories added by feature loaders now have lower priority and will be ignored if a factory for the same service is added directly by `backend.add(serviceFactory)`. + +### Patch Changes + +- 0e9c9fa: As soon as a backend termination signal is received, call before shutting down root lifecycle hooks. +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## @backstage/backend-defaults@0.6.0-next.2 + +### Minor Changes + +- fd5d337: Added a new `backend.health.headers` configuration that can be used to set additional headers to include in health check responses. + + **BREAKING CONSUMERS**: As part of this change the `createHealthRouter` function exported from `@backstage/backend-defaults/rootHttpRouter` now requires the root config service to be passed through the `config` option. + +- 3f34ea9: Throttles Bitbucket Server API calls + +### Patch Changes + +- dfc8b41: Updated dependency `@opentelemetry/api` to `^1.9.0`. +- 57e0b11: The user and plugin token verification in the default `AuthService` implementation will no longer forward verification errors to the caller, and instead log them as warnings. +- 57e0b11: The default `authServiceFactory` now correctly depends on the plugin scoped `Logger` services rather than the root scoped one. +- 0e9c9fa: Implements the `DefaultRootLifecycleService.addBeforeShutdownHook` method, and updates `DefaultRootHttpRouterService` and `DefaultRootHealthService` to listen to that event to stop accepting traffic and close service connections. +- d0cbd82: Remove use of the `stoppable` library on the `DefaultRootHttpRouterService` as Node's native http server [close](https://nodejs.org/api/http.html#serverclosecallback) method already drains requests. + Also, we pass a new `lifecycleMiddleware` to the `rootHttpRouterServiceFactory` configure function that must be called manually if you don't call `applyDefaults`. +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/backend-app-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/cli-node@0.2.11-next.1 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/backend-dev-utils@0.1.5 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-aws-node@0.1.14-next.0 + - @backstage/types@1.2.0 + +## @backstage/backend-openapi-utils@0.4.0-next.2 + +### Minor Changes + +- afcebea: Fixed a Typescript error when trying to use the new OpenAPI server-side generated code. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-catalog@1.26.0-next.2 + +### Minor Changes + +- 25beb82: Adds an optional columns attribute to HasSubdomainsCardProps and changes its default columns +- 39f1abc: Consistent title behaviour across CatalogTable, CursorPaginatedCatalogTable, and OffsetPaginatedCatalogTable. + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + - @backstage/plugin-scaffolder-common@1.5.8-next.1 + - @backstage/plugin-search-common@1.2.16-next.0 + - @backstage/plugin-search-react@1.8.4-next.2 + +## @backstage/plugin-catalog-backend@1.29.0-next.2 + +### Minor Changes + +- c1307b4: Implement `/entities` in terms of `queryEntities` to not run into memory and performance problems on large catalogs + +### Patch Changes + +- dfc8b41: Updated dependency `@opentelemetry/api` to `^1.9.0`. +- 8013c9c: Perform the by-query count inlined with the main query +- feba9ee: Use a join based strategy for filtering, when having small page sizes +- 1fdb48e: Use a faster count method on pg when computing some metrics +- 0c33465: Implement `/entities/by-name/:kind/:namespace/:name` using `getEntitiesByRefs` +- d93390d: When parsing filters, do not make redundant `anyOf` and `allOf` nodes when there's only a single entry within them +- 24ecea8: Avoid extra ordering in by-query when the user doesn't ask for it +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/backend-openapi-utils@0.4.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/plugin-search-backend-module-catalog@0.2.6-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.3.0-next.2 + +### Minor Changes + +- 3f34ea9: Throttles Bitbucket Server API calls + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + +## @backstage/plugin-catalog-backend-module-gitlab@0.6.0-next.2 + +### Minor Changes + +- 99dce5c: Implemented discovery for top-level groups defined in config.group or if undefined global top-level group in Gitlab + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-catalog-common@1.1.2-next.0 + +## @backstage/plugin-notifications@0.5.0-next.2 + +### Minor Changes + +- fc15b77: Switched to using the new `/notifications` endpoints. Be sure to update the `notifications` plugin backend before deploying this frontend plugin change. + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/theme@0.6.3-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-notifications-common@0.0.7-next.0 + - @backstage/plugin-signals-react@0.0.8-next.0 + +## @backstage/plugin-notifications-backend@0.5.0-next.2 + +### Minor Changes + +- fc15b77: **BREAKING**: Removed redundant `/health` endpoint, switch to using [the built-in endpoint instead](https://backstage.io/docs/backend-system/core-services/root-health). + +### Patch Changes + +- fc15b77: Deprecated root '/' endpoints, moving them under `/notifications` instead. +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/plugin-notifications-node@0.2.10-next.2 + - @backstage/plugin-signals-node@0.1.15-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-notifications-common@0.0.7-next.0 + +## @backstage/app-defaults@1.5.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + +## @backstage/backend-dynamic-feature-service@0.5.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/backend-app-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-events-backend@0.4.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/plugin-app-node@0.1.28-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/cli-node@0.2.11-next.1 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + +## @backstage/backend-plugin-api@1.1.0-next.2 + +### Patch Changes + +- 0e9c9fa: The `RootLifecycleService` now has a new `addBeforeShutdownHook` method, and hooks added through this method will run immediately when a termination event is received. + + The backend will not proceed with the shutdown and run the `Shutdown` hooks until all `BeforeShutdown` hooks have completed. + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/backend-test-utils@1.2.0-next.2 + +### Patch Changes + +- 0e9c9fa: Mock the new `RootLifecycleService.addBeforeShutdownHook` method. +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/backend-app-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## @backstage/catalog-client@1.9.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + +## @backstage/catalog-model@1.7.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/types@1.2.0 + +## @backstage/cli@0.29.3-next.2 + +### Patch Changes + +- 62a9062: Updated dependency `@module-federation/enhanced` to `^0.8.0`. +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/cli-node@0.2.11-next.1 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/eslint-plugin@0.1.10 + - @backstage/integration@1.16.0-next.1 + - @backstage/release-manifests@0.0.12-next.1 + - @backstage/types@1.2.0 + +## @backstage/cli-node@0.2.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/types@1.2.0 + +## @backstage/config@1.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/types@1.2.0 + +## @backstage/config-loader@1.9.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## @backstage/core-app-api@1.15.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1-next.0 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + +## @backstage/core-compat-api@0.3.4-next.2 + +### Patch Changes + +- 1f30730: Updated dependency `@oriflame/backstage-plugin-score-card` to `^0.9.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/version-bridge@1.0.10 + +## @backstage/core-components@0.16.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/theme@0.6.3-next.0 + - @backstage/version-bridge@1.0.10 + +## @backstage/core-plugin-api@1.10.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + +## @backstage/create-app@0.5.23-next.2 + +### Patch Changes + +- e913fdf: Add github backend module to create-app and improve error messages +- Updated dependencies + - @backstage/cli-common@0.1.15 + +## @backstage/dev-utils@1.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/app-defaults@1.5.15-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/theme@0.6.3-next.0 + +## @backstage/errors@1.2.6-next.0 + +### Patch Changes + +- 1d4b5b9: Trim `error.cause.stack` in addition to `error.stack` when trimming stack traces from serialized errors. +- Updated dependencies + - @backstage/types@1.2.0 + +## @backstage/frontend-app-api@0.10.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-defaults@0.1.4-next.2 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + +## @backstage/frontend-defaults@0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/frontend-app-api@0.10.3-next.2 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/plugin-app@0.1.4-next.2 + +## @backstage/frontend-plugin-api@0.9.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + +## @backstage/frontend-test-utils@0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1-next.0 + - @backstage/frontend-app-api@0.10.3-next.2 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/test-utils@1.7.3-next.1 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-app@0.1.4-next.2 + +## @backstage/integration@1.16.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + +## @backstage/integration-aws-node@0.1.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + +## @backstage/integration-react@1.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1-next.0 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/integration@1.16.0-next.1 + +## @backstage/repo-tools@0.12.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/cli-node@0.2.11-next.1 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/cli-common@0.1.15 + +## @techdocs/cli@1.8.24-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/plugin-techdocs-node@1.12.15-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + +## @backstage/test-utils@1.7.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/theme@0.6.3-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + +## @backstage/plugin-api-docs@0.12.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.26.0-next.2 + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + +## @backstage/plugin-app@0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + +## @backstage/plugin-app-backend@0.4.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-app-node@0.1.28-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-app-node@0.1.28-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/config-loader@1.9.3-next.1 + +## @backstage/plugin-app-visualizer@0.1.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + +## @backstage/plugin-auth-backend@0.24.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-backend-module-atlassian-provider@0.3.3-next.2 + - @backstage/plugin-auth-backend-module-auth0-provider@0.1.3-next.2 + - @backstage/plugin-auth-backend-module-bitbucket-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.1.3-next.2 + - @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.3.3-next.2 + - @backstage/plugin-auth-backend-module-github-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-gitlab-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-microsoft-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-oauth2-provider@0.3.3-next.2 + - @backstage/plugin-auth-backend-module-oidc-provider@0.3.3-next.2 + - @backstage/plugin-auth-backend-module-okta-provider@0.1.3-next.2 + - @backstage/plugin-auth-backend-module-onelogin-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-aws-alb-provider@0.3.1-next.2 + - @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.3.3-next.2 + - @backstage/plugin-auth-backend-module-google-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.3-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-auth-backend-module-atlassian-provider@0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-auth0-provider@0.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-aws-alb-provider@0.3.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-backend@0.24.1-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/catalog-model@1.7.2-next.0 + +## @backstage/plugin-auth-backend-module-bitbucket-provider@0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/config@1.3.1-next.0 + +## @backstage/plugin-auth-backend-module-gcp-iap-provider@0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/types@1.2.0 + +## @backstage/plugin-auth-backend-module-github-provider@0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-gitlab-provider@0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-google-provider@0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-guest-provider@0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/catalog-model@1.7.2-next.0 + +## @backstage/plugin-auth-backend-module-microsoft-provider@0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-oauth2-provider@0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-oidc-provider@0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-backend@0.24.1-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-okta-provider@0.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-onelogin-provider@0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-pinniped-provider@0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/config@1.3.1-next.0 + +## @backstage/plugin-auth-backend-module-vmware-cloud-provider@0.4.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/catalog-model@1.7.2-next.0 + +## @backstage/plugin-auth-node@0.5.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-auth-react@0.1.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + +## @backstage/plugin-bitbucket-cloud-common@0.2.26-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.0-next.1 + +## @backstage/plugin-catalog-backend-module-aws@0.4.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-aws-node@0.1.14-next.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + +## @backstage/plugin-catalog-backend-module-azure@0.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-catalog-common@1.1.2-next.0 + +## @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/backend-openapi-utils@0.4.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.4.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-bitbucket-cloud-common@0.2.26-next.1 + - @backstage/plugin-catalog-common@1.1.2-next.0 + +## @backstage/plugin-catalog-backend-module-gcp@0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + +## @backstage/plugin-catalog-backend-module-gerrit@0.2.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + +## @backstage/plugin-catalog-backend-module-github@0.7.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-catalog-common@1.1.2-next.0 + +## @backstage/plugin-catalog-backend-module-github-org@0.3.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-backend-module-github@0.7.8-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + +## @backstage/plugin-catalog-backend-module-gitlab-org@0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-backend-module-gitlab@0.6.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.6.1-next.2 + +### Patch Changes + +- dfc8b41: Updated dependency `@opentelemetry/api` to `^1.9.0`. +- d42ecb0: Remove backend-common package from incremental-ingestion plugin and update related code +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-catalog-backend-module-ldap@0.11.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + +## @backstage/plugin-catalog-backend-module-logs@0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + +## @backstage/plugin-catalog-backend-module-msgraph@0.6.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + +## @backstage/plugin-catalog-backend-module-openapi@0.2.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.2.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-scaffolder-common@1.5.8-next.1 + +## @backstage/plugin-catalog-backend-module-unprocessed@0.5.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.6-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-catalog-common@1.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + +## @backstage/plugin-catalog-graph@0.4.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/types@1.2.0 + +## @backstage/plugin-catalog-import@0.12.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/plugin-catalog-common@1.1.2-next.0 + +## @backstage/plugin-catalog-node@1.15.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-catalog-react@1.14.3-next.2 + +### Patch Changes + +- 95092a6: Fixed an issue where `` would re-render its children on page load for smaller screens, potentially leading to unnecessary additional backend requests. +- 4a43398: Fixed an issue where the `EntityOwnerPicker` component failed to load when the `mode` prop was set to `owners-only`. In this mode, the `EntityOwnerPicker` does not load details about the owners, such as `displayName` or `title`. To display these details, use `mode=all` instead. +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/frontend-test-utils@0.2.4-next.2 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + +## @backstage/plugin-catalog-unprocessed-entities@0.2.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + +## @backstage/plugin-catalog-unprocessed-entities-common@0.0.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-config-schema@0.1.63-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-devtools@0.1.22-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/plugin-devtools-common@0.1.14-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + +## @backstage/plugin-devtools-backend@0.5.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-devtools-common@0.1.14-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-devtools-common@0.1.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-events-backend@0.4.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/backend-openapi-utils@0.4.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-events-backend-module-aws-sqs@0.4.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-events-backend-module-azure@0.2.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + +## @backstage/plugin-events-backend-module-bitbucket-cloud@0.2.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + +## @backstage/plugin-events-backend-module-gerrit@0.2.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + +## @backstage/plugin-events-backend-module-github@0.2.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + +## @backstage/plugin-events-backend-module-gitlab@0.2.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + +## @backstage/plugin-events-backend-test-utils@0.1.39-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.6-next.2 + +## @backstage/plugin-events-node@0.4.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-home@0.8.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-home-react@0.1.21-next.2 + +## @backstage/plugin-home-react@0.1.21-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + +## @backstage/plugin-kubernetes@0.12.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + - @backstage/plugin-kubernetes-react@0.5.2-next.2 + +## @backstage/plugin-kubernetes-backend@0.19.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-kubernetes-node@0.2.1-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration-aws-node@0.1.14-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-kubernetes-cluster@0.0.20-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + - @backstage/plugin-kubernetes-react@0.5.2-next.2 + +## @backstage/plugin-kubernetes-common@0.9.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-kubernetes-node@0.2.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + +## @backstage/plugin-kubernetes-react@0.5.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + +## @backstage/plugin-notifications-backend-module-email@0.3.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-notifications-node@0.2.10-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration-aws-node@0.1.14-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-notifications-common@0.0.7-next.0 + +## @backstage/plugin-notifications-common@0.0.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1-next.0 + +## @backstage/plugin-notifications-node@0.2.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-signals-node@0.1.15-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/plugin-notifications-common@0.0.7-next.0 + +## @backstage/plugin-org@0.6.34-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/plugin-catalog-common@1.1.2-next.0 + +## @backstage/plugin-org-react@0.1.33-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + +## @backstage/plugin-permission-backend@0.5.52-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-permission-backend-module-allow-all-policy@0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-permission-common@0.8.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-permission-node@0.8.6-next.2 + +### Patch Changes + +- b149e2a: The `createPermissionIntegrationRouter` function now detects and prevents the exposure of duplicate permissions. +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-permission-react@0.4.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1-next.0 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-proxy-backend@0.5.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-scaffolder@1.27.2-next.2 + +### Patch Changes + +- 184161f: Scaffolder field extensions registered with `FormFieldBlueprint` are now collected in the `useCustomFieldExtensions` hook, enabling them for use in the scaffolder. +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/plugin-scaffolder-react@1.14.2-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + - @backstage/plugin-scaffolder-common@1.5.8-next.1 + +## @backstage/plugin-scaffolder-backend@1.28.0-next.2 + +### Patch Changes + +- dfc8b41: Updated dependency `@opentelemetry/api` to `^1.9.0`. +- 6c326cf: The --no-node-snapshot check needs to be done against process.execArgv instead of process.argv +- e913fdf: Add github backend module to create-app and improve error messages +- 0851834: Resolved an issue where the `templateManagementPermission` was not being exposed through the `/permissions/metadata` endpoint. +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-scaffolder-backend-module-github@0.5.4-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/plugin-scaffolder-backend-module-azure@0.2.4-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.5-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.4-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.4-next.2 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.4-next.2 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.4-next.2 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.7.0-next.2 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/types@1.2.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.26-next.1 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-scaffolder-common@1.5.8-next.1 + +## @backstage/plugin-scaffolder-backend-module-azure@0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.4-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.4-next.2 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-bitbucket-cloud-common@0.2.26-next.1 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.3.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/types@1.2.0 + +## @backstage/plugin-scaffolder-backend-module-gcp@0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-gerrit@0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-gitea@0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-github@0.5.4-next.2 + +### Patch Changes + +- e913fdf: Add github backend module to create-app and improve error messages +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.7.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-notifications@0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-notifications-node@0.2.10-next.2 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/plugin-notifications-common@0.0.7-next.0 + +## @backstage/plugin-scaffolder-backend-module-rails@0.5.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/types@1.2.0 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.4.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/plugin-scaffolder-node-test-utils@0.1.17-next.2 + - @backstage/types@1.2.0 + +## @backstage/plugin-scaffolder-common@1.5.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-scaffolder-node@0.6.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/types@1.2.0 + - @backstage/plugin-scaffolder-common@1.5.8-next.1 + +## @backstage/plugin-scaffolder-node-test-utils@0.1.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-test-utils@1.2.0-next.2 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/types@1.2.0 + +## @backstage/plugin-scaffolder-react@1.14.2-next.2 + +### Patch Changes + +- 184161f: Scaffolder field extensions registered with `FormFieldBlueprint` are now collected in the `useCustomFieldExtensions` hook, enabling them for use in the scaffolder. +- Updated dependencies + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/theme@0.6.3-next.0 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-permission-react@0.4.29-next.0 + - @backstage/plugin-scaffolder-common@1.5.8-next.1 + +## @backstage/plugin-search@1.4.21-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-search-common@1.2.16-next.0 + - @backstage/plugin-search-react@1.8.4-next.2 + +## @backstage/plugin-search-backend@1.8.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/backend-openapi-utils@0.4.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + +## @backstage/plugin-search-backend-module-catalog@0.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + +## @backstage/plugin-search-backend-module-elasticsearch@1.6.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration-aws-node@0.1.14-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + +## @backstage/plugin-search-backend-module-explore@0.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + +## @backstage/plugin-search-backend-module-pg@0.5.39-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + +## @backstage/plugin-search-backend-module-stack-overflow-collator@0.3.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + +## @backstage/plugin-search-backend-module-techdocs@0.3.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-techdocs-node@1.12.15-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + +## @backstage/plugin-search-backend-node@1.3.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + +## @backstage/plugin-search-common@1.2.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-search-react@1.8.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/theme@0.6.3-next.0 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-search-common@1.2.16-next.0 + +## @backstage/plugin-signals@0.0.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/theme@0.6.3-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-signals-react@0.0.8-next.0 + +## @backstage/plugin-signals-backend@0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/plugin-signals-node@0.1.15-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-signals-node@0.1.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-signals-react@0.0.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-techdocs@1.11.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-auth-react@0.1.10-next.2 + - @backstage/plugin-search-common@1.2.16-next.0 + - @backstage/plugin-search-react@1.8.4-next.2 + - @backstage/plugin-techdocs-common@0.1.0 + - @backstage/plugin-techdocs-react@1.2.12-next.2 + +## @backstage/plugin-techdocs-addons-test-utils@1.0.43-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.26.0-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/test-utils@1.7.3-next.1 + - @backstage/plugin-search-react@1.8.4-next.2 + - @backstage/plugin-techdocs@1.11.3-next.2 + - @backstage/plugin-techdocs-react@1.2.12-next.2 + +## @backstage/plugin-techdocs-backend@1.11.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.3.4-next.2 + - @backstage/plugin-techdocs-node@1.12.15-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-techdocs-common@0.1.0 + +## @backstage/plugin-techdocs-module-addons-contrib@1.1.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/plugin-techdocs-react@1.2.12-next.2 + +## @backstage/plugin-techdocs-node@1.12.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-aws-node@0.1.14-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + - @backstage/plugin-techdocs-common@0.1.0 + +## @backstage/plugin-techdocs-react@1.2.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/version-bridge@1.0.10 + +## @backstage/plugin-user-settings@0.8.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/theme@0.6.3-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-signals-react@0.0.8-next.0 + - @backstage/plugin-user-settings-common@0.0.1 + +## @backstage/plugin-user-settings-backend@0.2.28-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-signals-node@0.1.15-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-user-settings-common@0.0.1 + +## example-app@0.2.104-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.26.0-next.2 + - @backstage/plugin-notifications@0.5.0-next.2 + - @backstage/cli@0.29.3-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/plugin-scaffolder-react@1.14.2-next.2 + - @backstage/plugin-scaffolder@1.27.2-next.2 + - @backstage/plugin-api-docs@0.12.2-next.2 + - @backstage/plugin-catalog-graph@0.4.14-next.2 + - @backstage/plugin-catalog-import@0.12.8-next.2 + - @backstage/plugin-org@0.6.34-next.2 + - @backstage/plugin-user-settings@0.8.17-next.2 + - @backstage/app-defaults@1.5.15-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-app-api@0.10.3-next.2 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-auth-react@0.1.10-next.2 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.12-next.2 + - @backstage/plugin-devtools@0.1.22-next.2 + - @backstage/plugin-home@0.8.3-next.2 + - @backstage/plugin-kubernetes@0.12.2-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.20-next.2 + - @backstage/plugin-permission-react@0.4.29-next.0 + - @backstage/plugin-search@1.4.21-next.2 + - @backstage/plugin-search-common@1.2.16-next.0 + - @backstage/plugin-search-react@1.8.4-next.2 + - @backstage/plugin-signals@0.0.14-next.2 + - @backstage/plugin-techdocs@1.11.3-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.19-next.2 + - @backstage/plugin-techdocs-react@1.2.12-next.2 + +## example-app-next@0.0.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.26.0-next.2 + - @backstage/plugin-notifications@0.5.0-next.2 + - @backstage/cli@0.29.3-next.2 + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/plugin-scaffolder-react@1.14.2-next.2 + - @backstage/plugin-scaffolder@1.27.2-next.2 + - @backstage/plugin-api-docs@0.12.2-next.2 + - @backstage/plugin-catalog-graph@0.4.14-next.2 + - @backstage/plugin-catalog-import@0.12.8-next.2 + - @backstage/plugin-org@0.6.34-next.2 + - @backstage/plugin-user-settings@0.8.17-next.2 + - @backstage/app-defaults@1.5.15-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-app-api@0.10.3-next.2 + - @backstage/frontend-defaults@0.1.4-next.2 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-app@0.1.4-next.2 + - @backstage/plugin-app-visualizer@0.1.14-next.2 + - @backstage/plugin-auth-react@0.1.10-next.2 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.12-next.2 + - @backstage/plugin-home@0.8.3-next.2 + - @backstage/plugin-kubernetes@0.12.2-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.20-next.2 + - @backstage/plugin-permission-react@0.4.29-next.0 + - @backstage/plugin-search@1.4.21-next.2 + - @backstage/plugin-search-common@1.2.16-next.0 + - @backstage/plugin-search-react@1.8.4-next.2 + - @backstage/plugin-signals@0.0.14-next.2 + - @backstage/plugin-techdocs@1.11.3-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.19-next.2 + - @backstage/plugin-techdocs-react@1.2.12-next.2 + +## app-next-example-plugin@0.0.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/frontend-plugin-api@0.9.3-next.2 + +## example-backend@0.0.33-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.28.0-next.2 + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-scaffolder-backend-module-github@0.5.4-next.2 + - @backstage/plugin-notifications-backend@0.5.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/plugin-app-backend@0.4.3-next.2 + - @backstage/plugin-auth-backend@0.24.1-next.2 + - @backstage/plugin-auth-backend-module-github-provider@0.2.3-next.2 + - @backstage/plugin-devtools-backend@0.5.0-next.2 + - @backstage/plugin-events-backend@0.4.0-next.2 + - @backstage/plugin-kubernetes-backend@0.19.1-next.2 + - @backstage/plugin-proxy-backend@0.5.9-next.2 + - @backstage/plugin-search-backend@1.8.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/plugin-signals-backend@0.2.4-next.2 + - @backstage/plugin-techdocs-backend@1.11.4-next.2 + - @backstage/plugin-catalog-backend-module-openapi@0.2.5-next.2 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.3-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.3-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.3-next.2 + - @backstage/plugin-permission-backend@0.5.52-next.2 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.3-next.2 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.5-next.2 + - @backstage/plugin-search-backend-module-catalog@0.2.6-next.2 + - @backstage/plugin-search-backend-module-explore@0.2.6-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.3.4-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## example-backend-legacy@0.2.105-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.28.0-next.2 + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/plugin-app-backend@0.4.3-next.2 + - @backstage/plugin-auth-backend@0.24.1-next.2 + - @backstage/plugin-events-backend@0.4.0-next.2 + - @backstage/plugin-kubernetes-backend@0.19.1-next.2 + - @backstage/plugin-proxy-backend@0.5.9-next.2 + - @backstage/plugin-search-backend@1.8.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/plugin-signals-backend@0.2.4-next.2 + - @backstage/plugin-techdocs-backend@1.11.4-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.3-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/plugin-permission-backend@0.5.52-next.2 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.4-next.2 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.7.0-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.5.4-next.2 + - @backstage/plugin-search-backend-module-catalog@0.2.6-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.6.3-next.2 + - @backstage/plugin-search-backend-module-explore@0.2.6-next.2 + - @backstage/plugin-search-backend-module-pg@0.5.39-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.3.4-next.2 + - @backstage/plugin-signals-node@0.1.15-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## e2e-test@0.2.23-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.23-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/cli-common@0.1.15 + +## @internal/frontend@0.0.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + +## @internal/scaffolder@0.0.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.14.2-next.2 + - @backstage/frontend-plugin-api@0.9.3-next.2 + +## techdocs-cli-embedded-app@0.2.103-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.26.0-next.2 + - @backstage/cli@0.29.3-next.2 + - @backstage/app-defaults@1.5.15-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/test-utils@1.7.3-next.1 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-techdocs@1.11.3-next.2 + - @backstage/plugin-techdocs-react@1.2.12-next.2 + +## @internal/plugin-todo-list@1.0.34-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + +## @internal/plugin-todo-list-backend@1.0.34-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @internal/plugin-todo-list-common@1.0.23-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.8.3-next.0 diff --git a/microsite/blog/2023-05-06-backstage-deploy-alpha.mdx b/microsite/blog/2023-05-06-backstage-deploy-alpha.mdx index 1a783b026a..126bbb9e7d 100644 --- a/microsite/blog/2023-05-06-backstage-deploy-alpha.mdx +++ b/microsite/blog/2023-05-06-backstage-deploy-alpha.mdx @@ -40,7 +40,7 @@ Deploy CLI makes use of [Pulumi](https://www.pulumi.com/docs/) which is an infra You can find the step-by-step installation documentation for Pulumi under the [Deployment section](https://backstage.io/docs/deployment/backstage-deploy/aws-lightsail). -But we summarize the steps to deploy your POC here. You can invoke the the CLI you can use the following command: +But we summarize the steps to deploy your POC here. You can invoke the CLI you can use the following command: ```bash $ npx backstage-deploy aws --create-dockerfile diff --git a/microsite/blog/2024-12-09-kubecon-slc-24.mdx b/microsite/blog/2024-12-09-kubecon-slc-24.mdx new file mode 100644 index 0000000000..c3fa2f70a8 --- /dev/null +++ b/microsite/blog/2024-12-09-kubecon-slc-24.mdx @@ -0,0 +1,201 @@ +--- +# prettier-ignore +title: "Backstage in Salt Lake City: Highlights from BackstageCon and KubeCon + CloudNativeCon North America 2024" +author: André Wanlin, Spotify & Camila Loiola, Spotify +--- + +![Beaver in front of snowcapped mountains peeking over a banner that reads BackstageCon and KubeCon + CloudNativeCon North America 2024, Salt Lake City](assets/2024-12-09/backstagecon-kubecon-2024-salt-lake-city.png) + +**tl;dr:** Salt Lake City did not disappoint! Backstage continues to be at the forefront of many conversations being had at BackstageCon and across KubeCon + CloudNativeCon. If you weren't able to join us, all the [BackstageCon talks][yt] are available for replay on YouTube. Read on for the highlights — plus, photos of super cute pups — as a treat! 🐕 + +[yt]: https://www.youtube.com/playlist?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X + +{/* truncate */} + +## What everyone was talking about at BackstageCon🦫 + +![Speakers on stage at BackstageCon North America 2024](assets/2024-12-09/kc24slc-spotify-backstagecon.jpg) + +[BackstageCon](https://events.linuxfoundation.org/kubecon-cloudnativecon-north-america/co-located-events/backstagecon/) featured a day of talks tailored to the diverse Backstage community. Whether you were an evaluator, adopter, integrator, builder, or an innovator, there was something valuable for everyone. Here were the big themes from the day. + +### Evaluating Backstage ROI + +- Olivier (Avalia Systems) presented what makes digital portals [helpful to C-level executives][olivier]. + +- Himanshu (Harness) shared strategies for adopting Backstage in ways that drive [meaningful value for engineers][himanshu]. + +- Eric (Quantum Metric) explained [how startups can benefit][eric] from what big techies have been contributing to Backstage. + +- Tom (Spotify) shared how developer productivity furthers Spotify’s mission to [empower creators][tom] and what the future holds for Backstage. + +[olivier]: https://youtu.be/kb3F98fKvaQ?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X +[himanshu]: https://youtu.be/FACtDHQvNf0?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X +[eric]: https://youtu.be/9qPsuMSw_dM?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X +[tom]: https://youtu.be/AU9BwkRMmMY?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X + +### Sharing Backstage adoption journeys + +- A panel discussion — featuring practitioners from Adobe, American Airlines, JPMorgan Chase, Red Hat, and Roku — showcased [real-world adoption stories from large companies][panel], spanning various stages of Backstage usage. Hear how devs at American Airlines can use Scaffolder to get a new site provisioned and deployed on the .aa.com domain in 20 minutes. “I’ve done it in seven,” said Jay Cox, principal engineer. “It used to take a month.” + +- Lizzie (Booz Allen Hamilton) explored corporate barriers to Backstage adoption and lessons learned along the way, including how to navigate [cultural tensions][lizzie] and the importance of listening to your devs, in order to bring the latest advancements in developer experience to a government consulting company that’s going on “110 years young”. + +- Amber and Daniel (Liatrio) elaborated on why [automated governance][amber] belongs inside Backstage portals to facilitate centralized compliance — so your devs don't get held up from going to prod by unforeseen checks. + +[panel]: https://youtu.be/DAjhjS2Xg4Q?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X +[lizzie]: https://youtu.be/RTYVmMbkdNA?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X +[amber]: https://youtu.be/GaGbjMJCcRU?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X + +### Maintaining a Backstage instance + +- Djamaile and Mitch (Spotify) provided [actionable tips][djamaile] for managing Backstage instances, including how to keep them aligned with the latest open source features. + +- Ashna and Mesut (Booking.com) showed how to customize your instance to mirror your company's unique identity and how to leverage reusability for a [smoother user experience for your devs][ashna]. + +- Paul (Red Hat) presented a [platform engineer’s POV][paul] of what it means to maintain a Backstage instance. + +- Yishai (Linear B) spoke about how to approach software engineering intelligence (SEI) and developer productivity metrics inside Backstage, including [do’s and don’ts][yishai]. + +[djamaile]: https://youtu.be/dbLqwEVl52U?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X +[ashna]: https://youtu.be/QV40Yz2i3jQ?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X +[paul]: https://youtu.be/CtbfN--mJkE?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X +[yishai]: https://youtu.be/mxVW2AGoI3A?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X + +### Building with Backstage core features + +- Avantika and Emma (Spotify) walked us through the advantages of the new backend system, recommending [best practices for plugin development][tika] and showcasing why migrating to this updated version is an extensibility game changer. + +- Will and Ryan (Microsoft) shared how Software Catalog and Templates provide the model to [build visualizations][will] of your cloud native applications. + +[tika]: https://youtu.be/n7GUlLHN2tQ?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X +[will]: https://youtu.be/U2-Lo-yuvdc?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X + +### AI-powered Backstage plugins and modules + +Innovative use cases featuring AI integration took center stage. + +- Niall (Amazon Web Services) demonstrated how to [interact with plugin services][niall] using artificial intelligence prompts. + +- Ben (Red Hat) outlined [broader AI integrations][ben] to enhance Backstage, sparking exciting possibilities for the future. + +The sessions offered a wealth of knowledge and inspiration, underscoring the versatility and potential of Backstage for organizations at every level. The Backstage booth was hopping all day long as community members and cloud natives took advantage of being able to ask the experts questions and learn more about the project. + +[niall]: https://youtu.be/DCXzCrIDOAs?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X +[ben]: https://youtu.be/cl6E0A5R_nI?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X + +## Backstage at the big show: KubeCon⎈ + CloudNativeCon☁️ + +![A view of the crowd entering KubeCon as seen from the top of the convention center escalator](assets/2024-12-09/kc24slc-cncf-entrance.jpg) +📸 _[See more KubeCon photos from the CNCF’s Flickr album](https://www.flickr.com/photos/143247548@N03/albums/72177720321905538/) →_ + +My friends, what an intense conference! + +Over the course of three packed days, there were a bunch of activities, including talks, a kiosk, and a Contribfest, all centered around Backstage. + +### Maintainers take the stage + +![Backstage maintainers presenting in a ballroom](assets/2024-12-09/kc24slc-spotify-maintainers.jpg) + +This may be old hat for those who are regular KubeCon attendees, but it’s still pretty exciting to catch up on all the Backstage updates straight from the core maintainers. Spotify’s Ben Lambert and Patrik Oldsberg were in the spotlight in Ballroom C addressing an attentive crowd of Backstage adopters, users, and fans. + +Highlights of their maintainers talk include: + +- **Project updates:** Yarn 4 is now the default, the new built-in event bus has arrived, and the (New) Backend System is now 1.0! +- **Security Audit:** Another security audit has been completed with the helpful support of the CNCF +- **Scaffolder updates:** Addition of Form Decorators and support for Retries! +- **New Frontend System:** Focus on the plugin builder experience! + +Watch their entire talk — “[How to Expand Your IDP: The New Building Blocks of Backstage](https://youtu.be/BzPCJMQH8tg?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X)” — for all the details. + +### Toyota and Akamai in the house + +![A packed ballroom with Backstage displayed on two large screens](assets/2024-12-09/kc24slc-cncf-toyota.jpg) +📸 [CNCF](https://www.flickr.com/photos/143247548@N03/albums/72177720321905538/) + +There were great talks from Backstage adopters during KubeCon, too. Toyota and Akamai packed the rooms with their Backstage knowledge. + +- “[Shifting Gears: Leveraging CNCF Tools to Streamline Operations at Toyota Connected][toyota]”: Benson and Rob talk about failures and successes adopting CNCF tools (including ArgoCD and Backstage) to unify operations, streamline workflows, and enhance cross-team collaboration. + +- “[From Chaos to Calm: Building a Unified and Scalable CI/CD Pipeline at Akamai][akamai]”: Tomer dives into development efficiency and how you can “conquer cloud-native deployments by adding the right tools, such as Argo Rollouts and Backstage”. + +[toyota]: https://youtu.be/4w_AC81_GZM?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X&t=856 +[akamai]: https://youtu.be/RFVB9CEEn1I?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X + +### And the award goes to… + +![Adobe accepts the CNCF Top End User Award on the Keynote stage at KubeCon + CloudNativeCon North America 2024](assets/2024-12-09/kc24slc-cncf-adobe.jpg) + +📸 [CNCF](https://www.flickr.com/photos/143247548@N03/albums/72177720321905538/) + +Adobe gave a shoutout to Backstage from the Keynote mainstage on Thursday morning when they (spoiler alert) [accepted the CNCF’s Top End User Award][keynote], thanking the cloud native community and all the projects that they use. + +But Adobe isn’t just a Backstage adopter, they are a model citizen — giving back to the community through their example, having “developed a reference architecture for its IDP, built using Argo, Backstage, Helm, and Kubernetes, which other organizations can use as a template for designing and implementing their systems”. + +As Taylor Dolezal, head of ecosystem at the CNCF, [says][announcement]: “Their commitment to nurturing technological excellence and developer experience exemplifies what we hope to see in the end user ecosystem. It’s not just about tool adoption or code contributions — it’s about synthesizing these learnings into assets that empower others in their cloud native journeys.” + +Way to go, Adobe! + +[keynote]: https://youtu.be/p7J0lAU3AWo +[announcement]: https://www.cncf.io/announcements/2024/11/14/cncf-presents-top-end-user-award-to-adobe/ + +### A bustling CNCF project pavilion + +![A volunteer wearing an “Ask me about Backstage” T-shirt talks to a visitor at the project kiosk](assets/2024-12-09/kc24slc-cncf-kiosk.jpg) + +📸 [CNCF](https://www.flickr.com/photos/143247548@N03/albums/72177720321905538/) + +The CNCF Projects Pavilion was buzzing with activity all week, and the Backstage kiosk was a hub of excitement. Attendees stopped by with a mix of curiosity and enthusiasm, sparking conversations that highlighted the dynamic nature of our community. + +Curious visitors asked, “What is Backstage all about?”, while adopters sought personalized advice on customizing Backstage for their specific company needs. Contributors dropped in to say, “Hey, you reviewed my pull request!” And professionals proudly shared their achievements as Backstage experts — in fact, now there’s a way to make that expertise official — by becoming a [Certified Backstage Associate (CBA)](https://training.linuxfoundation.org/blog/just-launched-certified-backstage-associate-cba/), a new certification that was just launched by the CNCF and The Linux Foundation. + +Developers eager to give back to the community came to learn how to start contributing, and some of the kindest Backstage fans simply stopped by to say, “Thank you”. Their gratitude and encouragement are a powerful reminder of why we do what we do. + +Every interaction in person made the day special, and we wrapped up with a deep sense of fulfillment and pride in how far Backstage has come. Here's to building an even brighter future together! + +## Contribfest! It’s All About Community👩‍💻 + +![Various developers and their laptops participating in the Backstage Contribfest](assets/2024-12-09/kc24slc-spotify-cncf-contribfest.gif) + +📸 Spotify, [CNCF](https://www.flickr.com/photos/143247548@N03/albums/72177720321905538/) + +On Thursday, the first-ever Backstage Contribfest session took place — hosted by Yi Cai and Paul Schultz from Red Hat, and André Wanlin, Patrik Oldsberg, and Ben Lambert from Spotify. + +Participants who hadn't yet used or contributed to Backstage eagerly joined the project's contributors community and were eager to help. Together with the group, experienced Backstage engineers stepped in to assist attendees — whether troubleshooting environment setup or explaining how specific framework and plugin features are implemented. It was a great example of a community coming together to support learning and contribution. + +The energy in the room, with 60 enthusiastic participants, was absolutely electric! It was amazing to see ideas bouncing around, impromptu collaboration happening at every corner, and a shared passion for advancing the Backstage project. + +Among the great contributions to come out of this event are: + +- [Add Pagination to Tech Docs Table](https://github.com/backstage/backstage/pull/27694) +- [Add Home Page Quick Start Card](https://github.com/backstage/backstage/pull/27705) +- [Truncate commit message to first newline](https://github.com/backstage/community-plugins/pull/2012) + +A heartfelt thank you to everyone who joined us — it’s your talent and collaborative spirit that truly define the Backstage community. This event was a powerful reminder that it’s the people behind the project who make Backstage what it is today 💚. + +And if you missed out on the fun, it's never too late to join the Backstage community. Just follow along with the [Contribfest slide deck](https://static.sched.com/hosted_files/kccncna2024/53/KubeCon-ContribFest-Backstage-NA-2024.pdf) to get started with contributing! + +## Bonus pups!🐕 + +Nothing improves developer experience like hanging out with some fluffy friends. So please enjoy these photos from KubeCon’s “[Pet A Pup](https://www.flickr.com/photos/143247548@N03/albums/72177720321905538/with/54155382123)” station. + +(All 📸 [CNCF](https://www.flickr.com/photos/143247548@N03/albums/72177720321905538/with/54155382123). Please note: the last pup is not a pup.) + +![A labrador retriever pup in the middle of three people calmly getting pets](assets/2024-12-09/kc24slc-cncf-bestpup1.jpg) +The best labrador-retriever pup graciously accepting pets from the cloud native community. + +![A fluffy white pup staring at the camera surrounded by attendees](assets/2024-12-09/kc24slc-cncf-bestpup2.jpg) +The best fluffy white pup surrounded by admirers. + +![A lanky racing pup getting pet on the face](assets/2024-12-09/kc24slc-cncf-bestpup3.jpg) +The best racing-style pup getting face scritches. + +![A yellow pup squinting while getting pets from an attendee in a yellow shirt](assets/2024-12-09/kc24slc-cncf-bestpup4.jpg) +The best yellow pup getting pets from his twinsie. + +![A fluffy cat getting pets.](assets/2024-12-09/kc24slc-cncf-bestpup5.jpg) +See? Not a pup. But did get pets. + +[You, too, can give these pups some love](https://www.therapyanimalsutah.org). + +## Cheerio! We’ll see you in London!💂 + +And that’s a wrap on Salt Lake City! [Join us in London](https://events.linuxfoundation.org/kubecon-cloudnativecon-europe/) in April for more community-building fun at BackstageCon and KubeCon + CloudNativeCon Europe 2025! diff --git a/microsite/blog/assets/2024-12-09/backstagecon-kubecon-2024-salt-lake-city.png b/microsite/blog/assets/2024-12-09/backstagecon-kubecon-2024-salt-lake-city.png new file mode 100644 index 0000000000..518d71fc36 Binary files /dev/null and b/microsite/blog/assets/2024-12-09/backstagecon-kubecon-2024-salt-lake-city.png differ diff --git a/microsite/blog/assets/2024-12-09/kc24slc-cncf-adobe.jpg b/microsite/blog/assets/2024-12-09/kc24slc-cncf-adobe.jpg new file mode 100644 index 0000000000..c428da1c1b Binary files /dev/null and b/microsite/blog/assets/2024-12-09/kc24slc-cncf-adobe.jpg differ diff --git a/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup1.jpg b/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup1.jpg new file mode 100644 index 0000000000..919a16108d Binary files /dev/null and b/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup1.jpg differ diff --git a/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup2.jpg b/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup2.jpg new file mode 100644 index 0000000000..b169eaa52c Binary files /dev/null and b/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup2.jpg differ diff --git a/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup3.jpg b/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup3.jpg new file mode 100644 index 0000000000..a46e320a97 Binary files /dev/null and b/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup3.jpg differ diff --git a/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup4.jpg b/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup4.jpg new file mode 100644 index 0000000000..7fa4a405e0 Binary files /dev/null and b/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup4.jpg differ diff --git a/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup5.jpg b/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup5.jpg new file mode 100644 index 0000000000..8847adb161 Binary files /dev/null and b/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup5.jpg differ diff --git a/microsite/blog/assets/2024-12-09/kc24slc-cncf-entrance.jpg b/microsite/blog/assets/2024-12-09/kc24slc-cncf-entrance.jpg new file mode 100644 index 0000000000..5ec34ddf60 Binary files /dev/null and b/microsite/blog/assets/2024-12-09/kc24slc-cncf-entrance.jpg differ diff --git a/microsite/blog/assets/2024-12-09/kc24slc-cncf-kiosk.jpg b/microsite/blog/assets/2024-12-09/kc24slc-cncf-kiosk.jpg new file mode 100644 index 0000000000..a25c55a6b3 Binary files /dev/null and b/microsite/blog/assets/2024-12-09/kc24slc-cncf-kiosk.jpg differ diff --git a/microsite/blog/assets/2024-12-09/kc24slc-cncf-toyota.jpg b/microsite/blog/assets/2024-12-09/kc24slc-cncf-toyota.jpg new file mode 100644 index 0000000000..2727992735 Binary files /dev/null and b/microsite/blog/assets/2024-12-09/kc24slc-cncf-toyota.jpg differ diff --git a/microsite/blog/assets/2024-12-09/kc24slc-spotify-backstagecon.jpg b/microsite/blog/assets/2024-12-09/kc24slc-spotify-backstagecon.jpg new file mode 100644 index 0000000000..579e12cad9 Binary files /dev/null and b/microsite/blog/assets/2024-12-09/kc24slc-spotify-backstagecon.jpg differ diff --git a/microsite/blog/assets/2024-12-09/kc24slc-spotify-cncf-contribfest.gif b/microsite/blog/assets/2024-12-09/kc24slc-spotify-cncf-contribfest.gif new file mode 100644 index 0000000000..1a89c6586c Binary files /dev/null and b/microsite/blog/assets/2024-12-09/kc24slc-spotify-cncf-contribfest.gif differ diff --git a/microsite/blog/assets/2024-12-09/kc24slc-spotify-maintainers.jpg b/microsite/blog/assets/2024-12-09/kc24slc-spotify-maintainers.jpg new file mode 100644 index 0000000000..8a657886b0 Binary files /dev/null and b/microsite/blog/assets/2024-12-09/kc24slc-spotify-maintainers.jpg differ diff --git a/microsite/data/plugins/npm.yaml b/microsite/data/plugins/npm.yaml new file mode 100644 index 0000000000..67f3de976f --- /dev/null +++ b/microsite/data/plugins/npm.yaml @@ -0,0 +1,9 @@ +--- +title: NPM +author: Christoph Jerolimov +authorUrl: https://github.com/christoph-jerolimov +category: Artifacts +description: A plugin that shows meta info and latest versions from a npm registry. +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/npm/plugins/npm/README.md +npmPackageName: '@backstage-community/plugin-npm' +addedDate: '2024-11-29' diff --git a/microsite/data/plugins/synergy.yaml b/microsite/data/plugins/synergy.yaml new file mode 100644 index 0000000000..6c5e722322 --- /dev/null +++ b/microsite/data/plugins/synergy.yaml @@ -0,0 +1,10 @@ +--- +title: Synergy +author: Jitesh Yadav +authorUrl: https://github.com/jiteshy +category: Collaboration +description: An inner-source dashboard for managing in-house open-source projects, issues, and attracting maintainers to foster collaboration." +documentation: https://github.com/jiteshy/backstage-plugin-synergy/blob/main/README.md +iconUrl: /img/synergy-logo.png +npmPackageName: '@jiteshy/backstage-plugin-synergy' +addedDate: '2024-12-03' diff --git a/microsite/sidebars.js b/microsite/sidebars.js index 2647143065..e48e3b7b52 100644 --- a/microsite/sidebars.js +++ b/microsite/sidebars.js @@ -49,6 +49,97 @@ module.exports = { 'getting-started/keeping-backstage-updated', ], 'Core Features': [ + { + type: 'category', + label: 'Auth and Identity', + items: [ + 'auth/index', + { + type: 'category', + label: 'Included providers', + items: [ + 'auth/auth0/provider', + 'auth/atlassian/provider', + 'auth/aws-alb/provider', + 'auth/microsoft/provider', + 'auth/microsoft/easy-auth', + 'auth/bitbucket/provider', + 'auth/bitbucketServer/provider', + 'auth/cloudflare/provider', + 'auth/github/provider', + 'auth/gitlab/provider', + 'auth/google/provider', + 'auth/google/gcp-iap-auth', + 'auth/guest/provider', + 'auth/okta/provider', + 'auth/oauth2-proxy/provider', + 'auth/onelogin/provider', + 'auth/vmware-cloud/provider', + ], + }, + 'auth/identity-resolver', + 'auth/oauth', + 'auth/oidc', + 'auth/add-auth-provider', + 'auth/service-to-service-auth', + 'auth/autologout', + 'auth/troubleshooting', + ], + }, + { + type: 'category', + label: 'Kubernetes', + items: [ + 'features/kubernetes/overview', + 'features/kubernetes/installation', + 'features/kubernetes/configuration', + 'features/kubernetes/authentication', + 'features/kubernetes/authentication-strategies', + 'features/kubernetes/troubleshooting', + 'features/kubernetes/proxy', + ], + }, + { + type: 'category', + label: 'Notifications', + items: ['notifications/index'], + }, + { + type: 'category', + label: 'Permissions', + items: [ + 'permissions/overview', + 'permissions/concepts', + 'permissions/getting-started', + 'permissions/writing-a-policy', + 'permissions/frontend-integration', + 'permissions/custom-rules', + { + type: 'category', + label: 'Tutorial: using Permissions in your plugin', + items: [ + 'permissions/plugin-authors/01-setup', + 'permissions/plugin-authors/02-adding-a-basic-permission-check', + 'permissions/plugin-authors/03-adding-a-resource-permission-check', + 'permissions/plugin-authors/04-authorizing-access-to-paginated-data', + 'permissions/plugin-authors/05-frontend-authorization', + ], + }, + ], + }, + { + type: 'category', + label: 'Search', + items: [ + 'features/search/search-overview', + 'features/search/getting-started', + 'features/search/concepts', + 'features/search/architecture', + 'features/search/search-engines', + 'features/search/collators', + 'features/search/how-to-guides', + ], + }, { type: 'category', label: 'Software Catalog', @@ -70,19 +161,6 @@ module.exports = { 'features/software-catalog/faq', ], }, - { - type: 'category', - label: 'Kubernetes', - items: [ - 'features/kubernetes/overview', - 'features/kubernetes/installation', - 'features/kubernetes/configuration', - 'features/kubernetes/authentication', - 'features/kubernetes/authentication-strategies', - 'features/kubernetes/troubleshooting', - 'features/kubernetes/proxy', - ], - }, { type: 'category', label: 'Software Templates', @@ -104,19 +182,6 @@ module.exports = { 'features/software-templates/experimental', ], }, - { - type: 'category', - label: 'Backstage Search', - items: [ - 'features/search/search-overview', - 'features/search/getting-started', - 'features/search/concepts', - 'features/search/architecture', - 'features/search/search-engines', - 'features/search/collators', - 'features/search/how-to-guides', - ], - }, { type: 'category', label: 'TechDocs', @@ -285,189 +350,142 @@ module.exports = { 'conf/writing', 'conf/defining', ], - Notifications: ['notifications/index'], - 'Auth and identity': [ - 'auth/index', + Framework: [ { type: 'category', - label: 'Included providers', + label: 'Backend System', items: [ - 'auth/auth0/provider', - 'auth/atlassian/provider', - 'auth/aws-alb/provider', - 'auth/microsoft/provider', - 'auth/microsoft/easy-auth', - 'auth/bitbucket/provider', - 'auth/bitbucketServer/provider', - 'auth/cloudflare/provider', - 'auth/github/provider', - 'auth/gitlab/provider', - 'auth/google/provider', - 'auth/google/gcp-iap-auth', - 'auth/guest/provider', - 'auth/okta/provider', - 'auth/oauth2-proxy/provider', - 'auth/onelogin/provider', - 'auth/vmware-cloud/provider', + 'backend-system/index', + { + type: 'category', + label: 'Architecture', + items: [ + 'backend-system/architecture/index', + 'backend-system/architecture/services', + 'backend-system/architecture/plugins', + 'backend-system/architecture/extension-points', + 'backend-system/architecture/modules', + 'backend-system/architecture/feature-loaders', + 'backend-system/architecture/naming-patterns', + ], + }, + { + type: 'category', + label: 'Building Backends', + items: [ + 'backend-system/building-backends/index', + 'backend-system/building-backends/migrating', + ], + }, + { + type: 'category', + label: 'Building Plugins & Modules', + items: [ + 'backend-system/building-plugins-and-modules/index', + 'backend-system/building-plugins-and-modules/testing', + 'backend-system/building-plugins-and-modules/migrating', + ], + }, + { + type: 'category', + label: 'Core Services', + items: [ + 'backend-system/core-services/index', + 'backend-system/core-services/auth', + 'backend-system/core-services/cache', + 'backend-system/core-services/database', + 'backend-system/core-services/discovery', + 'backend-system/core-services/http-auth', + 'backend-system/core-services/http-router', + 'backend-system/core-services/identity', + 'backend-system/core-services/lifecycle', + 'backend-system/core-services/logger', + 'backend-system/core-services/permissions', + 'backend-system/core-services/plugin-metadata', + 'backend-system/core-services/root-config', + 'backend-system/core-services/root-health', + 'backend-system/core-services/root-http-router', + 'backend-system/core-services/root-lifecycle', + 'backend-system/core-services/root-logger', + 'backend-system/core-services/scheduler', + 'backend-system/core-services/token-manager', + 'backend-system/core-services/url-reader', + 'backend-system/core-services/user-info', + ], + }, ], }, - 'auth/identity-resolver', - 'auth/oauth', - 'auth/oidc', - 'auth/add-auth-provider', - 'auth/service-to-service-auth', - 'auth/autologout', - 'auth/troubleshooting', - ], - Permissions: [ - 'permissions/overview', - 'permissions/concepts', - 'permissions/getting-started', - 'permissions/writing-a-policy', - 'permissions/frontend-integration', - 'permissions/custom-rules', { type: 'category', - label: 'Tutorial: using Permissions in your plugin', + label: 'New Frontend System', items: [ - 'permissions/plugin-authors/01-setup', - 'permissions/plugin-authors/02-adding-a-basic-permission-check', - 'permissions/plugin-authors/03-adding-a-resource-permission-check', - 'permissions/plugin-authors/04-authorizing-access-to-paginated-data', - 'permissions/plugin-authors/05-frontend-authorization', + 'frontend-system/index', + { + type: 'category', + label: 'Architecture', + items: [ + 'frontend-system/architecture/index', + 'frontend-system/architecture/app', + 'frontend-system/architecture/plugins', + 'frontend-system/architecture/extensions', + 'frontend-system/architecture/extension-blueprints', + 'frontend-system/architecture/extension-overrides', + 'frontend-system/architecture/references', + 'frontend-system/architecture/utility-apis', + 'frontend-system/architecture/routes', + 'frontend-system/architecture/naming-patterns', + 'frontend-system/architecture/migrations', + ], + }, + { + type: 'category', + label: 'Building Plugins', + items: [ + 'frontend-system/building-plugins/index', + 'frontend-system/building-plugins/testing', + 'frontend-system/building-plugins/common-extension-blueprints', + 'frontend-system/building-plugins/built-in-data-refs', + 'frontend-system/building-plugins/migrating', + ], + }, + { + type: 'category', + label: 'Building Apps', + items: [ + 'frontend-system/building-apps/index', + 'frontend-system/building-apps/configuring-extensions', + 'frontend-system/building-apps/built-in-extensions', + 'frontend-system/building-apps/plugin-conversion', + 'frontend-system/building-apps/migrating', + ], + }, + { + type: 'category', + label: 'Utility APIs', + items: [ + 'frontend-system/utility-apis/index', + 'frontend-system/utility-apis/creating', + 'frontend-system/utility-apis/consuming', + 'frontend-system/utility-apis/configuring', + ], + }, ], }, - ], - Tooling: [ { - type: 'category', - label: 'Backstage CLI', - items: [ + 'Backstage CLI': [ 'tooling/cli/overview', 'tooling/cli/build-system', 'tooling/cli/commands', - ], - }, - { - type: 'category', - label: 'Local Development', - items: [ - 'tooling/local-dev/linking-local-packages', - 'tooling/local-dev/debugging', - 'tooling/local-dev/profiling', - ], - }, - 'tooling/package-metadata', - ], - 'New Backend System': [ - 'backend-system/index', - { - type: 'category', - label: 'Architecture', - items: [ - 'backend-system/architecture/index', - 'backend-system/architecture/services', - 'backend-system/architecture/plugins', - 'backend-system/architecture/extension-points', - 'backend-system/architecture/modules', - 'backend-system/architecture/feature-loaders', - 'backend-system/architecture/naming-patterns', - ], - }, - { - type: 'category', - label: 'Building Backends', - items: [ - 'backend-system/building-backends/index', - 'backend-system/building-backends/migrating', - ], - }, - { - type: 'category', - label: 'Building Plugins & Modules', - items: [ - 'backend-system/building-plugins-and-modules/index', - 'backend-system/building-plugins-and-modules/testing', - 'backend-system/building-plugins-and-modules/migrating', - ], - }, - { - type: 'category', - label: 'Core Services', - items: [ - 'backend-system/core-services/index', - 'backend-system/core-services/auth', - 'backend-system/core-services/cache', - 'backend-system/core-services/database', - 'backend-system/core-services/discovery', - 'backend-system/core-services/http-auth', - 'backend-system/core-services/http-router', - 'backend-system/core-services/identity', - 'backend-system/core-services/lifecycle', - 'backend-system/core-services/logger', - 'backend-system/core-services/permissions', - 'backend-system/core-services/plugin-metadata', - 'backend-system/core-services/root-config', - 'backend-system/core-services/root-health', - 'backend-system/core-services/root-http-router', - 'backend-system/core-services/root-lifecycle', - 'backend-system/core-services/root-logger', - 'backend-system/core-services/scheduler', - 'backend-system/core-services/token-manager', - 'backend-system/core-services/url-reader', - 'backend-system/core-services/user-info', - ], - }, - ], - 'New Frontend System': [ - 'frontend-system/index', - { - type: 'category', - label: 'Architecture', - items: [ - 'frontend-system/architecture/index', - 'frontend-system/architecture/app', - 'frontend-system/architecture/plugins', - 'frontend-system/architecture/extensions', - 'frontend-system/architecture/extension-blueprints', - 'frontend-system/architecture/extension-overrides', - 'frontend-system/architecture/references', - 'frontend-system/architecture/utility-apis', - 'frontend-system/architecture/routes', - 'frontend-system/architecture/naming-patterns', - 'frontend-system/architecture/migrations', - ], - }, - { - type: 'category', - label: 'Building Plugins', - items: [ - 'frontend-system/building-plugins/index', - 'frontend-system/building-plugins/testing', - 'frontend-system/building-plugins/common-extension-blueprints', - 'frontend-system/building-plugins/built-in-data-refs', - 'frontend-system/building-plugins/migrating', - ], - }, - { - type: 'category', - label: 'Building Apps', - items: [ - 'frontend-system/building-apps/index', - 'frontend-system/building-apps/configuring-extensions', - 'frontend-system/building-apps/built-in-extensions', - 'frontend-system/building-apps/plugin-conversion', - 'frontend-system/building-apps/migrating', - ], - }, - { - type: 'category', - label: 'Utility APIs', - items: [ - 'frontend-system/utility-apis/index', - 'frontend-system/utility-apis/creating', - 'frontend-system/utility-apis/consuming', - 'frontend-system/utility-apis/configuring', + { + type: 'category', + label: 'Local Development', + items: [ + 'tooling/local-dev/linking-local-packages', + 'tooling/local-dev/debugging', + 'tooling/local-dev/profiling', + ], + }, + 'tooling/package-metadata', ], }, ], @@ -477,19 +495,6 @@ module.exports = { 'dls/contributing-to-storybook', 'dls/figma', ], - 'API Reference': [ - { - type: 'category', - label: 'Guides', - items: ['api/utility-apis'], - }, - { - type: 'category', - label: 'API Reference', - items: ['reference/index'], - }, - 'api/deprecations', - ], Tutorials: [ 'tutorials/quickstart-app-plugin', 'tutorials/react-router-stable-migration', @@ -505,22 +510,7 @@ module.exports = { 'tutorials/enable-public-entry', 'tutorials/setup-opentelemetry', ], - 'Architecture Decision Records (ADRs)': [ - 'architecture-decisions/adrs-overview', - 'architecture-decisions/adrs-adr001', - 'architecture-decisions/adrs-adr002', - 'architecture-decisions/adrs-adr003', - 'architecture-decisions/adrs-adr004', - 'architecture-decisions/adrs-adr005', - 'architecture-decisions/adrs-adr006', - 'architecture-decisions/adrs-adr007', - 'architecture-decisions/adrs-adr008', - 'architecture-decisions/adrs-adr009', - 'architecture-decisions/adrs-adr010', - 'architecture-decisions/adrs-adr011', - 'architecture-decisions/adrs-adr012', - 'architecture-decisions/adrs-adr013', - ], + FAQ: ['faq/index', 'faq/product', 'faq/technical'], Accessibility: ['accessibility/index'], Contribute: [ @@ -528,7 +518,32 @@ module.exports = { 'contribute/getting-involved', 'contribute/project-structure', ], - References: ['references/glossary'], + References: [ + { + type: 'category', + label: 'Architecture Decision Records (ADRs)', + items: [ + 'architecture-decisions/adrs-overview', + 'architecture-decisions/adrs-adr001', + 'architecture-decisions/adrs-adr002', + 'architecture-decisions/adrs-adr003', + 'architecture-decisions/adrs-adr004', + 'architecture-decisions/adrs-adr005', + 'architecture-decisions/adrs-adr006', + 'architecture-decisions/adrs-adr007', + 'architecture-decisions/adrs-adr008', + 'architecture-decisions/adrs-adr009', + 'architecture-decisions/adrs-adr010', + 'architecture-decisions/adrs-adr011', + 'architecture-decisions/adrs-adr012', + 'architecture-decisions/adrs-adr013', + ], + }, + 'api/deprecations', + 'references/glossary', + 'api/utility-apis', + 'reference/index', + ], }, releases: { 'Release Notes': releases.map(release => `releases/${release}`), diff --git a/microsite/static/img/synergy-logo.png b/microsite/static/img/synergy-logo.png new file mode 100644 index 0000000000..42eb59c704 Binary files /dev/null and b/microsite/static/img/synergy-logo.png differ diff --git a/package.json b/package.json index 82038342d0..9c4a772ebc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "root", - "version": "1.34.0-next.1", + "version": "1.34.0-next.2", "private": true, "repository": { "type": "git", diff --git a/packages/app-defaults/CHANGELOG.md b/packages/app-defaults/CHANGELOG.md index fae2ed578e..660d8d4ebb 100644 --- a/packages/app-defaults/CHANGELOG.md +++ b/packages/app-defaults/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/app-defaults +## 1.5.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + ## 1.5.15-next.1 ### Patch Changes diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json index 32e11099bb..1a0c1f0d74 100644 --- a/packages/app-defaults/package.json +++ b/packages/app-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/app-defaults", - "version": "1.5.15-next.1", + "version": "1.5.15-next.2", "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 c3ff62c4c9..0ff4bde808 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.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/frontend-plugin-api@0.9.3-next.2 + ## 0.0.18-next.1 ### Patch Changes diff --git a/packages/app-next-example-plugin/package.json b/packages/app-next-example-plugin/package.json index a70e35d2d2..acbe3831c4 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.18-next.1", + "version": "0.0.18-next.2", "description": "Backstage internal example plugin", "backstage": { "role": "frontend-plugin", diff --git a/packages/app-next/CHANGELOG.md b/packages/app-next/CHANGELOG.md index 6c9e385cdc..354ae53a70 100644 --- a/packages/app-next/CHANGELOG.md +++ b/packages/app-next/CHANGELOG.md @@ -1,5 +1,50 @@ # example-app-next +## 0.0.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.26.0-next.2 + - @backstage/plugin-notifications@0.5.0-next.2 + - @backstage/cli@0.29.3-next.2 + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/plugin-scaffolder-react@1.14.2-next.2 + - @backstage/plugin-scaffolder@1.27.2-next.2 + - @backstage/plugin-api-docs@0.12.2-next.2 + - @backstage/plugin-catalog-graph@0.4.14-next.2 + - @backstage/plugin-catalog-import@0.12.8-next.2 + - @backstage/plugin-org@0.6.34-next.2 + - @backstage/plugin-user-settings@0.8.17-next.2 + - @backstage/app-defaults@1.5.15-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-app-api@0.10.3-next.2 + - @backstage/frontend-defaults@0.1.4-next.2 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-app@0.1.4-next.2 + - @backstage/plugin-app-visualizer@0.1.14-next.2 + - @backstage/plugin-auth-react@0.1.10-next.2 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.12-next.2 + - @backstage/plugin-home@0.8.3-next.2 + - @backstage/plugin-kubernetes@0.12.2-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.20-next.2 + - @backstage/plugin-permission-react@0.4.29-next.0 + - @backstage/plugin-search@1.4.21-next.2 + - @backstage/plugin-search-common@1.2.16-next.0 + - @backstage/plugin-search-react@1.8.4-next.2 + - @backstage/plugin-signals@0.0.14-next.2 + - @backstage/plugin-techdocs@1.11.3-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.19-next.2 + - @backstage/plugin-techdocs-react@1.2.12-next.2 + ## 0.0.18-next.1 ### Patch Changes diff --git a/packages/app-next/package.json b/packages/app-next/package.json index 98b633f13f..c39fac7e6a 100644 --- a/packages/app-next/package.json +++ b/packages/app-next/package.json @@ -1,6 +1,6 @@ { "name": "example-app-next", - "version": "0.0.18-next.1", + "version": "0.0.18-next.2", "backstage": { "role": "frontend" }, diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index ae9fb7b63b..fd244dde7e 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,46 @@ # example-app +## 0.2.104-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.26.0-next.2 + - @backstage/plugin-notifications@0.5.0-next.2 + - @backstage/cli@0.29.3-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/plugin-scaffolder-react@1.14.2-next.2 + - @backstage/plugin-scaffolder@1.27.2-next.2 + - @backstage/plugin-api-docs@0.12.2-next.2 + - @backstage/plugin-catalog-graph@0.4.14-next.2 + - @backstage/plugin-catalog-import@0.12.8-next.2 + - @backstage/plugin-org@0.6.34-next.2 + - @backstage/plugin-user-settings@0.8.17-next.2 + - @backstage/app-defaults@1.5.15-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-app-api@0.10.3-next.2 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-auth-react@0.1.10-next.2 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.12-next.2 + - @backstage/plugin-devtools@0.1.22-next.2 + - @backstage/plugin-home@0.8.3-next.2 + - @backstage/plugin-kubernetes@0.12.2-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.20-next.2 + - @backstage/plugin-permission-react@0.4.29-next.0 + - @backstage/plugin-search@1.4.21-next.2 + - @backstage/plugin-search-common@1.2.16-next.0 + - @backstage/plugin-search-react@1.8.4-next.2 + - @backstage/plugin-signals@0.0.14-next.2 + - @backstage/plugin-techdocs@1.11.3-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.19-next.2 + - @backstage/plugin-techdocs-react@1.2.12-next.2 + ## 0.2.104-next.1 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index b73a936a84..67228f4b74 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "example-app", - "version": "0.2.104-next.1", + "version": "0.2.104-next.2", "backstage": { "role": "frontend" }, diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index ccf06b17bd..7e914bdc9b 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -164,7 +164,10 @@ const routes = ( /> } /> - } /> + } + /> } diff --git a/packages/backend-app-api/CHANGELOG.md b/packages/backend-app-api/CHANGELOG.md index 6f17ee737d..f9164f025d 100644 --- a/packages/backend-app-api/CHANGELOG.md +++ b/packages/backend-app-api/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/backend-app-api +## 1.1.0-next.2 + +### Minor Changes + +- ebf083d: Service factories added by feature loaders now have lower priority and will be ignored if a factory for the same service is added directly by `backend.add(serviceFactory)`. + +### Patch Changes + +- 0e9c9fa: As soon as a backend termination signal is received, call before shutting down root lifecycle hooks. +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + ## 1.1.0-next.1 ### Minor Changes diff --git a/packages/backend-app-api/package.json b/packages/backend-app-api/package.json index 60005fed34..bced08abd2 100644 --- a/packages/backend-app-api/package.json +++ b/packages/backend-app-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-app-api", - "version": "1.1.0-next.1", + "version": "1.1.0-next.2", "description": "Core API used by Backstage backend apps", "backstage": { "role": "node-library" diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.test.ts b/packages/backend-app-api/src/wiring/BackendInitializer.test.ts index f6d65e883e..86b0b51bd9 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.test.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.test.ts @@ -25,6 +25,7 @@ import { createBackendModule, createExtensionPoint, createBackendFeatureLoader, + ServiceRef, } from '@backstage/backend-plugin-api'; import { BackendInitializer } from './BackendInitializer'; import { instanceMetadataServiceRef } from '@backstage/backend-plugin-api/alpha'; @@ -50,6 +51,18 @@ const baseFactories = [ loggerServiceFactory, ]; +function mkNoopFactory(ref: ServiceRef<{}, 'plugin'>) { + const fn = jest.fn().mockReturnValue({}); + return Object.assign( + fn, + createServiceFactory({ + service: ref, + deps: {}, + factory: fn, + }), + ); +} + const testPlugin = createBackendPlugin({ pluginId: 'test', register(reg) { @@ -167,6 +180,151 @@ describe('BackendInitializer', () => { expect(moduleInit).toHaveBeenCalled(); }); + it('should ignore services provided by feature loaders that have already been explicitly added', async () => { + const ref = createServiceRef<{}>({ id: '1' }); + const factory1 = mkNoopFactory(ref); + const factory2 = mkNoopFactory(ref); + const factory3 = mkNoopFactory(ref); + + const init = new BackendInitializer([...baseFactories, factory1]); + init.add(factory2); + init.add( + createBackendFeatureLoader({ + deps: {}, + *loader() { + yield factory3; + }, + }), + ); + init.add( + createBackendPlugin({ + pluginId: 'tester', + register(reg) { + reg.registerInit({ + deps: { ref }, + async init() {}, + }); + }, + }), + ); + + await init.start(); + + expect(factory1).not.toHaveBeenCalled(); + expect(factory2).toHaveBeenCalled(); + expect(factory3).not.toHaveBeenCalled(); + }); + + it('should include all multiton service factories', async () => { + expect.assertions(5); + + const ref = createServiceRef({ id: '1', multiton: true }); + const factory1 = mkNoopFactory(ref).mockResolvedValue(1); + const factory2 = mkNoopFactory(ref).mockResolvedValue(2); + const factory3 = mkNoopFactory(ref).mockResolvedValue(3); + const factory4 = mkNoopFactory(ref).mockResolvedValue(4); + + const init = new BackendInitializer([...baseFactories, factory1]); + init.add(factory2); + init.add( + createBackendFeatureLoader({ + deps: {}, + *loader() { + yield factory3; + yield factory4; + }, + }), + ); + init.add( + createBackendPlugin({ + pluginId: 'tester', + register(reg) { + reg.registerInit({ + deps: { ns: ref }, + async init({ ns }) { + expect(ns).toEqual([1, 2, 3, 4]); + }, + }); + }, + }), + ); + + await init.start(); + + expect(factory1).toHaveBeenCalled(); + expect(factory2).toHaveBeenCalled(); + expect(factory3).toHaveBeenCalled(); + expect(factory4).toHaveBeenCalled(); + }); + + // Note: this is an important escape hatch in case to loaders conflict and you need to select the winning service factory + it('should allow duplicate service from feature loaders if overridden', async () => { + const ref = createServiceRef<{}>({ id: '1' }); + const factory1 = mkNoopFactory(ref); + const factory2 = mkNoopFactory(ref); + const factory3 = mkNoopFactory(ref); + const factory4 = mkNoopFactory(ref); + + const init = new BackendInitializer([...baseFactories, factory1]); + init.add(factory2); + init.add( + createBackendFeatureLoader({ + deps: {}, + *loader() { + yield factory3; + yield factory4; + }, + }), + ); + init.add( + createBackendPlugin({ + pluginId: 'tester', + register(reg) { + reg.registerInit({ + deps: { ref }, + async init() {}, + }); + }, + }), + ); + + await init.start(); + + expect(factory1).not.toHaveBeenCalled(); + expect(factory2).toHaveBeenCalled(); + expect(factory3).not.toHaveBeenCalled(); + expect(factory4).not.toHaveBeenCalled(); + }); + + it('should reject duplicate service factories from feature loader without an explicit override', async () => { + const ref = createServiceRef<{}>({ id: '1' }); + const factory1 = mkNoopFactory(ref); + const factory2 = mkNoopFactory(ref); + const factory3 = mkNoopFactory(ref); + + const init = new BackendInitializer([...baseFactories, factory1]); + init.add( + createBackendFeatureLoader({ + deps: {}, + *loader() { + yield factory2; + }, + }), + ); + init.add( + createBackendFeatureLoader({ + deps: {}, + *loader() { + yield factory3; + }, + }), + ); + + await expect(init.start()).rejects.toThrow( + 'Duplicate service implementations provided for 1 by both feature loader created at', + ); + }); + it('should refuse to override already initialized services through loaded features', async () => { const ref1 = createServiceRef<{ x: number }>({ id: '1', diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.ts b/packages/backend-app-api/src/wiring/BackendInitializer.ts index 3e7b46fc9e..b8c37f7471 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.ts @@ -449,6 +449,11 @@ export class BackendInitializer { // The startup failed, but we may still want to do cleanup so we continue silently } + const rootLifecycleService = await this.#getRootLifecycleImpl(); + + // Root services like the health one need to immediatelly be notified of the shutdown + await rootLifecycleService.beforeShutdown(); + // Get all plugins. const allPlugins = new Set(); for (const feature of this.#registrations) { @@ -468,14 +473,14 @@ export class BackendInitializer { ); // Once all plugin shutdown hooks are done, run root shutdown hooks. - const lifecycleService = await this.#getRootLifecycleImpl(); - await lifecycleService.shutdown(); + await rootLifecycleService.shutdown(); } // Bit of a hacky way to grab the lifecycle services, potentially find a nicer way to do this async #getRootLifecycleImpl(): Promise< RootLifecycleService & { startup(): Promise; + beforeShutdown(): Promise; shutdown(): Promise; } > { @@ -519,6 +524,11 @@ export class BackendInitializer { } async #applyBackendFeatureLoaders(loaders: InternalBackendFeatureLoader[]) { + const servicesAddedByLoaders = new Map< + string, + InternalBackendFeatureLoader + >(); + for (const loader of loaders) { const deps = new Map(); const missingRefs = new Set(); @@ -564,8 +574,32 @@ export class BackendInitializer { if (isBackendFeatureLoader(feature)) { newLoaders.push(feature); } else { - didAddServiceFactory ||= isServiceFactory(feature); - this.#addFeature(feature); + // This block makes sure that feature loaders do not provide duplicate + // implementations for the same service, but at the same time allows + // service factories provided by feature loaders to be overridden by + // ones that are explicitly installed with backend.add(serviceFactory). + // + // If a factory has already been explicitly installed, the service + // factory provided by the loader will simply be ignored. + if (isServiceFactory(feature) && !feature.service.multiton) { + const conflictingLoader = servicesAddedByLoaders.get( + feature.service.id, + ); + if (conflictingLoader) { + throw new Error( + `Duplicate service implementations provided for ${feature.service.id} by both feature loader ${loader.description} and feature loader ${conflictingLoader.description}`, + ); + } + + // Check that this service wasn't already explicitly added by backend.add(serviceFactory) + if (!this.#serviceRegistry.hasBeenAdded(feature.service)) { + didAddServiceFactory = true; + servicesAddedByLoaders.set(feature.service.id, loader); + this.#addFeature(feature); + } + } else { + this.#addFeature(feature); + } } } diff --git a/packages/backend-app-api/src/wiring/ServiceRegistry.ts b/packages/backend-app-api/src/wiring/ServiceRegistry.ts index 0abd5605ae..90b108206e 100644 --- a/packages/backend-app-api/src/wiring/ServiceRegistry.ts +++ b/packages/backend-app-api/src/wiring/ServiceRegistry.ts @@ -191,6 +191,13 @@ export class ServiceRegistry { } } + hasBeenAdded(ref: ServiceRef) { + if (ref.id === coreServices.pluginMetadata.id) { + return true; + } + return this.#addedFactoryIds.has(ref.id); + } + add(factory: ServiceFactory) { const factoryId = factory.service.id; if (factoryId === coreServices.pluginMetadata.id) { diff --git a/packages/backend-app-api/src/wiring/createSpecializedBackend.test.ts b/packages/backend-app-api/src/wiring/createSpecializedBackend.test.ts index 1fd7fcbbec..32c1fbcd0e 100644 --- a/packages/backend-app-api/src/wiring/createSpecializedBackend.test.ts +++ b/packages/backend-app-api/src/wiring/createSpecializedBackend.test.ts @@ -36,6 +36,7 @@ describe('createSpecializedBackend', () => { deps: {}, factory: async () => ({ addStartupHook: () => {}, + addBeforeShutdownHook: () => {}, addShutdownHook: () => {}, }), }), @@ -44,6 +45,7 @@ describe('createSpecializedBackend', () => { deps: {}, factory: async () => ({ addStartupHook: () => {}, + addBeforeShutdownHook: () => {}, addShutdownHook: () => {}, }), }), diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md index 693ece9cd0..4d3cb90097 100644 --- a/packages/backend-defaults/CHANGELOG.md +++ b/packages/backend-defaults/CHANGELOG.md @@ -1,5 +1,39 @@ # @backstage/backend-defaults +## 0.6.0-next.2 + +### Minor Changes + +- fd5d337: Added a new `backend.health.headers` configuration that can be used to set additional headers to include in health check responses. + + **BREAKING CONSUMERS**: As part of this change the `createHealthRouter` function exported from `@backstage/backend-defaults/rootHttpRouter` now requires the root config service to be passed through the `config` option. + +- 3f34ea9: Throttles Bitbucket Server API calls + +### Patch Changes + +- dfc8b41: Updated dependency `@opentelemetry/api` to `^1.9.0`. +- 57e0b11: The user and plugin token verification in the default `AuthService` implementation will no longer forward verification errors to the caller, and instead log them as warnings. +- 57e0b11: The default `authServiceFactory` now correctly depends on the plugin scoped `Logger` services rather than the root scoped one. +- 0e9c9fa: Implements the `DefaultRootLifecycleService.addBeforeShutdownHook` method, and updates `DefaultRootHttpRouterService` and `DefaultRootHealthService` to listen to that event to stop accepting traffic and close service connections. +- d0cbd82: Remove use of the `stoppable` library on the `DefaultRootHttpRouterService` as Node's native http server [close](https://nodejs.org/api/http.html#serverclosecallback) method already drains requests. + Also, we pass a new `lifecycleMiddleware` to the `rootHttpRouterServiceFactory` configure function that must be called manually if you don't call `applyDefaults`. +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/backend-app-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/cli-node@0.2.11-next.1 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/backend-dev-utils@0.1.5 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-aws-node@0.1.14-next.0 + - @backstage/types@1.2.0 + ## 0.6.0-next.1 ### Patch Changes diff --git a/packages/backend-defaults/config.d.ts b/packages/backend-defaults/config.d.ts index 0f7f9906f8..e2a748f85d 100644 --- a/packages/backend-defaults/config.d.ts +++ b/packages/backend-defaults/config.d.ts @@ -28,6 +28,29 @@ export interface Config { */ baseUrl: string; + lifecycle?: { + /** + * The maximum time that paused requests will wait for the service to start, before returning an error. + * Defaults to 5 seconds + * Supported formats: + * - A string in the format of '1d', '2 seconds' etc. as supported by the `ms` + * library. + * - A standard ISO formatted duration string, e.g. 'P2DT6H' or 'PT1M'. + * - An object with individual units (in plural) as keys, e.g. `{ days: 2, hours: 6 }`. + */ + startupRequestPauseTimeout?: string | HumanDuration; + /** + * The minimum time that the HTTP server will delay the shutdown of the backend. During this delay health checks will be set to failing, allowing traffic to drain. + * Defaults to 0 seconds. + * Supported formats: + * - A string in the format of '1d', '2 seconds' etc. as supported by the `ms` + * library. + * - A standard ISO formatted duration string, e.g. 'P2DT6H' or 'PT1M'. + * - An object with individual units (in plural) as keys, e.g. `{ days: 2, hours: 6 }`. + */ + serverShutdownDelay?: string | HumanDuration; + }; + /** Address that the backend should listen to. */ listen?: | string diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index d8240c429c..c384833c55 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-defaults", - "version": "0.6.0-next.1", + "version": "0.6.0-next.2", "description": "Backend defaults used by Backstage backend apps", "backstage": { "role": "node-library" @@ -169,13 +169,13 @@ "node-fetch": "^2.7.0", "node-forge": "^1.3.1", "p-limit": "^3.1.0", + "p-throttle": "^4.1.1", "path-to-regexp": "^8.0.0", "pg": "^8.11.3", "pg-connection-string": "^2.3.0", "pg-format": "^1.0.4", "raw-body": "^2.4.1", "selfsigned": "^2.0.0", - "stoppable": "^1.1.0", "tar": "^6.1.12", "triple-beam": "^1.4.1", "uuid": "^11.0.0", diff --git a/packages/backend-defaults/report-httpRouter.api.md b/packages/backend-defaults/report-httpRouter.api.md index 4f6c6f06dc..55c3f0b208 100644 --- a/packages/backend-defaults/report-httpRouter.api.md +++ b/packages/backend-defaults/report-httpRouter.api.md @@ -10,7 +10,6 @@ import express from 'express'; import { HttpAuthService } from '@backstage/backend-plugin-api'; import { HttpRouterService } from '@backstage/backend-plugin-api'; import { HttpRouterServiceAuthPolicy } from '@backstage/backend-plugin-api'; -import { HumanDuration } from '@backstage/types'; import { LifecycleService } from '@backstage/backend-plugin-api'; import { RequestHandler } from 'express'; import { RootConfigService } from '@backstage/backend-plugin-api'; @@ -51,9 +50,10 @@ export const httpRouterServiceFactory: ServiceFactory< // @public export interface LifecycleMiddlewareOptions { + // (undocumented) + config: RootConfigService; // (undocumented) lifecycle: LifecycleService; - startupRequestPauseTimeout?: HumanDuration; } // (No @packageDocumentation comment for this package) diff --git a/packages/backend-defaults/src/CreateBackend.test.ts b/packages/backend-defaults/src/CreateBackend.test.ts index 55fdbe5a6a..57977e9647 100644 --- a/packages/backend-defaults/src/CreateBackend.test.ts +++ b/packages/backend-defaults/src/CreateBackend.test.ts @@ -47,6 +47,7 @@ describe('createBackend', () => { deps: {}, factory: async () => ({ addStartupHook: () => {}, + addBeforeShutdownHook: () => {}, addShutdownHook: () => {}, }), }), @@ -57,6 +58,7 @@ describe('createBackend', () => { deps: {}, factory: async () => ({ addStartupHook: () => {}, + addBeforeShutdownHook: () => {}, addShutdownHook: () => {}, }), }), diff --git a/packages/backend-defaults/src/entrypoints/httpRouter/createLifecycleMiddleware.test.ts b/packages/backend-defaults/src/entrypoints/httpRouter/createLifecycleMiddleware.test.ts new file mode 100644 index 0000000000..31eecf14bb --- /dev/null +++ b/packages/backend-defaults/src/entrypoints/httpRouter/createLifecycleMiddleware.test.ts @@ -0,0 +1,81 @@ +/* + * 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 { createLifecycleMiddleware } from './createLifecycleMiddleware'; +import { BackendLifecycleImpl } from '../rootLifecycle/rootLifecycleServiceFactory'; +import { mockServices } from '@backstage/backend-test-utils'; +import { ServiceUnavailableError } from '@backstage/errors'; + +describe('createLifecycleMiddleware', () => { + it('should pause requests when plugin is not ready', async () => { + const lifecycle = new BackendLifecycleImpl(mockServices.rootLogger()); + + const middleware = createLifecycleMiddleware({ lifecycle }); + + const next = jest.fn(); + middleware({} as any, {} as any, next); + expect(next).not.toHaveBeenCalled(); + await lifecycle.startup(); + + // pending call + expect(next).toHaveBeenCalledWith(); + + // new call + const next2 = jest.fn(); + middleware({} as any, {} as any, next2); + expect(next2).toHaveBeenCalledWith(); + }); + + it('should throw ServiceUnavailableError after shutdown', async () => { + const lifecycle = new BackendLifecycleImpl(mockServices.rootLogger()); + const middleware = createLifecycleMiddleware({ lifecycle }); + + const next = jest.fn(); + middleware({} as any, {} as any, next); + expect(next).not.toHaveBeenCalled(); + await lifecycle.shutdown(); + + // pending call + expect(next).toHaveBeenCalledWith( + new ServiceUnavailableError('Service is shutting down'), + ); + + // new call + const next2 = jest.fn(); + middleware({} as any, {} as any, next2); + expect(next2).toHaveBeenCalledWith( + new ServiceUnavailableError('Service is shutting down'), + ); + }); + + it('should throw ServiceUnavailableError after timeout', async () => { + const lifecycle = new BackendLifecycleImpl(mockServices.rootLogger()); + const middleware = createLifecycleMiddleware({ + lifecycle, + startupRequestPauseTimeout: { milliseconds: 1 }, + }); + + const next = jest.fn(); + middleware({} as any, {} as any, next); + expect(next).not.toHaveBeenCalled(); + + await new Promise(r => setTimeout(r, 2)); + + expect(next).toHaveBeenCalledWith( + new ServiceUnavailableError('Service has not started up yet'), + ); + }); +}); diff --git a/packages/backend-defaults/src/entrypoints/httpRouter/createLifecycleMiddleware.ts b/packages/backend-defaults/src/entrypoints/httpRouter/createLifecycleMiddleware.ts new file mode 100644 index 0000000000..99fb82a41e --- /dev/null +++ b/packages/backend-defaults/src/entrypoints/httpRouter/createLifecycleMiddleware.ts @@ -0,0 +1,108 @@ +/* + * 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 { RootLifecycleService } from '@backstage/backend-plugin-api'; +import { ServiceUnavailableError } from '@backstage/errors'; +import { HumanDuration, durationToMilliseconds } from '@backstage/types'; +import { RequestHandler } from 'express'; + +export const DEFAULT_STARTUP_REQUEST_PAUSE_TIMEOUT = { seconds: 5 }; +export const DEFAULT_SERVER_SHUTDOWN_TIMEOUT = { seconds: 0 }; + +/** + * Options for {@link createLifecycleMiddleware}. + * @public + */ +export interface LifecycleMiddlewareOptions { + lifecycle: RootLifecycleService; + /** + * The maximum time that paused requests will wait for the service to start, before returning an error. + * + * Defaults to 5 seconds. + */ + startupRequestPauseTimeout?: HumanDuration; +} + +/** + * Creates a middleware that pauses requests until the service has started. + * + * @remarks + * + * Requests that arrive before the service has started will be paused until startup is complete. + * If the service does not start within the provided timeout, the request will be rejected with a + * {@link @backstage/errors#ServiceUnavailableError}. + * + * If the service is shutting down, all requests will be rejected with a + * {@link @backstage/errors#ServiceUnavailableError}. + * + * @public + */ +export function createLifecycleMiddleware( + options: LifecycleMiddlewareOptions, +): RequestHandler { + const { lifecycle, startupRequestPauseTimeout } = options; + + let state: 'init' | 'up' | 'down' = 'init'; + const waiting = new Set<{ + next: (err?: Error) => void; + timeout: NodeJS.Timeout; + }>(); + + lifecycle.addStartupHook(async () => { + if (state === 'init') { + state = 'up'; + for (const item of waiting) { + clearTimeout(item.timeout); + item.next(); + } + waiting.clear(); + } + }); + + lifecycle.addShutdownHook(async () => { + state = 'down'; + for (const item of waiting) { + clearTimeout(item.timeout); + item.next(new ServiceUnavailableError('Service is shutting down')); + } + waiting.clear(); + }); + + return (_req, _res, next) => { + if (state === 'up') { + next(); + return; + } else if (state === 'down') { + next(new ServiceUnavailableError('Service is shutting down')); + return; + } + + const timeoutMs = durationToMilliseconds( + startupRequestPauseTimeout ?? DEFAULT_STARTUP_REQUEST_PAUSE_TIMEOUT, + ); + + const item = { + next, + timeout: setTimeout(() => { + if (waiting.delete(item)) { + next(new ServiceUnavailableError('Service has not started up yet')); + } + }, timeoutMs), + }; + + waiting.add(item); + }; +} diff --git a/packages/backend-defaults/src/entrypoints/httpRouter/http/createLifecycleMiddleware.test.ts b/packages/backend-defaults/src/entrypoints/httpRouter/http/createLifecycleMiddleware.test.ts index 3b85c8cb92..36ca2da61b 100644 --- a/packages/backend-defaults/src/entrypoints/httpRouter/http/createLifecycleMiddleware.test.ts +++ b/packages/backend-defaults/src/entrypoints/httpRouter/http/createLifecycleMiddleware.test.ts @@ -20,10 +20,14 @@ import { mockServices } from '@backstage/backend-test-utils'; import { ServiceUnavailableError } from '@backstage/errors'; describe('createLifecycleMiddleware', () => { + const config = mockServices.rootConfig.mock(); it('should pause requests when plugin is not ready', async () => { const lifecycle = new BackendLifecycleImpl(mockServices.rootLogger()); - const middleware = createLifecycleMiddleware({ lifecycle }); + const middleware = createLifecycleMiddleware({ + config, + lifecycle, + }); const next = jest.fn(); middleware({} as any, {} as any, next); @@ -41,7 +45,7 @@ describe('createLifecycleMiddleware', () => { it('should throw ServiceUnavailableError after shutdown', async () => { const lifecycle = new BackendLifecycleImpl(mockServices.rootLogger()); - const middleware = createLifecycleMiddleware({ lifecycle }); + const middleware = createLifecycleMiddleware({ config, lifecycle }); const next = jest.fn(); middleware({} as any, {} as any, next); @@ -65,7 +69,15 @@ describe('createLifecycleMiddleware', () => { const lifecycle = new BackendLifecycleImpl(mockServices.rootLogger()); const middleware = createLifecycleMiddleware({ lifecycle, - startupRequestPauseTimeout: { milliseconds: 1 }, + config: mockServices.rootConfig({ + data: { + backend: { + lifecycle: { + startupRequestPauseTimeout: { milliseconds: 1 }, + }, + }, + }, + }), }); const next = jest.fn(); diff --git a/packages/backend-defaults/src/entrypoints/httpRouter/http/createLifecycleMiddleware.ts b/packages/backend-defaults/src/entrypoints/httpRouter/http/createLifecycleMiddleware.ts index 3f8ee3ea69..366d19f8bf 100644 --- a/packages/backend-defaults/src/entrypoints/httpRouter/http/createLifecycleMiddleware.ts +++ b/packages/backend-defaults/src/entrypoints/httpRouter/http/createLifecycleMiddleware.ts @@ -14,7 +14,11 @@ * limitations under the License. */ -import { LifecycleService } from '@backstage/backend-plugin-api'; +import { + RootConfigService, + LifecycleService, +} from '@backstage/backend-plugin-api'; +import { readDurationFromConfig } from '@backstage/config'; import { ServiceUnavailableError } from '@backstage/errors'; import { HumanDuration, durationToMilliseconds } from '@backstage/types'; import { RequestHandler } from 'express'; @@ -26,13 +30,8 @@ export const DEFAULT_TIMEOUT = { seconds: 5 }; * @public */ export interface LifecycleMiddlewareOptions { + config: RootConfigService; lifecycle: LifecycleService; - /** - * The maximum time that paused requests will wait for the service to start, before returning an error. - * - * Defaults to 5 seconds. - */ - startupRequestPauseTimeout?: HumanDuration; } /** @@ -52,7 +51,7 @@ export interface LifecycleMiddlewareOptions { export function createLifecycleMiddleware( options: LifecycleMiddlewareOptions, ): RequestHandler { - const { lifecycle, startupRequestPauseTimeout = DEFAULT_TIMEOUT } = options; + const { config, lifecycle } = options; let state: 'init' | 'up' | 'down' = 'init'; const waiting = new Set<{ @@ -81,6 +80,14 @@ export function createLifecycleMiddleware( waiting.clear(); }); + let startupRequestPauseTimeout: HumanDuration = DEFAULT_TIMEOUT; + + if (config.has('backend.lifecycle.startupRequestPauseTimeout')) { + startupRequestPauseTimeout = readDurationFromConfig(config, { + key: 'backend.lifecycle.startupRequestPauseTimeout', + }); + } + const timeoutMs = durationToMilliseconds(startupRequestPauseTimeout); return (_req, _res, next) => { diff --git a/packages/backend-defaults/src/entrypoints/httpRouter/httpRouterServiceFactory.ts b/packages/backend-defaults/src/entrypoints/httpRouter/httpRouterServiceFactory.ts index 0557cb636d..6f8792aa3d 100644 --- a/packages/backend-defaults/src/entrypoints/httpRouter/httpRouterServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/httpRouter/httpRouterServiceFactory.ts @@ -59,7 +59,7 @@ export const httpRouterServiceFactory = createServiceFactory({ }); router.use(createAuthIntegrationRouter({ auth })); - router.use(createLifecycleMiddleware({ lifecycle })); + router.use(createLifecycleMiddleware({ config, lifecycle })); router.use(credentialsBarrier.middleware); router.use(createCookieAuthRefreshMiddleware({ auth, httpAuth })); diff --git a/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.test.ts b/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.test.ts index 0eee5c18c6..ca9085273c 100644 --- a/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.test.ts +++ b/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.test.ts @@ -53,11 +53,11 @@ describe('DefaultRootHealthService', () => { it(`should return a 500 response if the server has stopped`, async () => { let mockServerStartedFn = () => {}; - let mockServerStoppedFn = () => {}; + let mockServerBeforeStoppedFn = () => {}; const lifecycle = mockServices.rootLifecycle.mock({ addStartupHook: jest.fn(fn => (mockServerStartedFn = fn)), - addShutdownHook: jest.fn(fn => (mockServerStoppedFn = fn)), + addBeforeShutdownHook: jest.fn(fn => (mockServerBeforeStoppedFn = fn)), }); const service = new DefaultRootHealthService({ @@ -65,11 +65,11 @@ describe('DefaultRootHealthService', () => { }); mockServerStartedFn(); - mockServerStoppedFn(); + mockServerBeforeStoppedFn(); await expect(service.getReadiness()).resolves.toEqual({ status: 503, payload: { - message: 'Backend has not started yet', + message: 'Backend is shuttting down', status: 'error', }, }); diff --git a/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.ts b/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.ts index c8b4ad5394..b201079b4f 100644 --- a/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.ts @@ -23,14 +23,14 @@ import { /** @internal */ export class DefaultRootHealthService implements RootHealthService { - #isRunning = false; + #state: 'init' | 'up' | 'down' = 'init'; constructor(readonly options: { lifecycle: RootLifecycleService }) { options.lifecycle.addStartupHook(() => { - this.#isRunning = true; + this.#state = 'up'; }); - options.lifecycle.addShutdownHook(() => { - this.#isRunning = false; + options.lifecycle.addBeforeShutdownHook(() => { + this.#state = 'down'; }); } @@ -39,12 +39,18 @@ export class DefaultRootHealthService implements RootHealthService { } async getReadiness(): Promise<{ status: number; payload?: any }> { - if (!this.#isRunning) { + if (this.#state === 'init') { return { status: 503, payload: { message: 'Backend has not started yet', status: 'error' }, }; } + if (this.#state === 'down') { + return { + status: 503, + payload: { message: 'Backend is shuttting down', status: 'error' }, + }; + } return { status: 200, payload: { status: 'ok' } }; } diff --git a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/createHttpServer.ts b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/createHttpServer.ts index 5c526ba1e2..9449291628 100644 --- a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/createHttpServer.ts +++ b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/createHttpServer.ts @@ -16,7 +16,6 @@ import * as http from 'http'; import * as https from 'https'; -import stoppableServer from 'stoppable'; import { RequestListener } from 'http'; import { LoggerService } from '@backstage/backend-plugin-api'; import { HttpServerOptions, ExtendedHttpServer } from './types'; @@ -33,13 +32,6 @@ export async function createHttpServer( deps: { logger: LoggerService }, ): Promise { const server = await createServer(listener, options, deps); - - const stopper = stoppableServer(server, 0); - // The stopper here is actually the server itself, so if we try - // to call stopper.stop() down in the stop implementation, we'll - // be calling ourselves. - const stopServer = stopper.stop.bind(stopper); - return Object.assign(server, { start() { return new Promise((resolve, reject) => { @@ -61,7 +53,7 @@ export async function createHttpServer( stop() { return new Promise((resolve, reject) => { - stopServer((error?: Error) => { + server.close(error => { if (error) { reject(error); } else { diff --git a/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.test.ts b/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.test.ts index f058c87900..0f2b6463e4 100644 --- a/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.test.ts +++ b/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.test.ts @@ -21,7 +21,12 @@ import { import { Express } from 'express'; import request from 'supertest'; import { rootHttpRouterServiceFactory } from './rootHttpRouterServiceFactory'; -import { ServiceFactory, coreServices } from '@backstage/backend-plugin-api'; +import { + ServiceFactory, + coreServices, + createServiceFactory, +} from '@backstage/backend-plugin-api'; +import { BackendLifecycleImpl } from '../rootLifecycle/rootLifecycleServiceFactory'; async function createExpressApp(...dependencies: ServiceFactory[]) { let app: Express | undefined = undefined; @@ -198,4 +203,124 @@ describe('rootHttpRouterServiceFactory', () => { 'Invalid header value in at backend.health.headers, must be a non-empty string', ); }); + + it('should wait the server to shutdown', async () => { + jest.useFakeTimers(); + + const serverStopMock = jest.fn(); + + let app: Express | undefined = undefined; + const lifecycleMock = new BackendLifecycleImpl(mockServices.rootLogger()); + + const tester = ServiceFactoryTester.from( + rootHttpRouterServiceFactory({ + configure(options) { + options.app.use(options.healthRouter); + options.app.get('/test', (_req, res) => { + res.status(200).send({ status: 'ok' }).end(); + }); + options.app.use(options.middleware.error()); + app = options.app; + options.server.addListener('close', serverStopMock); + }, + }), + { + dependencies: [ + mockServices.rootConfig.factory({ + data: { + app: { baseUrl: 'http://localhost' }, + backend: { + baseUrl: 'http://localhost', + listen: { host: '', port: 0 }, + lifecycle: { + serverShutdownDelay: '30s', + }, + }, + }, + }), + createServiceFactory({ + service: coreServices.rootLifecycle, + deps: {}, + factory() { + return lifecycleMock; + }, + }), + ], + }, + ); + + await tester.getSubject(); + + // Trigger creation of the http service, accessing the app instance through the configure callback + const lifecycle = await tester.getService(coreServices.rootLifecycle); + + await (lifecycle as any).startup(); // Trigger startup by calling the private startup method + + await request(app!).get('/test').expect(200, { + status: 'ok', + }); + + await request(app) + .get('/.backstage/health/v1/liveness') + .expect(200, { status: 'ok' }); + + await request(app).get('/.backstage/health/v1/readiness').expect(200, { + status: 'ok', + }); + + const beforeShutdownPromise = (lifecycle as any) + .beforeShutdown() + .then(() => { + return (lifecycle as any).shutdown(); + }); + + // Continue accepting requests + await request(app!).get('/test').expect(200, { + status: 'ok', + }); + + await request(app) + .get('/.backstage/health/v1/liveness') + .expect(200, { status: 'ok' }); + + // Immediately start failing the readiness health check + await request(app).get('/.backstage/health/v1/readiness').expect(503, { + message: 'Backend is shuttting down', + status: 'error', + }); + + jest.advanceTimersByTime(29999); + + // Still accepting requests 1 ms before shutdown + await request(app!).get('/test').expect(200, { + status: 'ok', + }); + + await request(app) + .get('/.backstage/health/v1/liveness') + .expect(200, { status: 'ok' }); + + await request(app).get('/.backstage/health/v1/readiness').expect(503, { + message: 'Backend is shuttting down', + status: 'error', + }); + + jest.advanceTimersByTime(1); + + await request(app) + .get('/.backstage/health/v1/liveness') + .expect(200, { status: 'ok' }); + + await request(app).get('/.backstage/health/v1/readiness').expect(503, { + message: 'Backend is shuttting down', + status: 'error', + }); + + return expect( + beforeShutdownPromise.then(() => { + expect(serverStopMock).toHaveBeenCalled(); + jest.useRealTimers(); + }), + ).resolves.toBeUndefined(); + }); }); diff --git a/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.ts b/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.ts index 4e3483d67e..e5c64124fd 100644 --- a/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.ts @@ -30,6 +30,8 @@ import { } from './http'; import { DefaultRootHttpRouter } from './DefaultRootHttpRouter'; import { createHealthRouter } from './createHealthRouter'; +import { durationToMilliseconds } from '@backstage/types'; +import { readDurationFromConfig } from '@backstage/config'; /** * @public @@ -90,6 +92,7 @@ const rootHttpRouterServiceFactoryWithOptions = ( const routes = router.handler(); const healthRouter = createHealthRouter({ config, health }); + const server = await createHttpServer( app, readHttpServerOptions(config.getOptionalConfig('backend')), @@ -120,6 +123,18 @@ const rootHttpRouterServiceFactoryWithOptions = ( }, }); + if (config.has('backend.lifecycle.serverShutdownDelay')) { + const serverShutdownDelay = readDurationFromConfig(config, { + key: 'backend.lifecycle.serverShutdownDelay', + }); + lifecycle.addBeforeShutdownHook(async () => { + const timeoutMs = durationToMilliseconds(serverShutdownDelay); + return await new Promise(resolve => { + setTimeout(resolve, timeoutMs); + }); + }); + } + lifecycle.addShutdownHook(() => server.stop()); await server.start(); diff --git a/packages/backend-defaults/src/entrypoints/rootLifecycle/rootLifecycleServiceFactory.ts b/packages/backend-defaults/src/entrypoints/rootLifecycle/rootLifecycleServiceFactory.ts index e724c2f5cb..abba4beece 100644 --- a/packages/backend-defaults/src/entrypoints/rootLifecycle/rootLifecycleServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/rootLifecycle/rootLifecycleServiceFactory.ts @@ -65,6 +65,39 @@ export class BackendLifecycleImpl implements RootLifecycleService { ); } + #hasBeforeShutdown = false; + #beforeShutdownTasks: Array<{ hook: () => void | Promise }> = []; + + addBeforeShutdownHook(hook: () => void): void { + if (this.#hasBeforeShutdown) { + throw new Error( + 'Attempt to add before shutdown hook after shutdown has started', + ); + } + this.#beforeShutdownTasks.push({ hook }); + } + + async beforeShutdown(): Promise { + if (this.#hasBeforeShutdown) { + return; + } + this.#hasBeforeShutdown = true; + + this.logger.debug( + `Running ${this.#beforeShutdownTasks.length} before shutdown tasks...`, + ); + await Promise.all( + this.#beforeShutdownTasks.map(async ({ hook }) => { + try { + await hook(); + this.logger.debug(`Before shutdown hook succeeded`); + } catch (error) { + this.logger.error(`Before shutdown hook failed, ${error}`); + } + }), + ); + } + #hasShutdown = false; #shutdownTasks: Array<{ hook: LifecycleServiceShutdownHook; diff --git a/packages/backend-defaults/src/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.test.ts b/packages/backend-defaults/src/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.test.ts index 3c641feadf..1ce1401829 100644 --- a/packages/backend-defaults/src/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.test.ts +++ b/packages/backend-defaults/src/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.test.ts @@ -55,7 +55,11 @@ describe('PluginTaskManagerImpl', () => { const manager = new PluginTaskSchedulerImpl( async () => knex, mockServices.logger.mock(), - { addShutdownHook, addStartupHook: jest.fn() }, + { + addShutdownHook, + addBeforeShutdownHook: jest.fn(), + addStartupHook: jest.fn(), + }, ); return { knex, manager }; } diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketServerUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketServerUrlReader.ts index c37cb59308..d327f80704 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketServerUrlReader.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketServerUrlReader.ts @@ -37,6 +37,20 @@ import { Minimatch } from 'minimatch'; import { ReaderFactory, ReadTreeResponseFactory } from './types'; import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; +import pThrottle from 'p-throttle'; + +// 1 per second +const throttle = pThrottle({ + limit: 1, + interval: 1000, +}); + +const throttledFetch = throttle( + async (url: RequestInfo, options?: RequestInit) => { + return await fetch(url, options); + }, +); + /** * Implements a {@link @backstage/backend-plugin-api#UrlReaderService} for files from Bitbucket Server APIs. * @@ -79,7 +93,7 @@ export class BitbucketServerUrlReader implements UrlReaderService { let response: Response; try { - response = await fetch(bitbucketUrl.toString(), { + response = await throttledFetch(bitbucketUrl.toString(), { headers: { ...requestOptions.headers, ...(etag && { 'If-None-Match': etag }), @@ -129,7 +143,7 @@ export class BitbucketServerUrlReader implements UrlReaderService { url, this.integration.config, ); - const archiveResponse = await fetch( + const archiveResponse = await throttledFetch( downloadUrl, getBitbucketServerRequestOptions(this.integration.config), ); @@ -198,7 +212,7 @@ export class BitbucketServerUrlReader implements UrlReaderService { // https://docs.atlassian.com/bitbucket-server/rest/7.9.0/bitbucket-rest.html#idp211 (branches docs) const branchListUrl = `${this.integration.config.apiBaseUrl}/projects/${project}/repos/${repoName}/branches${branchParameter}`; - const branchListResponse = await fetch( + const branchListResponse = await throttledFetch( branchListUrl, getBitbucketServerRequestOptions(this.integration.config), ); diff --git a/packages/backend-dynamic-feature-service/CHANGELOG.md b/packages/backend-dynamic-feature-service/CHANGELOG.md index 7d12dd6d13..d01ee9ab5c 100644 --- a/packages/backend-dynamic-feature-service/CHANGELOG.md +++ b/packages/backend-dynamic-feature-service/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/backend-dynamic-feature-service +## 0.5.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/backend-app-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-events-backend@0.4.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/plugin-app-node@0.1.28-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/cli-node@0.2.11-next.1 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + ## 0.5.2-next.1 ### Patch Changes diff --git a/packages/backend-dynamic-feature-service/package.json b/packages/backend-dynamic-feature-service/package.json index 49b7e73a68..cb34c886e7 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.5.2-next.1", + "version": "0.5.2-next.2", "description": "Backstage dynamic feature service", "backstage": { "role": "node-library" diff --git a/packages/backend-legacy/CHANGELOG.md b/packages/backend-legacy/CHANGELOG.md index 45577af311..2e5fdf3d48 100644 --- a/packages/backend-legacy/CHANGELOG.md +++ b/packages/backend-legacy/CHANGELOG.md @@ -1,5 +1,45 @@ # example-backend-legacy +## 0.2.105-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.28.0-next.2 + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/plugin-app-backend@0.4.3-next.2 + - @backstage/plugin-auth-backend@0.24.1-next.2 + - @backstage/plugin-events-backend@0.4.0-next.2 + - @backstage/plugin-kubernetes-backend@0.19.1-next.2 + - @backstage/plugin-proxy-backend@0.5.9-next.2 + - @backstage/plugin-search-backend@1.8.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/plugin-signals-backend@0.2.4-next.2 + - @backstage/plugin-techdocs-backend@1.11.4-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.3-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/plugin-permission-backend@0.5.52-next.2 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.4-next.2 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.7.0-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.5.4-next.2 + - @backstage/plugin-search-backend-module-catalog@0.2.6-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.6.3-next.2 + - @backstage/plugin-search-backend-module-explore@0.2.6-next.2 + - @backstage/plugin-search-backend-module-pg@0.5.39-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.3.4-next.2 + - @backstage/plugin-signals-node@0.1.15-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 0.2.105-next.1 ### Patch Changes diff --git a/packages/backend-legacy/package.json b/packages/backend-legacy/package.json index 09157adb3a..f1ac32e60b 100644 --- a/packages/backend-legacy/package.json +++ b/packages/backend-legacy/package.json @@ -1,6 +1,6 @@ { "name": "example-backend-legacy", - "version": "0.2.105-next.1", + "version": "0.2.105-next.2", "backstage": { "role": "backend" }, diff --git a/packages/backend-openapi-utils/CHANGELOG.md b/packages/backend-openapi-utils/CHANGELOG.md index d2d2cabc79..35ec5cc456 100644 --- a/packages/backend-openapi-utils/CHANGELOG.md +++ b/packages/backend-openapi-utils/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/backend-openapi-utils +## 0.4.0-next.2 + +### Minor Changes + +- afcebea: Fixed a Typescript error when trying to use the new OpenAPI server-side generated code. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/types@1.2.0 + ## 0.3.1-next.1 ### Patch Changes diff --git a/packages/backend-openapi-utils/package.json b/packages/backend-openapi-utils/package.json index fdb597abd3..099afe2419 100644 --- a/packages/backend-openapi-utils/package.json +++ b/packages/backend-openapi-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-openapi-utils", - "version": "0.3.1-next.1", + "version": "0.4.0-next.2", "description": "OpenAPI typescript support.", "backstage": { "role": "node-library" diff --git a/packages/backend-plugin-api/CHANGELOG.md b/packages/backend-plugin-api/CHANGELOG.md index 592188d929..13797bc63a 100644 --- a/packages/backend-plugin-api/CHANGELOG.md +++ b/packages/backend-plugin-api/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/backend-plugin-api +## 1.1.0-next.2 + +### Patch Changes + +- 0e9c9fa: The `RootLifecycleService` now has a new `addBeforeShutdownHook` method, and hooks added through this method will run immediately when a termination event is received. + + The backend will not proceed with the shutdown and run the `Shutdown` hooks until all `BeforeShutdown` hooks have completed. + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 1.1.0-next.1 ### Minor Changes diff --git a/packages/backend-plugin-api/package.json b/packages/backend-plugin-api/package.json index 25983cafac..9bfae928c2 100644 --- a/packages/backend-plugin-api/package.json +++ b/packages/backend-plugin-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-plugin-api", - "version": "1.1.0-next.1", + "version": "1.1.0-next.2", "description": "Core API used by Backstage backend plugins", "backstage": { "role": "node-library" diff --git a/packages/backend-plugin-api/report.api.md b/packages/backend-plugin-api/report.api.md index a886ba4271..8416c6c200 100644 --- a/packages/backend-plugin-api/report.api.md +++ b/packages/backend-plugin-api/report.api.md @@ -507,7 +507,10 @@ export interface RootHttpRouterService { } // @public -export interface RootLifecycleService extends LifecycleService {} +export interface RootLifecycleService extends LifecycleService { + // (undocumented) + addBeforeShutdownHook(hook: () => void | Promise): void; +} // @public export interface RootLoggerService extends LoggerService {} diff --git a/packages/backend-plugin-api/src/services/definitions/RootLifecycleService.ts b/packages/backend-plugin-api/src/services/definitions/RootLifecycleService.ts index b962fa68ba..2fc9556938 100644 --- a/packages/backend-plugin-api/src/services/definitions/RootLifecycleService.ts +++ b/packages/backend-plugin-api/src/services/definitions/RootLifecycleService.ts @@ -23,4 +23,6 @@ import { LifecycleService } from './LifecycleService'; * * @public */ -export interface RootLifecycleService extends LifecycleService {} +export interface RootLifecycleService extends LifecycleService { + addBeforeShutdownHook(hook: () => void | Promise): void; +} diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md index 9e90f4f006..819d39a18d 100644 --- a/packages/backend-test-utils/CHANGELOG.md +++ b/packages/backend-test-utils/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/backend-test-utils +## 1.2.0-next.2 + +### Patch Changes + +- 0e9c9fa: Mock the new `RootLifecycleService.addBeforeShutdownHook` method. +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/backend-app-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + ## 1.2.0-next.1 ### Patch Changes diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index 6ff84c0664..ba23642a52 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.2.0-next.1", + "version": "1.2.0-next.2", "description": "Test helpers library for Backstage backends", "backstage": { "role": "node-library" diff --git a/packages/backend-test-utils/src/next/services/mockServices.ts b/packages/backend-test-utils/src/next/services/mockServices.ts index a2c3b34ead..b9bca62767 100644 --- a/packages/backend-test-utils/src/next/services/mockServices.ts +++ b/packages/backend-test-utils/src/next/services/mockServices.ts @@ -472,6 +472,7 @@ export namespace mockServices { export const factory = () => rootLifecycleServiceFactory; export const mock = simpleMock(coreServices.rootLifecycle, () => ({ addShutdownHook: jest.fn(), + addBeforeShutdownHook: jest.fn(), addStartupHook: jest.fn(), })); } diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index ddca06959f..27c2a067b7 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,43 @@ # example-backend +## 0.0.33-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.28.0-next.2 + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-scaffolder-backend-module-github@0.5.4-next.2 + - @backstage/plugin-notifications-backend@0.5.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/plugin-app-backend@0.4.3-next.2 + - @backstage/plugin-auth-backend@0.24.1-next.2 + - @backstage/plugin-auth-backend-module-github-provider@0.2.3-next.2 + - @backstage/plugin-devtools-backend@0.5.0-next.2 + - @backstage/plugin-events-backend@0.4.0-next.2 + - @backstage/plugin-kubernetes-backend@0.19.1-next.2 + - @backstage/plugin-proxy-backend@0.5.9-next.2 + - @backstage/plugin-search-backend@1.8.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/plugin-signals-backend@0.2.4-next.2 + - @backstage/plugin-techdocs-backend@1.11.4-next.2 + - @backstage/plugin-catalog-backend-module-openapi@0.2.5-next.2 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.3-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.3-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.3-next.2 + - @backstage/plugin-permission-backend@0.5.52-next.2 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.3-next.2 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.5-next.2 + - @backstage/plugin-search-backend-module-catalog@0.2.6-next.2 + - @backstage/plugin-search-backend-module-explore@0.2.6-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.3.4-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 0.0.33-next.1 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index fb7e396397..0e8cf10fed 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "example-backend", - "version": "0.0.33-next.1", + "version": "0.0.33-next.2", "backstage": { "role": "backend" }, @@ -62,7 +62,7 @@ "@backstage/plugin-search-backend-node": "workspace:^", "@backstage/plugin-signals-backend": "workspace:^", "@backstage/plugin-techdocs-backend": "workspace:^", - "@opentelemetry/auto-instrumentations-node": "^0.52.0", + "@opentelemetry/auto-instrumentations-node": "^0.54.0", "@opentelemetry/exporter-prometheus": "^0.54.0", "@opentelemetry/sdk-node": "^0.54.0", "example-app": "link:../app" diff --git a/packages/canon/.storybook/preview.tsx b/packages/canon/.storybook/preview.tsx index bb0c497d2d..8beeb82720 100644 --- a/packages/canon/.storybook/preview.tsx +++ b/packages/canon/.storybook/preview.tsx @@ -8,6 +8,9 @@ import '../docs/components/styles.css'; // Canon specific styles import '../src/theme/styles.css'; +// Custom themes +import './themes/backstage.css'; + const preview: Preview = { parameters: { controls: { @@ -23,12 +26,14 @@ const preview: Preview = { decorators: [ withThemeByDataAttribute({ themes: { - light: 'light', - dark: 'dark', + Light: 'light', + Dark: 'dark', + 'Backstage Light': 'backstage-light', + 'Backstage Dark': 'backstage-dark', }, - defaultTheme: 'light', + defaultTheme: 'Light', }), - (Story, context) => { + Story => { document.body.style.backgroundColor = 'var(--canon-background)'; const docsStoryElements = document.getElementsByClassName('docs-story'); diff --git a/packages/canon/.storybook/themes/backstage.css b/packages/canon/.storybook/themes/backstage.css new file mode 100644 index 0000000000..4a7821cda2 --- /dev/null +++ b/packages/canon/.storybook/themes/backstage.css @@ -0,0 +1,75 @@ +[data-theme='backstage-light'] { + /* Colors */ + --canon-accent: #2e77d0; + --canon-background: #f8f8f8; + --canon-surface-1: #fff; + --canon-surface-2: #f4f4f4; + + /* Text colors */ + --canon-text-primary: #000; + --canon-text-primary-on-accent: #fff; + --canon-text-secondary: #646464; + + --canon-font-regular: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif; + + .button { + border-radius: 60px; + font-weight: 400; + text-transform: uppercase; + font-size: 0.875rem; + transition: background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, + box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, + border 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; + line-height: 1.75; + border-radius: 4px; + background-color: #1f5493; + padding: 6px 16px; + box-shadow: none; + } + + .button:hover { + box-shadow: none; + } + + .button.primary { + color: #fff; + background-color: rgb(21, 58, 102); + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), + 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); + } + + .button.primary:hover { + box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), + 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); + } + + .button.secondary { + background-color: transparent; + border: 1px solid rgba(31, 84, 147, 0.5); + color: #1f5493; + } + + .button.secondary:hover { + border: 1px solid #1f5493; + background-color: rgba(31, 84, 147, 0.04); + } + + .button.tertiary { + background-color: transparent; + border: none; + color: #1f5493; + } +} + +[data-theme='backstage-dark'] { + /* Colors */ + --canon-accent: #2e77d0; + --canon-background: #000; + --canon-surface-1: #121212; + --canon-surface-2: #1a1a1a; + + /* Text colors */ + --canon-text-primary: #fff; + --canon-text-primary-on-accent: #000; + --canon-text-secondary: #b3b3b3; +} diff --git a/packages/canon/catalog-info.yaml b/packages/canon/catalog-info.yaml index 37aa7b1caf..8369c314b3 100644 --- a/packages/canon/catalog-info.yaml +++ b/packages/canon/catalog-info.yaml @@ -6,4 +6,4 @@ metadata: spec: lifecycle: experimental type: backstage-web-library - owner: maintainers + owner: design-system-maintainers diff --git a/packages/canon/docs/components/Banner/index.tsx b/packages/canon/docs/components/Banner/Banner.tsx similarity index 90% rename from packages/canon/docs/components/Banner/index.tsx rename to packages/canon/docs/components/Banner/Banner.tsx index c3036eac03..3199e65bc0 100644 --- a/packages/canon/docs/components/Banner/index.tsx +++ b/packages/canon/docs/components/Banner/Banner.tsx @@ -14,7 +14,6 @@ * limitations under the License. */ import React from 'react'; -import { bannerIconStyles, bannerStyles } from './banner.css'; export const Banner = ({ children, @@ -24,8 +23,8 @@ export const Banner = ({ variant?: 'info' | 'warning'; }) => { return ( -
-
+
+
p { + margin: 0; + } + + &.info { + background-color: #f2f2f2; + border-color: #cdcdcd; + color: #888888; + } + + &.warning { + background-color: #fff2b9; + border-color: #ffd000; + color: #d79927; + } + + & .icon { + width: 32px; + height: 32px; + background-color: rgba(215, 153, 39, 0.2); + border-radius: 6px; + margin-right: 16px; + display: flex; + align-items: center; + justify-content: center; + } +} diff --git a/packages/canon/docs/components/Chip/index.tsx b/packages/canon/docs/components/Chip/Chip.tsx similarity index 87% rename from packages/canon/docs/components/Chip/index.tsx rename to packages/canon/docs/components/Chip/Chip.tsx index 81609dda61..e6e1d1b1c4 100644 --- a/packages/canon/docs/components/Chip/index.tsx +++ b/packages/canon/docs/components/Chip/Chip.tsx @@ -15,7 +15,6 @@ */ import React from 'react'; -import { chipStyles } from './chip.css'; export const Chip = ({ children, @@ -24,5 +23,5 @@ export const Chip = ({ children: React.ReactNode; head?: boolean; }) => { - return {children}; + return {children}; }; diff --git a/packages/canon/docs/components/Chip/chip.css.ts b/packages/canon/docs/components/Chip/chip.css.ts deleted file mode 100644 index 027a722f84..0000000000 --- a/packages/canon/docs/components/Chip/chip.css.ts +++ /dev/null @@ -1,42 +0,0 @@ -/* - * 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 { recipe } from '@vanilla-extract/recipes'; - -export const chipStyles = recipe({ - base: { - display: 'inline-flex', - alignItems: 'center', - fontFamily: 'Geist Mono, monospace', - fontSize: '13px', - borderRadius: '6px', - padding: '0px 8px', - height: '24px', - marginRight: '4px', - }, - variants: { - head: { - true: { - backgroundColor: '#eaf2fd', - color: '#2563eb', - }, - false: { - backgroundColor: '#f0f0f0', - color: '#5d5d5d', - }, - }, - }, -}); diff --git a/packages/canon/docs/components/Chip/index.ts b/packages/canon/docs/components/Chip/index.ts new file mode 100644 index 0000000000..ff9e4794c5 --- /dev/null +++ b/packages/canon/docs/components/Chip/index.ts @@ -0,0 +1,16 @@ +/* + * 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. + */ +export { Chip } from './Chip'; diff --git a/packages/canon/docs/components/Chip/styles.css b/packages/canon/docs/components/Chip/styles.css new file mode 100644 index 0000000000..ebbaf6645f --- /dev/null +++ b/packages/canon/docs/components/Chip/styles.css @@ -0,0 +1,33 @@ +/* + * 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. + */ + +.chip { + display: inline-flex; + align-items: center; + font-family: 'Geist Mono', monospace; + font-size: 13px; + border-radius: 6px; + padding: 0px 8px; + height: 24px; + margin-right: 4px; + background-color: #f0f0f0; + color: #5d5d5d; + + &.head { + background-color: #eaf2fd; + color: #2563eb; + } +} diff --git a/packages/canon/docs/components/Columns/index.tsx b/packages/canon/docs/components/Columns/Columns.tsx similarity index 90% rename from packages/canon/docs/components/Columns/index.tsx rename to packages/canon/docs/components/Columns/Columns.tsx index 0d6f27f04d..115ec50010 100644 --- a/packages/canon/docs/components/Columns/index.tsx +++ b/packages/canon/docs/components/Columns/Columns.tsx @@ -15,7 +15,6 @@ */ import React from 'react'; -import { styles } from './columns.css'; export const Columns = ({ children, @@ -25,7 +24,7 @@ export const Columns = ({ style?: React.CSSProperties; }) => { return ( -
+
{children}
); diff --git a/packages/canon/docs/components/Columns/index.ts b/packages/canon/docs/components/Columns/index.ts new file mode 100644 index 0000000000..05de0850be --- /dev/null +++ b/packages/canon/docs/components/Columns/index.ts @@ -0,0 +1,16 @@ +/* + * 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. + */ +export { Columns } from './Columns'; diff --git a/packages/canon/docs/components/Columns/styles.css b/packages/canon/docs/components/Columns/styles.css new file mode 100644 index 0000000000..c34acfc406 --- /dev/null +++ b/packages/canon/docs/components/Columns/styles.css @@ -0,0 +1,22 @@ +/* + * 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. + */ + +.columns { + display: grid; + grid-template-columns: repeat(3, 1fr); + row-gap: 20px; + column-gap: 80px; +} diff --git a/packages/canon/docs/components/ComponentStatus/index.tsx b/packages/canon/docs/components/ComponentStatus/ComponentStatus.tsx similarity index 83% rename from packages/canon/docs/components/ComponentStatus/index.tsx rename to packages/canon/docs/components/ComponentStatus/ComponentStatus.tsx index 64d552ea97..0159e27b32 100644 --- a/packages/canon/docs/components/ComponentStatus/index.tsx +++ b/packages/canon/docs/components/ComponentStatus/ComponentStatus.tsx @@ -15,7 +15,6 @@ */ import React from 'react'; -import { container, pill, title } from './component-status.css'; export const ComponentStatus = ({ name, @@ -29,15 +28,15 @@ export const ComponentStatus = ({ link?: string; }) => { return ( -
+
{link ? ( - + {name} ) : ( - {name} + {name} )} - + {status === 'notStarted' && 'Not Started'} {status === 'inProgress' && 'In Progress'} {status === 'alpha' && 'Alpha'} diff --git a/packages/canon/docs/components/ComponentStatus/component-status.css.ts b/packages/canon/docs/components/ComponentStatus/component-status.css.ts deleted file mode 100644 index 5cce5adb5d..0000000000 --- a/packages/canon/docs/components/ComponentStatus/component-status.css.ts +++ /dev/null @@ -1,77 +0,0 @@ -/* - * 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 { style } from '@vanilla-extract/css'; -import { recipe } from '@vanilla-extract/recipes'; - -export const container = style({ - display: 'flex', - justifyContent: 'space-between', -}); - -export const title = style({ - color: '#3b59ff', - fontFamily: '"Geist", sans-serif', - fontSize: '16px', - fontWeight: 400, - textDecoration: 'none', -}); - -export const pill = recipe({ - base: { - fontFamily: '"Geist", sans-serif', - display: 'inline-flex', - alignItems: 'center', - color: '#000', - borderRadius: '40px', - padding: '0px 8px', - height: '24px', - fontSize: '12px', - fontWeight: 600, - borderStyle: 'solid', - borderWidth: '1px', - marginLeft: '8px', - }, - variants: { - status: { - notStarted: { - backgroundColor: '#F2F2F2', - borderColor: '#CDCDCD', - color: '#888888', - }, - inProgress: { - backgroundColor: '#FFF2B9', - borderColor: '#FFD000', - color: '#D79927', - }, - alpha: { - backgroundColor: '#D7F9D7', - borderColor: '#4ED14A', - color: '#3A9837', - }, - beta: { - backgroundColor: '#D7F9D7', - borderColor: '#4ED14A', - color: '#3A9837', - }, - stable: { - backgroundColor: '#D7F9D7', - borderColor: '#4ED14A', - color: '#3A9837', - }, - }, - }, -}); diff --git a/packages/canon/docs/components/ComponentStatus/index.ts b/packages/canon/docs/components/ComponentStatus/index.ts new file mode 100644 index 0000000000..238c001289 --- /dev/null +++ b/packages/canon/docs/components/ComponentStatus/index.ts @@ -0,0 +1,16 @@ +/* + * 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. + */ +export { ComponentStatus } from './ComponentStatus'; diff --git a/packages/canon/docs/components/ComponentStatus/styles.css b/packages/canon/docs/components/ComponentStatus/styles.css new file mode 100644 index 0000000000..f800e659e0 --- /dev/null +++ b/packages/canon/docs/components/ComponentStatus/styles.css @@ -0,0 +1,73 @@ +/* + * 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. + */ + +.component-status { + display: flex; + justify-content: space-between; + + & .title { + color: #3b59ff; + font-family: 'Geist', sans-serif; + font-size: 16px; + font-weight: 400; + text-decoration: none; + } + + & .pill { + font-family: 'Geist', sans-serif; + display: inline-flex; + align-items: center; + color: #000; + border-radius: 40px; + padding: 0px 8px; + height: 24px; + font-size: 12px; + font-weight: 600; + border-style: solid; + border-width: 1px; + margin-left: 8px; + + &.notStarted { + background-color: #f2f2f2; + border-color: #cdcdcd; + color: #888888; + } + + &.inProgress { + background-color: #fff2b9; + border-color: #ffd000; + color: #d79927; + } + + &.alpha { + background-color: #d7f9d7; + border-color: #4ed14a; + color: #3a9837; + } + + &.beta { + background-color: #d7f9d7; + border-color: #4ed14a; + color: #3a9837; + } + + &.stable { + background-color: #d7f9d7; + border-color: #4ed14a; + color: #3a9837; + } + } +} diff --git a/packages/canon/docs/components/IconLibrary/index.tsx b/packages/canon/docs/components/IconLibrary/IconLibrary.tsx similarity index 96% rename from packages/canon/docs/components/IconLibrary/index.tsx rename to packages/canon/docs/components/IconLibrary/IconLibrary.tsx index 6e94c2c777..e32f4c08a4 100644 --- a/packages/canon/docs/components/IconLibrary/index.tsx +++ b/packages/canon/docs/components/IconLibrary/IconLibrary.tsx @@ -17,7 +17,7 @@ import React from 'react'; import { Icon } from '@backstage/canon'; import type { IconNames } from '@backstage/canon'; import { defaultIcons } from '../../../src/components/Icon/icons'; -import { Text } from '../Text'; +import { Text } from '../Text/Text'; export const IconLibrary = () => { const icons = Object.keys(defaultIcons); diff --git a/packages/canon/docs/components/IconLibrary/index.ts b/packages/canon/docs/components/IconLibrary/index.ts new file mode 100644 index 0000000000..071c80db85 --- /dev/null +++ b/packages/canon/docs/components/IconLibrary/index.ts @@ -0,0 +1,16 @@ +/* + * 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. + */ +export { IconLibrary } from './IconLibrary'; diff --git a/packages/canon/docs/components/LayoutComponents/LayoutComponents.tsx b/packages/canon/docs/components/LayoutComponents/LayoutComponents.tsx new file mode 100644 index 0000000000..56f389a389 --- /dev/null +++ b/packages/canon/docs/components/LayoutComponents/LayoutComponents.tsx @@ -0,0 +1,64 @@ +/* + * 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 React from 'react'; +import { BoxSvg } from './svgs/box'; +import { StackSvg } from './svgs/stack'; +import { GridSvg } from './svgs/grid'; +import { InlineSvg } from './svgs/inline'; +import { ContainerSvg } from './svgs/container'; + +export const LayoutComponents = () => { + return ( +
+
+ + + +
Box
+
The most basic layout component
+
+
+ + + +
Stack
+
Arrange your components vertically
+
+
+ + + +
Grid
+
Arrange your components in a grid
+
+
+ + + +
Inline
+
Arrange your components in a row
+
+
+ + + +
Container
+
A container for your components
+
+
+ ); +}; diff --git a/packages/canon/docs/components/LayoutComponents/index.ts b/packages/canon/docs/components/LayoutComponents/index.ts new file mode 100644 index 0000000000..55cc9f25ef --- /dev/null +++ b/packages/canon/docs/components/LayoutComponents/index.ts @@ -0,0 +1,16 @@ +/* + * 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. + */ +export { LayoutComponents } from './LayoutComponents'; diff --git a/packages/canon/docs/components/LayoutComponents/index.tsx b/packages/canon/docs/components/LayoutComponents/index.tsx deleted file mode 100644 index 92fab7c47f..0000000000 --- a/packages/canon/docs/components/LayoutComponents/index.tsx +++ /dev/null @@ -1,71 +0,0 @@ -/* - * 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 React from 'react'; -import { - container, - box, - content, - title, - description, -} from './layout-components.css'; -import { BoxSvg } from './box'; -import { StackSvg } from './stack'; -import { GridSvg } from './grid'; -import { InlineSvg } from './inline'; -import { ContainerSvg } from './container'; - -export const LayoutComponents = () => { - return ( -
-
- - - -
Box
-
The most basic layout component
-
-
- - - -
Stack
-
Arrange your components vertically
-
-
- - - -
Grid
-
Arrange your components in a grid
-
-
- - - -
Inline
-
Arrange your components in a row
-
-
- - - -
Container
-
A container for your components
-
-
- ); -}; diff --git a/packages/canon/docs/components/LayoutComponents/layout-components.css.ts b/packages/canon/docs/components/LayoutComponents/layout-components.css.ts deleted file mode 100644 index 47d9a13111..0000000000 --- a/packages/canon/docs/components/LayoutComponents/layout-components.css.ts +++ /dev/null @@ -1,63 +0,0 @@ -/* - * 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 { style } from '@vanilla-extract/css'; - -export const container = style({ - display: 'flex', - justifyContent: 'flex-start', - gap: '1rem', - flexWrap: 'wrap', -}); - -export const box = style({ - display: 'flex', - flexDirection: 'column', - width: 'calc(33.33% - 0.67rem)', - marginBottom: '1rem', - alignItems: 'flex-start', -}); - -export const content = style({ - flex: 'none', - background: 'linear-gradient(180deg, #F3F3F3 0%, #FFF 100%)', - borderRadius: '4px', - width: '100%', - height: '180px', - transition: 'all 0.2s ease-in-out', - marginBottom: '0.75rem', - display: 'flex', - alignItems: 'center', - justifyContent: 'center', - selectors: { - [`${box}:hover &`]: { - transform: 'translateY(-4px)', - }, - }, -}); - -export const title = style({ - fontSize: '16px', - fontFamily: 'var(--canon-font-regular)', - transition: 'color 0.2s ease-in-out', - marginBottom: '0.25rem', -}); - -export const description = style({ - fontSize: '16px', - fontFamily: 'var(--canon-font-regular)', - color: '#9e9e9e', -}); diff --git a/packages/canon/docs/components/LayoutComponents/styles.css b/packages/canon/docs/components/LayoutComponents/styles.css new file mode 100644 index 0000000000..c2a819cf6b --- /dev/null +++ b/packages/canon/docs/components/LayoutComponents/styles.css @@ -0,0 +1,60 @@ +/* + * 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. + */ + +.layout-components { + display: flex; + justify-content: flex-start; + gap: 1rem; + flex-wrap: wrap; + + & .box { + display: flex; + flex-direction: column; + width: calc(33.33% - 0.67rem); + margin-bottom: 1rem; + align-items: flex-start; + } + + & .content { + flex: none; + background: linear-gradient(180deg, #f3f3f3 0%, #fff 100%); + border-radius: 4px; + width: 100%; + height: 180px; + transition: all 0.2s ease-in-out; + margin-bottom: 0.75rem; + display: flex; + align-items: center; + justify-content: center; + + &:hover { + transform: translateY(-4px); + } + } + + & .title { + font-size: 16px; + font-family: 'Geist', sans-serif; + transition: color 0.2s ease-in-out; + margin-bottom: 0.25rem; + } + + & .description { + font-size: 16px; + font-family: 'Geist', sans-serif; + color: #9e9e9e; + } +} diff --git a/packages/canon/docs/components/LayoutComponents/box.tsx b/packages/canon/docs/components/LayoutComponents/svgs/box.tsx similarity index 100% rename from packages/canon/docs/components/LayoutComponents/box.tsx rename to packages/canon/docs/components/LayoutComponents/svgs/box.tsx diff --git a/packages/canon/docs/components/LayoutComponents/container.tsx b/packages/canon/docs/components/LayoutComponents/svgs/container.tsx similarity index 100% rename from packages/canon/docs/components/LayoutComponents/container.tsx rename to packages/canon/docs/components/LayoutComponents/svgs/container.tsx diff --git a/packages/canon/docs/components/LayoutComponents/grid.tsx b/packages/canon/docs/components/LayoutComponents/svgs/grid.tsx similarity index 100% rename from packages/canon/docs/components/LayoutComponents/grid.tsx rename to packages/canon/docs/components/LayoutComponents/svgs/grid.tsx diff --git a/packages/canon/docs/components/LayoutComponents/inline.tsx b/packages/canon/docs/components/LayoutComponents/svgs/inline.tsx similarity index 100% rename from packages/canon/docs/components/LayoutComponents/inline.tsx rename to packages/canon/docs/components/LayoutComponents/svgs/inline.tsx diff --git a/packages/canon/docs/components/LayoutComponents/stack.tsx b/packages/canon/docs/components/LayoutComponents/svgs/stack.tsx similarity index 100% rename from packages/canon/docs/components/LayoutComponents/stack.tsx rename to packages/canon/docs/components/LayoutComponents/svgs/stack.tsx diff --git a/packages/canon/docs/components/PropsTable/getProps.ts b/packages/canon/docs/components/PropsTable/getProps.ts index 866dcb9d10..5773eaeb27 100644 --- a/packages/canon/docs/components/PropsTable/getProps.ts +++ b/packages/canon/docs/components/PropsTable/getProps.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export function getBoxProps(styles: Record) { +export function getProps(styles: Record) { return Object.keys(styles).reduce( (acc: Record, n) => { const style = styles[n]; diff --git a/packages/canon/docs/components/PropsTable/index.ts b/packages/canon/docs/components/PropsTable/index.ts index 010452ee2a..181933f0f8 100644 --- a/packages/canon/docs/components/PropsTable/index.ts +++ b/packages/canon/docs/components/PropsTable/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ export { PropsTable } from './PropsTable'; -export { getBoxProps } from './getProps'; +export { getProps } from './getProps'; diff --git a/packages/canon/docs/components/Roadmap/index.tsx b/packages/canon/docs/components/Roadmap/Roadmap.tsx similarity index 100% rename from packages/canon/docs/components/Roadmap/index.tsx rename to packages/canon/docs/components/Roadmap/Roadmap.tsx diff --git a/packages/canon/docs/components/Roadmap/index.ts b/packages/canon/docs/components/Roadmap/index.ts new file mode 100644 index 0000000000..ac51dfa1ed --- /dev/null +++ b/packages/canon/docs/components/Roadmap/index.ts @@ -0,0 +1,16 @@ +/* + * 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. + */ +export { Roadmap } from './Roadmap'; diff --git a/packages/canon/docs/components/Table/index.tsx b/packages/canon/docs/components/Table/Table.tsx similarity index 77% rename from packages/canon/docs/components/Table/index.tsx rename to packages/canon/docs/components/Table/Table.tsx index ead30985aa..4983038724 100644 --- a/packages/canon/docs/components/Table/index.tsx +++ b/packages/canon/docs/components/Table/Table.tsx @@ -15,18 +15,11 @@ */ import React from 'react'; -import { - cellStyles, - headerCellStyles, - tableStyles, - wrapperStyles, - rowStyles, -} from './table.css'; export const Root = ({ children }: { children: React.ReactNode }) => { return ( -
- {children}
+
+ {children}
); }; @@ -44,13 +37,13 @@ export const HeaderRow = ({ children }: { children: React.ReactNode }) => { }; export const HeaderCell = ({ children }: { children: React.ReactNode }) => { - return {children}; + return {children}; }; export const Row = ({ children }: { children: React.ReactNode }) => { - return {children}; + return {children}; }; export const Cell = ({ children }: { children: React.ReactNode }) => { - return {children}; + return {children}; }; diff --git a/packages/canon/docs/components/Table/index.ts b/packages/canon/docs/components/Table/index.ts new file mode 100644 index 0000000000..7419aa83a8 --- /dev/null +++ b/packages/canon/docs/components/Table/index.ts @@ -0,0 +1,16 @@ +/* + * 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. + */ +export { Root, Header, Body, Row, Cell, HeaderRow, HeaderCell } from './Table'; diff --git a/packages/canon/docs/components/Table/styles.css b/packages/canon/docs/components/Table/styles.css new file mode 100644 index 0000000000..a8c35d3978 --- /dev/null +++ b/packages/canon/docs/components/Table/styles.css @@ -0,0 +1,74 @@ +/* + * 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. + */ + +.table-wrapper { + border: 1px solid #e7e7e7; + border-radius: 4px; + overflow: hidden; + + & .table { + width: 100%; + margin: 0 !important; + padding: 0 !important; + border-spacing: 0px; + border-collapse: collapse; + } + + & .table-cell { + padding: 12px 16px !important; + border: none !important; + text-align: left; + background-color: white !important; + font-family: 'Geist', sans-serif; + font-size: 16px; + font-weight: 300; + + & p { + margin: 0; + } + } + + & .table-header-cell { + background-color: #f5f5f5 !important; + border-bottom: 1px solid #e7e7e7 !important; + font-weight: 500; + font-size: 14px; + } + + & .table-row { + border: none; + border-bottom: 1px solid #e7e7e7; + &:last-child { + border-bottom: none; + } + } + + & .table-chip { + display: inline-block; + font-size: 14px !important; + border: 1px solid #e7e7e7; + border-radius: 6px; + padding: 0px 6px; + height: 24px; + } + + & .table-type { + display: flex; + flex-wrap: wrap; + flex-direction: row; + gap: 8px; + } +} diff --git a/packages/canon/docs/components/Table/table.css.ts b/packages/canon/docs/components/Table/table.css.ts deleted file mode 100644 index b01373ee04..0000000000 --- a/packages/canon/docs/components/Table/table.css.ts +++ /dev/null @@ -1,83 +0,0 @@ -/* - * 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 { style, globalStyle } from '@vanilla-extract/css'; - -export const wrapperStyles = style({ - border: '1px solid #e7e7e7', - borderRadius: '4px', - overflow: 'hidden', -}); - -export const tableStyles = style({ - width: '100%', - margin: '0 !important', - padding: '0 !important', - borderSpacing: '0px', - borderCollapse: 'collapse', -}); - -export const cellStyles = style({ - padding: '12px 16px !important', - border: 'none !important', - textAlign: 'left', - backgroundColor: 'white !important', - fontFamily: '"Geist", sans-serif', - fontSize: '16px', - fontWeight: 300, -}); - -// Apply global styles to

elements inside cellStyles -globalStyle(`${cellStyles} p`, { - margin: '0', -}); - -export const headerRowStyles = style({ - borderBottom: '1px solid #e7e7e7', -}); - -export const headerCellStyles = style({ - backgroundColor: '#f5f5f5 !important', - borderBottom: '1px solid #e7e7e7 !important', - fontWeight: 500, - fontSize: '14px', -}); - -export const rowStyles = style({ - border: 'none', - borderBottom: '1px solid #e7e7e7', - selectors: { - '&:last-child': { - borderBottom: 'none', - }, - }, -}); - -export const chipStyles = style({ - display: 'inline-block', - fontSize: '14px !important', - border: '1px solid #e7e7e7', - borderRadius: '6px', - padding: '0px 6px', - height: '24px', -}); - -export const typeStyles = style({ - display: 'flex', - flexWrap: 'wrap', - flexDirection: 'row', - gap: '8px', -}); diff --git a/packages/canon/docs/components/Text/index.tsx b/packages/canon/docs/components/Text/Text.tsx similarity index 90% rename from packages/canon/docs/components/Text/index.tsx rename to packages/canon/docs/components/Text/Text.tsx index be882c0a81..9f3dd6ce90 100644 --- a/packages/canon/docs/components/Text/index.tsx +++ b/packages/canon/docs/components/Text/Text.tsx @@ -15,7 +15,6 @@ */ import React from 'react'; -import { textStyles } from './text.css'; export const Text = ({ children, @@ -25,7 +24,7 @@ export const Text = ({ style?: React.CSSProperties; }) => { return ( -

+
{children}
); diff --git a/packages/canon/docs/components/Text/index.ts b/packages/canon/docs/components/Text/index.ts new file mode 100644 index 0000000000..873fca2c76 --- /dev/null +++ b/packages/canon/docs/components/Text/index.ts @@ -0,0 +1,16 @@ +/* + * 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. + */ +export { Text } from './Text'; diff --git a/packages/canon/docs/components/Text/styles.css b/packages/canon/docs/components/Text/styles.css new file mode 100644 index 0000000000..cbb2b88edb --- /dev/null +++ b/packages/canon/docs/components/Text/styles.css @@ -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. + */ + +.text { + font-family: 'Geist', sans-serif; + font-size: 16px; + line-height: 28px; + margin: 0; + font-weight: 300; + margin-bottom: 16px; + + & p { + font-family: 'Geist', sans-serif; + font-size: 16px; + line-height: 28px; + margin: 0; + font-weight: 300; + } +} diff --git a/packages/canon/docs/components/Title/index.tsx b/packages/canon/docs/components/Title/Title.tsx similarity index 92% rename from packages/canon/docs/components/Title/index.tsx rename to packages/canon/docs/components/Title/Title.tsx index 13e5b964bb..056ccfc14d 100644 --- a/packages/canon/docs/components/Title/index.tsx +++ b/packages/canon/docs/components/Title/Title.tsx @@ -15,7 +15,6 @@ */ import React from 'react'; -import { titleStyles } from './title.css'; export const Title = ({ children, @@ -32,7 +31,7 @@ export const Title = ({ if (type === 'h3') Component = 'h3'; return React.createElement(Component, { - className: titleStyles({ type }), + className: `title ${type}`, style, children, }); diff --git a/packages/canon/docs/components/Title/index.ts b/packages/canon/docs/components/Title/index.ts new file mode 100644 index 0000000000..998dc81882 --- /dev/null +++ b/packages/canon/docs/components/Title/index.ts @@ -0,0 +1,16 @@ +/* + * 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. + */ +export { Title } from './Title'; diff --git a/packages/canon/docs/components/Title/styles.css b/packages/canon/docs/components/Title/styles.css new file mode 100644 index 0000000000..a8d00e2af5 --- /dev/null +++ b/packages/canon/docs/components/Title/styles.css @@ -0,0 +1,43 @@ +/* + * 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. + */ + +.title { + font-family: 'Geist', sans-serif; + margin: 0; + font-weight: 500; + border: none; + + &.h1 { + font-size: 36px; + line-height: 44px; + margin-bottom: 8px; + margin-top: 0px; + } + + &.h2 { + font-size: 24px; + line-height: 32px; + margin-bottom: 12px; + margin-top: 52px; + } + + &.h3 { + font-size: 20px; + line-height: 28px; + margin-bottom: 12px; + margin-top: 40px; + } +} diff --git a/packages/canon/docs/components/Title/title.css.ts b/packages/canon/docs/components/Title/title.css.ts deleted file mode 100644 index 6618ad80be..0000000000 --- a/packages/canon/docs/components/Title/title.css.ts +++ /dev/null @@ -1,48 +0,0 @@ -/* - * 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 { recipe } from '@vanilla-extract/recipes'; - -export const titleStyles = recipe({ - base: { - fontFamily: '"Geist", sans-serif', - margin: '0', - fontWeight: 500, - border: 'none', - }, - variants: { - type: { - h1: { - fontSize: '36px', - lineHeight: '44px', - marginBottom: '8px', - marginTop: '0px', - }, - h2: { - fontSize: '24px', - lineHeight: '32px', - marginBottom: '12px', - marginTop: '52px', - }, - h3: { - fontSize: '20px', - lineHeight: '28px', - marginBottom: '12px', - marginTop: '40px', - }, - }, - }, -}); diff --git a/packages/canon/docs/components/index.ts b/packages/canon/docs/components/index.ts index 7ad07bec6a..0e5ff2e325 100644 --- a/packages/canon/docs/components/index.ts +++ b/packages/canon/docs/components/index.ts @@ -14,13 +14,14 @@ * limitations under the License. */ +export * from './Banner'; export * from './Chip'; -export * from './Table'; -export * from './Title'; -export * from './Text'; export * from './Columns'; export * from './ComponentStatus'; -export * from './LayoutComponents'; -export * from './Banner'; export * from './IconLibrary'; +export * from './LayoutComponents'; +export * from './PropsTable'; export * from './Roadmap'; +export * from './Table'; +export * from './Text'; +export * from './Title'; diff --git a/packages/canon/docs/components/styles.css b/packages/canon/docs/components/styles.css index 698085ad19..670b0c3046 100644 --- a/packages/canon/docs/components/styles.css +++ b/packages/canon/docs/components/styles.css @@ -1,2 +1,10 @@ +@import './Banner/styles.css'; +@import './Chip/styles.css'; +@import './Columns/styles.css'; +@import './ComponentStatus/styles.css'; @import './IconLibrary/styles.css'; +@import './LayoutComponents/styles.css'; @import './Roadmap/styles.css'; +@import './Table/styles.css'; +@import './Text/styles.css'; +@import './Title/styles.css'; diff --git a/packages/canon/package.json b/packages/canon/package.json index c8a8f79a6f..7bfc717b74 100644 --- a/packages/canon/package.json +++ b/packages/canon/package.json @@ -39,9 +39,6 @@ "dependencies": { "@base_ui/react": "^1.0.0-alpha.3", "@remixicon/react": "^4.5.0", - "@vanilla-extract/css": "^1.16.0", - "@vanilla-extract/dynamic": "^2.1.2", - "@vanilla-extract/recipes": "^0.5.5", "@vanilla-extract/sprinkles": "^1.6.3" }, "devDependencies": { diff --git a/packages/canon/report.api.md b/packages/canon/report.api.md index c27b8da09b..b314020d81 100644 --- a/packages/canon/report.api.md +++ b/packages/canon/report.api.md @@ -129,6 +129,35 @@ export interface ButtonProps { variant?: 'primary' | 'secondary' | 'tertiary'; } +// @public (undocumented) +export const Checkbox: React_2.ForwardRefExoticComponent< + CheckboxProps & React_2.RefAttributes +>; + +// @public (undocumented) +export interface CheckboxProps { + // (undocumented) + checked?: boolean; + // (undocumented) + className?: string; + // (undocumented) + defaultChecked?: boolean; + // (undocumented) + disabled?: boolean; + // (undocumented) + label?: string; + // (undocumented) + name?: string; + // (undocumented) + onChange?: (checked: boolean) => void; + // (undocumented) + required?: boolean; + // (undocumented) + style?: React.CSSProperties; + // (undocumented) + value?: string; +} + // @public (undocumented) export type Color = | 'primary' @@ -237,7 +266,10 @@ export interface GridProps extends SpaceProps, ColorProps { } // @public (undocumented) -export const Icon: ({ name }: { name: IconNames }) => React_2.JSX.Element; +export const Icon: (props: { + name: IconNames; + size?: number; +}) => React_2.JSX.Element; // @public (undocumented) export type IconMap = Partial>; @@ -252,6 +284,7 @@ export type IconNames = | 'arrowLeftCircle' | 'arrowRightCircle' | 'arrowUpCircle' + | 'check' | 'chevronDown' | 'chevronLeft' | 'chevronRight' diff --git a/packages/canon/src/components/Box/Box.tsx b/packages/canon/src/components/Box/Box.tsx index a470c0584d..ecf138f1ce 100644 --- a/packages/canon/src/components/Box/Box.tsx +++ b/packages/canon/src/components/Box/Box.tsx @@ -16,7 +16,6 @@ import { createElement, forwardRef } from 'react'; import { boxSprinkles } from './sprinkles.css'; -import { base } from './box.css'; import { BoxProps } from './types'; /** @public */ @@ -27,7 +26,7 @@ export const Box = forwardRef((props, ref) => { const sprinklesClassName = boxSprinkles(restProps); // Combine the base class name, the sprinkles class name, and any additional class names - const classNames = [base, sprinklesClassName, className] + const classNames = ['box', sprinklesClassName, className] .filter(Boolean) .join(' '); diff --git a/packages/canon/src/components/Box/Docs.mdx b/packages/canon/src/components/Box/Docs.mdx index 11cc53b148..a03c6d43d3 100644 --- a/packages/canon/src/components/Box/Docs.mdx +++ b/packages/canon/src/components/Box/Docs.mdx @@ -2,7 +2,7 @@ import { Meta, Unstyled, Source } from '@storybook/blocks'; import * as BoxStories from './Box.stories'; import { Title, Text } from '../../../docs/components'; import { Padding } from './docs/padding'; -import { PropsTable, getBoxProps } from '../../../docs/components/PropsTable'; +import { PropsTable, getProps } from '../../../docs/components'; import { boxProperties } from './sprinkles.css'; import { spacingProperties } from '../../layout/sprinkles.css'; @@ -29,7 +29,7 @@ import { spacingProperties } from '../../layout/sprinkles.css'; - + Examples Here are some examples of how you can use the Box component. diff --git a/packages/canon/src/components/Box/styles.css b/packages/canon/src/components/Box/styles.css new file mode 100644 index 0000000000..75fd0dd493 --- /dev/null +++ b/packages/canon/src/components/Box/styles.css @@ -0,0 +1,4 @@ +.box { + font-family: 'var(--canon-font-regular)'; + color: 'var(--canon-text-primary)'; +} diff --git a/packages/canon/src/components/Button/Button.stories.tsx b/packages/canon/src/components/Button/Button.stories.tsx index fe3b1d58f6..6cab1cd1ba 100644 --- a/packages/canon/src/components/Button/Button.stories.tsx +++ b/packages/canon/src/components/Button/Button.stories.tsx @@ -26,7 +26,6 @@ const meta = { parameters: { layout: 'centered', }, - tags: ['autodocs'], argTypes: { size: { control: 'select', diff --git a/packages/canon/src/components/Button/Docs.mdx b/packages/canon/src/components/Button/Docs.mdx new file mode 100644 index 0000000000..4ddce0c982 --- /dev/null +++ b/packages/canon/src/components/Button/Docs.mdx @@ -0,0 +1,50 @@ +import { Canvas, Meta, Unstyled, Source } from '@storybook/blocks'; +import * as ButtonStories from './Button.stories'; +import { Title, Text } from '../../../docs/components'; +import { PropsTable } from '../../../docs/components/PropsTable/PropsTable'; + + + + + +Button +A button component that can be used to trigger actions. + + + + + + + API reference + + + + + diff --git a/packages/canon/src/components/Button/styles.css b/packages/canon/src/components/Button/styles.css index aaf1cae8bf..01f917c4b1 100644 --- a/packages/canon/src/components/Button/styles.css +++ b/packages/canon/src/components/Button/styles.css @@ -36,18 +36,18 @@ .button.primary:hover { background-color: transparent; - box-shadow: 0 0 0 1px var(--canon-outline-focus); + box-shadow: inset 0 0 0 1px var(--canon-outline-focus); color: var(--canon-text-primary); } .button.secondary { background-color: transparent; - box-shadow: 0 0 0 1px var(--canon-outline); + box-shadow: inset 0 0 0 1px var(--canon-outline); color: var(--canon-text-primary); } .button.secondary:hover { - box-shadow: 0 0 0 1px var(--canon-outline-hover); + box-shadow: inset 0 0 0 1px var(--canon-outline-hover); } .button.tertiary { diff --git a/packages/canon/docs/components/Text/text.css.ts b/packages/canon/src/components/Checkbox/Checkbox.stories.tsx similarity index 60% rename from packages/canon/docs/components/Text/text.css.ts rename to packages/canon/src/components/Checkbox/Checkbox.stories.tsx index fbbc427362..ffd874ffe7 100644 --- a/packages/canon/docs/components/Text/text.css.ts +++ b/packages/canon/src/components/Checkbox/Checkbox.stories.tsx @@ -14,21 +14,22 @@ * limitations under the License. */ -import { globalStyle, style } from '@vanilla-extract/css'; +import type { Meta, StoryObj } from '@storybook/react'; +import { Checkbox } from './Checkbox'; -export const textStyles = style({ - fontFamily: '"Geist", sans-serif', - fontSize: '16px', - lineHeight: '28px', - margin: '0', - fontWeight: 300, - marginBottom: '16px', -}); +const meta = { + title: 'Components/Checkbox', + component: Checkbox, + parameters: { + layout: 'centered', + }, +} satisfies Meta; -globalStyle(`${textStyles} p`, { - fontFamily: '"Geist", sans-serif', - fontSize: '16px', - lineHeight: '28px', - margin: '0', - fontWeight: 300, -}); +export default meta; +type Story = StoryObj; + +export const Primary: Story = { + args: { + label: 'Accept terms and conditions', + }, +}; diff --git a/packages/canon/src/components/Checkbox/Checkbox.tsx b/packages/canon/src/components/Checkbox/Checkbox.tsx new file mode 100644 index 0000000000..3021032421 --- /dev/null +++ b/packages/canon/src/components/Checkbox/Checkbox.tsx @@ -0,0 +1,64 @@ +/* + * 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 React from 'react'; + +import { CheckboxRoot, CheckboxIndicator } from '@base_ui/react'; +import { Icon } from '@backstage/canon'; +import type { CheckboxProps } from './types'; + +/** @public */ +export const Checkbox = React.forwardRef( + (props, ref) => { + const { + label, + checked, + onChange, + disabled, + required, + className, + name, + value, + style, + } = props; + + const checkboxElement = ( + + + + + + ); + + return label ? ( + + ) : ( + checkboxElement + ); + }, +); diff --git a/packages/canon/src/components/Checkbox/Docs.mdx b/packages/canon/src/components/Checkbox/Docs.mdx new file mode 100644 index 0000000000..9d9b4e4915 --- /dev/null +++ b/packages/canon/src/components/Checkbox/Docs.mdx @@ -0,0 +1,66 @@ +import { Canvas, Meta, Unstyled, Source } from '@storybook/blocks'; +import * as CheckboxStories from './Checkbox.stories'; +import { Title, Text } from '../../../docs/components'; +import { PropsTable } from '../../../docs/components/PropsTable'; + + + + + +Checkbox +A checkbox component that can be used to trigger actions. + + + + + + + API reference + + + void", + responsive: false, + }, + disabled: { + type: 'boolean', + responsive: false, + }, + required: { + type: 'boolean', + responsive: false, + }, + name: { + type: 'string', + responsive: false, + }, + value: { + type: 'string', + responsive: false, + }, + className: { + type: 'string', + responsive: false, + }, + style: { + type: 'CSSProperties', + responsive: false, + }, + }} +/> + + diff --git a/packages/canon/src/components/Checkbox/index.ts b/packages/canon/src/components/Checkbox/index.ts new file mode 100644 index 0000000000..f6dfbf6beb --- /dev/null +++ b/packages/canon/src/components/Checkbox/index.ts @@ -0,0 +1,17 @@ +/* + * 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. + */ +export { Checkbox } from './Checkbox'; +export type { CheckboxProps } from './types'; diff --git a/packages/canon/src/components/Checkbox/styles.css b/packages/canon/src/components/Checkbox/styles.css new file mode 100644 index 0000000000..fb7e0d0ab7 --- /dev/null +++ b/packages/canon/src/components/Checkbox/styles.css @@ -0,0 +1,39 @@ +.checkbox-label { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + gap: var(--canon-spacing-xs); + font-size: var(--canon-font-sizes-xs); + font-family: var(--canon-font-regular); + color: var(--canon-text-primary); + + & .checkbox { + all: unset; + display: flex; + align-items: center; + justify-content: center; + width: 16px; + height: 16px; + box-shadow: inset 0 0 0 1px var(--canon-outline); + cursor: pointer; + border-radius: 2px; + + &[data-state='unchecked'] { + & .checkbox-indicator { + display: none; + } + } + + &[data-state='checked'] { + background: var(--canon-accent); + } + } + + & .checkbox-indicator { + display: flex; + align-items: center; + justify-content: center; + color: var(--canon-text-primary-on-accent); + } +} diff --git a/packages/canon/src/components/Checkbox/types.ts b/packages/canon/src/components/Checkbox/types.ts new file mode 100644 index 0000000000..0240954afa --- /dev/null +++ b/packages/canon/src/components/Checkbox/types.ts @@ -0,0 +1,29 @@ +/* + * 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. + */ + +/** @public */ +export interface CheckboxProps { + label?: string; + defaultChecked?: boolean; + checked?: boolean; + onChange?: (checked: boolean) => void; + disabled?: boolean; + required?: boolean; + className?: string; + name?: string; + value?: string; + style?: React.CSSProperties; +} diff --git a/packages/canon/src/components/Container/Docs.mdx b/packages/canon/src/components/Container/Docs.mdx index 733dbae637..d4dcf694da 100644 --- a/packages/canon/src/components/Container/Docs.mdx +++ b/packages/canon/src/components/Container/Docs.mdx @@ -1,7 +1,6 @@ import { Meta, Unstyled, Source } from '@storybook/blocks'; import * as ContainerStories from './Container.stories'; -import { Title, Text } from '../../../docs/components'; -import { PropsTable, getBoxProps } from '../../../docs/components/PropsTable'; +import { Title, Text, PropsTable, getProps } from '../../../docs/components'; import { spacingProperties } from '../../layout/sprinkles.css'; import { containerProperties } from './sprinkles.css'; @@ -29,7 +28,7 @@ import { containerProperties } from './sprinkles.css'; @@ -71,7 +70,7 @@ export default () => ( The grid component also accepts all the spacing props from the Box component. - + Grid Item diff --git a/packages/canon/src/components/Icon/Icon.tsx b/packages/canon/src/components/Icon/Icon.tsx index d7891c23cf..587e3c0a23 100644 --- a/packages/canon/src/components/Icon/Icon.tsx +++ b/packages/canon/src/components/Icon/Icon.tsx @@ -19,15 +19,16 @@ import { useTheme } from '../../theme/context'; import type { IconNames } from './types'; /** @public */ -export const Icon = ({ name }: { name: IconNames }) => { +export const Icon = (props: { name: IconNames; size?: number }) => { + const { name, size = 16 } = props; const { icons } = useTheme(); - const RemixIcon = icons[name]; + const RemixIcon = icons[name] as React.ComponentType<{ className?: string }>; if (!RemixIcon) { - console.error(`Icon "${name}" not found.`); - return ; // Return default icon perhaps? + console.error(`Icon "${name}" not found or is not a valid component.`); + return ; // Return a default icon or handle the error appropriately } - return ; + return ; }; diff --git a/packages/canon/src/components/Icon/icons.ts b/packages/canon/src/components/Icon/icons.ts index 7fe2bf0056..ff5cd9a507 100644 --- a/packages/canon/src/components/Icon/icons.ts +++ b/packages/canon/src/components/Icon/icons.ts @@ -34,6 +34,7 @@ import { RiArrowLeftCircleLine, RiArrowRightCircleLine, RiArrowUpCircleLine, + RiCheckLine, } from '@remixicon/react'; // List of default icons @@ -46,6 +47,7 @@ export const defaultIcons: IconMap = { arrowLeftCircle: RiArrowLeftCircleLine, arrowRightCircle: RiArrowRightCircleLine, arrowUpCircle: RiArrowUpCircleLine, + check: RiCheckLine, chevronDown: RiArrowDownSLine, chevronUp: RiArrowUpSLine, chevronLeft: RiArrowLeftSLine, diff --git a/packages/canon/src/components/Box/box.css.ts b/packages/canon/src/components/Icon/styles.css similarity index 79% rename from packages/canon/src/components/Box/box.css.ts rename to packages/canon/src/components/Icon/styles.css index a3e49162fd..234105ed4e 100644 --- a/packages/canon/src/components/Box/box.css.ts +++ b/packages/canon/src/components/Icon/styles.css @@ -14,9 +14,17 @@ * limitations under the License. */ -import { style } from '@vanilla-extract/css'; +.icon-12 { + width: 12px; + height: 12px; +} -export const base = style({ - fontFamily: 'var(--canon-font-regular)', - color: 'var(--canon-text-primary)', -}); +.icon-16 { + width: 16px; + height: 16px; +} + +.icon-24 { + width: 24px; + height: 24px; +} diff --git a/packages/canon/src/components/Icon/types.ts b/packages/canon/src/components/Icon/types.ts index d60eaca020..bac853257b 100644 --- a/packages/canon/src/components/Icon/types.ts +++ b/packages/canon/src/components/Icon/types.ts @@ -24,6 +24,7 @@ export type IconNames = | 'arrowLeftCircle' | 'arrowRightCircle' | 'arrowUpCircle' + | 'check' | 'chevronDown' | 'chevronLeft' | 'chevronRight' diff --git a/packages/canon/src/components/Inline/Docs.mdx b/packages/canon/src/components/Inline/Docs.mdx index 0469ff0860..9850dedf7a 100644 --- a/packages/canon/src/components/Inline/Docs.mdx +++ b/packages/canon/src/components/Inline/Docs.mdx @@ -1,7 +1,6 @@ import { Meta, Unstyled, Source } from '@storybook/blocks'; import * as InlineStories from './Inline.stories'; -import { Title, Text } from '../../../docs/components'; -import { PropsTable, getBoxProps } from '../../../docs/components/PropsTable'; +import { Title, Text, PropsTable, getProps } from '../../../docs/components'; import { spacingProperties } from '../../layout/sprinkles.css'; import { inlineProperties } from './sprinkles.css'; @@ -57,7 +56,7 @@ import { inlineProperties } from './sprinkles.css'; The grid component also accepts all the spacing props from the Box component. - + Examples diff --git a/packages/canon/src/components/Stack/Docs.mdx b/packages/canon/src/components/Stack/Docs.mdx index 5ec864937b..d5bdb0fc82 100644 --- a/packages/canon/src/components/Stack/Docs.mdx +++ b/packages/canon/src/components/Stack/Docs.mdx @@ -1,7 +1,6 @@ import { Meta, Unstyled, Source } from '@storybook/blocks'; import * as StackStories from './Stack.stories'; -import { Title, Text } from '../../../docs/components'; -import { PropsTable, getBoxProps } from '../../../docs/components/PropsTable'; +import { Title, Text, PropsTable, getProps } from '../../../docs/components'; import { spacingProperties } from '../../layout/sprinkles.css'; @@ -52,7 +51,7 @@ import { spacingProperties } from '../../layout/sprinkles.css'; The grid component also accepts all the spacing props from the Box component. - + Common questions diff --git a/packages/canon/src/index.ts b/packages/canon/src/index.ts index 6497be2945..5d0ebb5a2e 100644 --- a/packages/canon/src/index.ts +++ b/packages/canon/src/index.ts @@ -33,3 +33,4 @@ export * from './components/Container'; // UI components export * from './components/Button'; export * from './components/Icon'; +export * from './components/Checkbox'; diff --git a/packages/canon/src/theme/styles.css b/packages/canon/src/theme/styles.css index ad2433ef74..8cb74374c6 100644 --- a/packages/canon/src/theme/styles.css +++ b/packages/canon/src/theme/styles.css @@ -27,3 +27,5 @@ @import '../components/Inline/styles.css'; @import '../components/Grid/styles.css'; @import '../components/Container/styles.css'; +@import '../components/Icon/styles.css'; +@import '../components/Checkbox/styles.css'; diff --git a/packages/catalog-client/CHANGELOG.md b/packages/catalog-client/CHANGELOG.md index cdf5e80818..e9e525a0e1 100644 --- a/packages/catalog-client/CHANGELOG.md +++ b/packages/catalog-client/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/catalog-client +## 1.9.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + ## 1.9.0-next.1 ### Minor Changes diff --git a/packages/catalog-client/package.json b/packages/catalog-client/package.json index db66b541c7..8e16a4bf91 100644 --- a/packages/catalog-client/package.json +++ b/packages/catalog-client/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/catalog-client", - "version": "1.9.0-next.1", + "version": "1.9.0-next.2", "description": "An isomorphic client for the catalog backend", "backstage": { "role": "common-library" diff --git a/packages/catalog-model/CHANGELOG.md b/packages/catalog-model/CHANGELOG.md index b9e7addea6..1e5d752f2f 100644 --- a/packages/catalog-model/CHANGELOG.md +++ b/packages/catalog-model/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/catalog-model +## 1.7.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/types@1.2.0 + ## 1.7.1 ### Patch Changes diff --git a/packages/catalog-model/package.json b/packages/catalog-model/package.json index 61a3159ed2..97ebc54888 100644 --- a/packages/catalog-model/package.json +++ b/packages/catalog-model/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/catalog-model", - "version": "1.7.1", + "version": "1.7.2-next.0", "description": "Types and validators that help describe the model of a Backstage Catalog", "backstage": { "role": "common-library" diff --git a/packages/cli-node/CHANGELOG.md b/packages/cli-node/CHANGELOG.md index 5cbe2cb6e2..129564d605 100644 --- a/packages/cli-node/CHANGELOG.md +++ b/packages/cli-node/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/cli-node +## 0.2.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/types@1.2.0 + ## 0.2.11-next.0 ### Patch Changes diff --git a/packages/cli-node/package.json b/packages/cli-node/package.json index 01538d2e61..1aa460550d 100644 --- a/packages/cli-node/package.json +++ b/packages/cli-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli-node", - "version": "0.2.11-next.0", + "version": "0.2.11-next.1", "description": "Node.js library for Backstage CLIs", "backstage": { "role": "node-library" diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 5fae59d357..f8dd593d52 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/cli +## 0.29.3-next.2 + +### Patch Changes + +- 62a9062: Updated dependency `@module-federation/enhanced` to `^0.8.0`. +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/cli-node@0.2.11-next.1 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/eslint-plugin@0.1.10 + - @backstage/integration@1.16.0-next.1 + - @backstage/release-manifests@0.0.12-next.1 + - @backstage/types@1.2.0 + ## 0.29.3-next.1 ### Patch Changes diff --git a/packages/cli/config/nodeTransform.cjs b/packages/cli/config/nodeTransform.cjs index fc25044fd0..1cf79cb1bb 100644 --- a/packages/cli/config/nodeTransform.cjs +++ b/packages/cli/config/nodeTransform.cjs @@ -41,7 +41,7 @@ if (process.env.BACKSTAGE_CLI_LINKED_WORKSPACE) { } // The package import that we're overriding will always existing in the root - // node_modules of the linked workspace, so it's enough to override the the + // node_modules of the linked workspace, so it's enough to override the // parent paths with that single entry return origLoad.call(this, request, { ...parent, diff --git a/packages/cli/package.json b/packages/cli/package.json index bb338388a3..9d93f6007b 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli", - "version": "0.29.3-next.1", + "version": "0.29.3-next.2", "description": "CLI for developing Backstage plugins and apps", "backstage": { "role": "cli" @@ -53,7 +53,7 @@ "@backstage/release-manifests": "workspace:^", "@backstage/types": "workspace:^", "@manypkg/get-packages": "^1.1.3", - "@module-federation/enhanced": "^0.7.0", + "@module-federation/enhanced": "^0.8.0", "@octokit/graphql": "^5.0.0", "@octokit/graphql-schema": "^13.7.0", "@octokit/oauth-app": "^4.2.0", @@ -88,7 +88,7 @@ "commander": "^12.0.0", "cross-fetch": "^4.0.0", "cross-spawn": "^7.0.3", - "css-loader": "^7.0.0", + "css-loader": "^6.5.1", "ctrlc-windows": "^2.1.0", "esbuild": "^0.24.0", "esbuild-loader": "^4.0.0", diff --git a/packages/config-loader/CHANGELOG.md b/packages/config-loader/CHANGELOG.md index 8f3bb87bce..15548ca9d7 100644 --- a/packages/config-loader/CHANGELOG.md +++ b/packages/config-loader/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/config-loader +## 1.9.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + ## 1.9.3-next.0 ### Patch Changes diff --git a/packages/config-loader/package.json b/packages/config-loader/package.json index 336df8b1c0..3359e285d9 100644 --- a/packages/config-loader/package.json +++ b/packages/config-loader/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/config-loader", - "version": "1.9.3-next.0", + "version": "1.9.3-next.1", "description": "Config loading functionality used by Backstage backend, and CLI", "backstage": { "role": "node-library" diff --git a/packages/config-loader/src/sources/types.ts b/packages/config-loader/src/sources/types.ts index abdf2f5c8e..fedce213c5 100644 --- a/packages/config-loader/src/sources/types.ts +++ b/packages/config-loader/src/sources/types.ts @@ -39,7 +39,7 @@ export interface ReadConfigDataOptions { } /** - * The the generator returned by {@link ConfigSource.readConfigData}. + * The generator returned by {@link ConfigSource.readConfigData}. * * @public */ diff --git a/packages/config/CHANGELOG.md b/packages/config/CHANGELOG.md index e7ed06f626..f4f0429f8e 100644 --- a/packages/config/CHANGELOG.md +++ b/packages/config/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/config +## 1.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/types@1.2.0 + ## 1.3.0 ### Minor Changes diff --git a/packages/config/package.json b/packages/config/package.json index b3130dcab5..79a2dfe980 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/config", - "version": "1.3.0", + "version": "1.3.1-next.0", "description": "Config API used by Backstage core, backend, and CLI", "backstage": { "role": "common-library" diff --git a/packages/core-app-api/CHANGELOG.md b/packages/core-app-api/CHANGELOG.md index ecb3781525..995d8140f7 100644 --- a/packages/core-app-api/CHANGELOG.md +++ b/packages/core-app-api/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/core-app-api +## 1.15.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1-next.0 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + ## 1.15.3-next.0 ### Patch Changes diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json index a7b64e5218..92bf422050 100644 --- a/packages/core-app-api/package.json +++ b/packages/core-app-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/core-app-api", - "version": "1.15.3-next.0", + "version": "1.15.3-next.1", "description": "Core app API used by Backstage apps", "backstage": { "role": "web-library" diff --git a/packages/core-app-api/src/apis/implementations/DiscoveryApi/UrlPatternDiscovery.ts b/packages/core-app-api/src/apis/implementations/DiscoveryApi/UrlPatternDiscovery.ts index 58ffc9441b..37b50bdcbb 100644 --- a/packages/core-app-api/src/apis/implementations/DiscoveryApi/UrlPatternDiscovery.ts +++ b/packages/core-app-api/src/apis/implementations/DiscoveryApi/UrlPatternDiscovery.ts @@ -26,7 +26,7 @@ const ERROR_PREFIX = 'Invalid discovery URL pattern,'; */ export class UrlPatternDiscovery implements DiscoveryApi { /** - * Creates a new UrlPatternDiscovery given a template. The the only + * Creates a new UrlPatternDiscovery given a template. The only * interpolation done for the template is to replace instances of `{{pluginId}}` * with the ID of the plugin being requested. * diff --git a/packages/core-compat-api/CHANGELOG.md b/packages/core-compat-api/CHANGELOG.md index bcb2a1828c..e8fd9439d0 100644 --- a/packages/core-compat-api/CHANGELOG.md +++ b/packages/core-compat-api/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/core-compat-api +## 0.3.4-next.2 + +### Patch Changes + +- 1f30730: Updated dependency `@oriflame/backstage-plugin-score-card` to `^0.9.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/version-bridge@1.0.10 + ## 0.3.4-next.1 ### Patch Changes diff --git a/packages/core-compat-api/package.json b/packages/core-compat-api/package.json index 101484b70b..83d0d2ee51 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.3.4-next.1", + "version": "0.3.4-next.2", "backstage": { "role": "web-library" }, @@ -46,7 +46,7 @@ "@backstage/plugin-catalog": "workspace:^", "@backstage/test-utils": "workspace:^", "@backstage/types": "workspace:^", - "@oriflame/backstage-plugin-score-card": "^0.8.0", + "@oriflame/backstage-plugin-score-card": "^0.9.0", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md index 7650f9b2b5..37c3b72d7e 100644 --- a/packages/core-components/CHANGELOG.md +++ b/packages/core-components/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/core-components +## 0.16.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/theme@0.6.3-next.0 + - @backstage/version-bridge@1.0.10 + ## 0.16.2-next.1 ### Patch Changes diff --git a/packages/core-components/package.json b/packages/core-components/package.json index ec9fd07e76..6405e49836 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/core-components", - "version": "0.16.2-next.1", + "version": "0.16.2-next.2", "description": "Core components used by Backstage plugins and apps", "backstage": { "role": "web-library" diff --git a/packages/core-components/src/components/TrendLine/TrendLine.test.tsx b/packages/core-components/src/components/TrendLine/TrendLine.test.tsx index 0d98c2dfdc..3cb54875c5 100644 --- a/packages/core-components/src/components/TrendLine/TrendLine.test.tsx +++ b/packages/core-components/src/components/TrendLine/TrendLine.test.tsx @@ -43,14 +43,14 @@ describe('TrendLine', () => { }); }); - describe.skip('when the data finishes within the the warning threshold', () => { + describe.skip('when the data finishes within the warning threshold', () => { it('renders with the correct color', async () => { await renderInTestApp(); expect(screen.getByTitle('sparkline')).toBeInTheDocument(); }); }); - describe.skip('when the data finishes within the the error threshold', () => { + describe.skip('when the data finishes within the error threshold', () => { it('renders with the correct color', async () => { await renderInTestApp(); expect(screen.getByTitle('sparkline')).toBeInTheDocument(); diff --git a/packages/core-plugin-api/CHANGELOG.md b/packages/core-plugin-api/CHANGELOG.md index 2ddb6333c7..c74fe35878 100644 --- a/packages/core-plugin-api/CHANGELOG.md +++ b/packages/core-plugin-api/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/core-plugin-api +## 1.10.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + ## 1.10.1 ### Patch Changes diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json index 176f6014b6..717b7d7150 100644 --- a/packages/core-plugin-api/package.json +++ b/packages/core-plugin-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/core-plugin-api", - "version": "1.10.1", + "version": "1.10.2-next.0", "description": "Core API used by Backstage plugins", "backstage": { "role": "web-library" diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index ce9aa221b0..6fc8da6e3e 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/create-app +## 0.5.23-next.2 + +### Patch Changes + +- e913fdf: Add github backend module to create-app and improve error messages +- Updated dependencies + - @backstage/cli-common@0.1.15 + ## 0.5.23-next.1 ### Patch Changes diff --git a/packages/create-app/package.json b/packages/create-app/package.json index c852cadb7f..b3dbd768cc 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/create-app", - "version": "0.5.23-next.1", + "version": "0.5.23-next.2", "description": "A CLI that helps you create your own Backstage app", "backstage": { "role": "cli" diff --git a/packages/create-app/src/lib/tasks.test.ts b/packages/create-app/src/lib/tasks.test.ts index 27c5765a12..3d5240977e 100644 --- a/packages/create-app/src/lib/tasks.test.ts +++ b/packages/create-app/src/lib/tasks.test.ts @@ -91,6 +91,7 @@ jest.mock('./versions', () => ({ '@backstage/plugin-kubernetes-backend': '1.0.0', '@backstage/plugin-org': '1.0.0', '@backstage/plugin-scaffolder': '1.0.0', + '@backstage/plugin-scaffolder-backend-module-github': '1.0.0', '@backstage/plugin-permission-react': '1.0.0', '@backstage/plugin-search': '1.0.0', '@backstage/plugin-search-react': '1.0.0', diff --git a/packages/create-app/src/lib/versions.ts b/packages/create-app/src/lib/versions.ts index 9a7158ea55..d06912cca3 100644 --- a/packages/create-app/src/lib/versions.ts +++ b/packages/create-app/src/lib/versions.ts @@ -72,6 +72,7 @@ import { version as pluginPermissionNode } from '../../../../plugins/permission- import { version as pluginProxyBackend } from '../../../../plugins/proxy-backend/package.json'; import { version as pluginScaffolder } from '../../../../plugins/scaffolder/package.json'; import { version as pluginScaffolderBackend } from '../../../../plugins/scaffolder-backend/package.json'; +import { version as pluginScaffolderBackendModuleGithub } from '../../../../plugins/scaffolder-backend-module-github/package.json'; import { version as pluginSearch } from '../../../../plugins/search/package.json'; import { version as pluginSearchReact } from '../../../../plugins/search-react/package.json'; import { version as pluginSearchBackend } from '../../../../plugins/search-backend/package.json'; @@ -130,6 +131,8 @@ export const packageVersions = { '@backstage/plugin-proxy-backend': pluginProxyBackend, '@backstage/plugin-scaffolder': pluginScaffolder, '@backstage/plugin-scaffolder-backend': pluginScaffolderBackend, + '@backstage/plugin-scaffolder-backend-module-github': + pluginScaffolderBackendModuleGithub, '@backstage/plugin-search': pluginSearch, '@backstage/plugin-search-react': pluginSearchReact, '@backstage/plugin-search-backend': pluginSearchBackend, diff --git a/packages/create-app/templates/default-app/packages/backend/package.json.hbs b/packages/create-app/templates/default-app/packages/backend/package.json.hbs index bb05beddaa..42afefd3b8 100644 --- a/packages/create-app/templates/default-app/packages/backend/package.json.hbs +++ b/packages/create-app/templates/default-app/packages/backend/package.json.hbs @@ -33,6 +33,7 @@ "@backstage/plugin-permission-node": "^{{version '@backstage/plugin-permission-node'}}", "@backstage/plugin-proxy-backend": "^{{version '@backstage/plugin-proxy-backend'}}", "@backstage/plugin-scaffolder-backend": "^{{version '@backstage/plugin-scaffolder-backend'}}", + "@backstage/plugin-scaffolder-backend-module-github": "^{{version '@backstage/plugin-scaffolder-backend-module-github'}}", "@backstage/plugin-search-backend": "^{{version '@backstage/plugin-search-backend'}}", "@backstage/plugin-search-backend-module-catalog": "^{{version '@backstage/plugin-search-backend-module-catalog'}}", "@backstage/plugin-search-backend-module-pg": "^{{version '@backstage/plugin-search-backend-module-pg'}}", diff --git a/packages/create-app/templates/default-app/packages/backend/src/index.ts b/packages/create-app/templates/default-app/packages/backend/src/index.ts index 69a73511c6..6d0a6f4ca5 100644 --- a/packages/create-app/templates/default-app/packages/backend/src/index.ts +++ b/packages/create-app/templates/default-app/packages/backend/src/index.ts @@ -13,6 +13,7 @@ const backend = createBackend(); backend.add(import('@backstage/plugin-app-backend')); backend.add(import('@backstage/plugin-proxy-backend')); backend.add(import('@backstage/plugin-scaffolder-backend')); +backend.add(import('@backstage/plugin-scaffolder-backend-module-github')); backend.add(import('@backstage/plugin-techdocs-backend')); // auth plugin diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md index d97bb0c44b..e6cd7eeb73 100644 --- a/packages/dev-utils/CHANGELOG.md +++ b/packages/dev-utils/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/dev-utils +## 1.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/app-defaults@1.5.15-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/theme@0.6.3-next.0 + ## 1.1.5-next.1 ### Patch Changes diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index ef1b92b954..c4aef9fd83 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/dev-utils", - "version": "1.1.5-next.1", + "version": "1.1.5-next.2", "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 90c72dfdef..4feec740ca 100644 --- a/packages/e2e-test/CHANGELOG.md +++ b/packages/e2e-test/CHANGELOG.md @@ -1,5 +1,14 @@ # e2e-test +## 0.2.23-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.23-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/cli-common@0.1.15 + ## 0.2.23-next.1 ### Patch Changes diff --git a/packages/e2e-test/package.json b/packages/e2e-test/package.json index c3c5457405..ca2f005a31 100644 --- a/packages/e2e-test/package.json +++ b/packages/e2e-test/package.json @@ -1,6 +1,6 @@ { "name": "e2e-test", - "version": "0.2.23-next.1", + "version": "0.2.23-next.2", "description": "E2E test for verifying Backstage packages", "backstage": { "role": "cli" diff --git a/packages/errors/CHANGELOG.md b/packages/errors/CHANGELOG.md index f1a0ec7a5d..33204aae4c 100644 --- a/packages/errors/CHANGELOG.md +++ b/packages/errors/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/errors +## 1.2.6-next.0 + +### Patch Changes + +- 1d4b5b9: Trim `error.cause.stack` in addition to `error.stack` when trimming stack traces from serialized errors. +- Updated dependencies + - @backstage/types@1.2.0 + ## 1.2.5 ### Patch Changes diff --git a/packages/errors/package.json b/packages/errors/package.json index 45ec6d3816..fa2a600085 100644 --- a/packages/errors/package.json +++ b/packages/errors/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/errors", - "version": "1.2.5", + "version": "1.2.6-next.0", "description": "Common utilities for error handling within Backstage", "backstage": { "role": "common-library" diff --git a/packages/frontend-app-api/CHANGELOG.md b/packages/frontend-app-api/CHANGELOG.md index c4a5354119..9751a9845c 100644 --- a/packages/frontend-app-api/CHANGELOG.md +++ b/packages/frontend-app-api/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/frontend-app-api +## 0.10.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-defaults@0.1.4-next.2 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + ## 0.10.3-next.1 ### Patch Changes diff --git a/packages/frontend-app-api/package.json b/packages/frontend-app-api/package.json index a75dd2b09d..8f2215962c 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.10.3-next.1", + "version": "0.10.3-next.2", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-defaults/CHANGELOG.md b/packages/frontend-defaults/CHANGELOG.md index 7601acc7e0..7bc7e229ec 100644 --- a/packages/frontend-defaults/CHANGELOG.md +++ b/packages/frontend-defaults/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/frontend-defaults +## 0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/frontend-app-api@0.10.3-next.2 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/plugin-app@0.1.4-next.2 + ## 0.1.4-next.1 ### Patch Changes diff --git a/packages/frontend-defaults/package.json b/packages/frontend-defaults/package.json index f8c63c5afb..2d6c1a7a86 100644 --- a/packages/frontend-defaults/package.json +++ b/packages/frontend-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-defaults", - "version": "0.1.4-next.1", + "version": "0.1.4-next.2", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-internal/CHANGELOG.md b/packages/frontend-internal/CHANGELOG.md index c3cbeb7b76..0ac6c8558e 100644 --- a/packages/frontend-internal/CHANGELOG.md +++ b/packages/frontend-internal/CHANGELOG.md @@ -1,5 +1,14 @@ # @internal/frontend +## 0.0.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + ## 0.0.4-next.1 ### Patch Changes diff --git a/packages/frontend-internal/package.json b/packages/frontend-internal/package.json index 817e8f0812..bbe8e3df17 100644 --- a/packages/frontend-internal/package.json +++ b/packages/frontend-internal/package.json @@ -1,6 +1,6 @@ { "name": "@internal/frontend", - "version": "0.0.4-next.1", + "version": "0.0.4-next.2", "backstage": { "role": "web-library", "inline": true diff --git a/packages/frontend-plugin-api/CHANGELOG.md b/packages/frontend-plugin-api/CHANGELOG.md index b5471f63d6..9aacfe0485 100644 --- a/packages/frontend-plugin-api/CHANGELOG.md +++ b/packages/frontend-plugin-api/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/frontend-plugin-api +## 0.9.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + ## 0.9.3-next.1 ### Patch Changes diff --git a/packages/frontend-plugin-api/package.json b/packages/frontend-plugin-api/package.json index 74822f2b91..c2a9fd8d8b 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.9.3-next.1", + "version": "0.9.3-next.2", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-plugin-api/src/blueprints/PageBlueprint.test.tsx b/packages/frontend-plugin-api/src/blueprints/PageBlueprint.test.tsx index de1cbe211e..4d0b4f37a7 100644 --- a/packages/frontend-plugin-api/src/blueprints/PageBlueprint.test.tsx +++ b/packages/frontend-plugin-api/src/blueprints/PageBlueprint.test.tsx @@ -98,7 +98,7 @@ describe('PageBlueprint', () => { const tester = createExtensionTester(myPage); - // TODO(blam): test for the routePath output doesn't work, due to the the way the test harness works + // TODO(blam): test for the routePath output doesn't work, due to the way the test harness works // expect(tester.data(coreExtensionData.routePath)).toBe('/test'); expect(tester.get(coreExtensionData.routeRef)).toBe(mockRouteRef); diff --git a/packages/frontend-test-utils/CHANGELOG.md b/packages/frontend-test-utils/CHANGELOG.md index 29ad36435e..40d8e62884 100644 --- a/packages/frontend-test-utils/CHANGELOG.md +++ b/packages/frontend-test-utils/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/frontend-test-utils +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1-next.0 + - @backstage/frontend-app-api@0.10.3-next.2 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/test-utils@1.7.3-next.1 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-app@0.1.4-next.2 + ## 0.2.4-next.1 ### Patch Changes diff --git a/packages/frontend-test-utils/package.json b/packages/frontend-test-utils/package.json index 793d67b500..8a13dda074 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.2.4-next.1", + "version": "0.2.4-next.2", "backstage": { "role": "web-library" }, diff --git a/packages/integration-aws-node/CHANGELOG.md b/packages/integration-aws-node/CHANGELOG.md index 26f65cf239..66d93b93c1 100644 --- a/packages/integration-aws-node/CHANGELOG.md +++ b/packages/integration-aws-node/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/integration-aws-node +## 0.1.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + ## 0.1.13 ### Patch Changes diff --git a/packages/integration-aws-node/package.json b/packages/integration-aws-node/package.json index a75ace7986..e1fbcf6fac 100644 --- a/packages/integration-aws-node/package.json +++ b/packages/integration-aws-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/integration-aws-node", - "version": "0.1.13", + "version": "0.1.14-next.0", "description": "Helpers for fetching AWS account credentials", "backstage": { "role": "node-library" diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md index e447dd21af..57698d9a0f 100644 --- a/packages/integration-react/CHANGELOG.md +++ b/packages/integration-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/integration-react +## 1.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1-next.0 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/integration@1.16.0-next.1 + ## 1.2.2-next.0 ### Patch Changes diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index 052f84a736..b1c8ff60f9 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/integration-react", - "version": "1.2.2-next.0", + "version": "1.2.2-next.1", "description": "Frontend package for managing integrations towards external systems", "backstage": { "role": "web-library" diff --git a/packages/integration/CHANGELOG.md b/packages/integration/CHANGELOG.md index 6c09d51df5..8af904036e 100644 --- a/packages/integration/CHANGELOG.md +++ b/packages/integration/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/integration +## 1.16.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + ## 1.16.0-next.0 ### Minor Changes diff --git a/packages/integration/package.json b/packages/integration/package.json index 4fddb1bdbb..9b09adaf1b 100644 --- a/packages/integration/package.json +++ b/packages/integration/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/integration", - "version": "1.16.0-next.0", + "version": "1.16.0-next.1", "description": "Helpers for managing integrations towards external systems", "backstage": { "role": "common-library" diff --git a/packages/repo-tools/CHANGELOG.md b/packages/repo-tools/CHANGELOG.md index eb44b2ac4c..8756efb2d9 100644 --- a/packages/repo-tools/CHANGELOG.md +++ b/packages/repo-tools/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/repo-tools +## 0.12.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/cli-node@0.2.11-next.1 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/cli-common@0.1.15 + ## 0.12.0-next.1 ### Patch Changes diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json index 03995ad421..c42a49109e 100644 --- a/packages/repo-tools/package.json +++ b/packages/repo-tools/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/repo-tools", - "version": "0.12.0-next.1", + "version": "0.12.0-next.2", "description": "CLI for Backstage repo tooling ", "backstage": { "role": "cli" diff --git a/packages/scaffolder-internal/CHANGELOG.md b/packages/scaffolder-internal/CHANGELOG.md index 18c4056a71..8a2df052a6 100644 --- a/packages/scaffolder-internal/CHANGELOG.md +++ b/packages/scaffolder-internal/CHANGELOG.md @@ -1,5 +1,13 @@ # @internal/scaffolder +## 0.0.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.14.2-next.2 + - @backstage/frontend-plugin-api@0.9.3-next.2 + ## 0.0.4-next.1 ### Patch Changes diff --git a/packages/scaffolder-internal/package.json b/packages/scaffolder-internal/package.json index 23bdc9caf8..cf458bd536 100644 --- a/packages/scaffolder-internal/package.json +++ b/packages/scaffolder-internal/package.json @@ -1,6 +1,6 @@ { "name": "@internal/scaffolder", - "version": "0.0.4-next.1", + "version": "0.0.4-next.2", "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 6b696824ef..bee2276582 100644 --- a/packages/techdocs-cli-embedded-app/CHANGELOG.md +++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md @@ -1,5 +1,24 @@ # techdocs-cli-embedded-app +## 0.2.103-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.26.0-next.2 + - @backstage/cli@0.29.3-next.2 + - @backstage/app-defaults@1.5.15-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/test-utils@1.7.3-next.1 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-techdocs@1.11.3-next.2 + - @backstage/plugin-techdocs-react@1.2.12-next.2 + ## 0.2.103-next.1 ### Patch Changes diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index 3cb71cd2c8..5d3add528a 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.103-next.1", + "version": "0.2.103-next.2", "backstage": { "role": "frontend" }, diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md index dd5a85ad53..95b03dab88 100644 --- a/packages/techdocs-cli/CHANGELOG.md +++ b/packages/techdocs-cli/CHANGELOG.md @@ -1,5 +1,16 @@ # @techdocs/cli +## 1.8.24-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/plugin-techdocs-node@1.12.15-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + ## 1.8.24-next.1 ### Patch Changes diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index e61fbd5c84..da16a96f22 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -1,6 +1,6 @@ { "name": "@techdocs/cli", - "version": "1.8.24-next.1", + "version": "1.8.24-next.2", "description": "Utility CLI for managing TechDocs sites in Backstage.", "backstage": { "role": "cli" diff --git a/packages/test-utils/CHANGELOG.md b/packages/test-utils/CHANGELOG.md index 617abaa71a..acce745e15 100644 --- a/packages/test-utils/CHANGELOG.md +++ b/packages/test-utils/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/test-utils +## 1.7.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/theme@0.6.3-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + ## 1.7.3-next.0 ### Patch Changes diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 0b9bd1ea92..dc3a688026 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/test-utils", - "version": "1.7.3-next.0", + "version": "1.7.3-next.1", "description": "Utilities to test Backstage plugins and apps.", "backstage": { "role": "web-library" diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md index 406eba89a4..bf6ed35b30 100644 --- a/plugins/api-docs/CHANGELOG.md +++ b/plugins/api-docs/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-api-docs +## 0.12.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.26.0-next.2 + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + ## 0.12.2-next.1 ### Patch Changes diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index 30b73fc398..b4372097f2 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.2-next.1", + "version": "0.12.2-next.2", "description": "A Backstage plugin that helps represent API entities in the frontend", "backstage": { "role": "frontend-plugin", diff --git a/plugins/app-backend/CHANGELOG.md b/plugins/app-backend/CHANGELOG.md index df45b6dd06..03c8163960 100644 --- a/plugins/app-backend/CHANGELOG.md +++ b/plugins/app-backend/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-app-backend +## 0.4.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-app-node@0.1.28-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + ## 0.4.3-next.1 ### Patch Changes diff --git a/plugins/app-backend/package.json b/plugins/app-backend/package.json index 0743eac013..a0faf2154c 100644 --- a/plugins/app-backend/package.json +++ b/plugins/app-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app-backend", - "version": "0.4.3-next.1", + "version": "0.4.3-next.2", "description": "A Backstage backend plugin that serves the Backstage frontend app", "backstage": { "role": "backend-plugin", diff --git a/plugins/app-node/CHANGELOG.md b/plugins/app-node/CHANGELOG.md index 6b2aae8034..2490d02552 100644 --- a/plugins/app-node/CHANGELOG.md +++ b/plugins/app-node/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-app-node +## 0.1.28-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/config-loader@1.9.3-next.1 + ## 0.1.28-next.1 ### Patch Changes diff --git a/plugins/app-node/package.json b/plugins/app-node/package.json index 4cc057a1d2..1abd101c09 100644 --- a/plugins/app-node/package.json +++ b/plugins/app-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app-node", - "version": "0.1.28-next.1", + "version": "0.1.28-next.2", "description": "Node.js library for the app plugin", "backstage": { "role": "node-library", diff --git a/plugins/app-visualizer/CHANGELOG.md b/plugins/app-visualizer/CHANGELOG.md index 386f022eaa..73487d2f2d 100644 --- a/plugins/app-visualizer/CHANGELOG.md +++ b/plugins/app-visualizer/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-app-visualizer +## 0.1.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + ## 0.1.14-next.1 ### Patch Changes diff --git a/plugins/app-visualizer/package.json b/plugins/app-visualizer/package.json index 5d919d8749..fd2297bd2f 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.14-next.1", + "version": "0.1.14-next.2", "description": "Visualizes the Backstage app structure", "backstage": { "role": "frontend-plugin", diff --git a/plugins/app/CHANGELOG.md b/plugins/app/CHANGELOG.md index d49f7a8304..b7a68b9fe1 100644 --- a/plugins/app/CHANGELOG.md +++ b/plugins/app/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-app +## 0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + ## 0.1.4-next.1 ### Patch Changes diff --git a/plugins/app/package.json b/plugins/app/package.json index e4f4cb333d..a67314e518 100644 --- a/plugins/app/package.json +++ b/plugins/app/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app", - "version": "0.1.4-next.1", + "version": "0.1.4-next.2", "backstage": { "role": "frontend-plugin", "pluginId": "app", diff --git a/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md b/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md index 45adec8243..3990ad28bc 100644 --- a/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-atlassian-provider +## 0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.3.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-atlassian-provider/package.json b/plugins/auth-backend-module-atlassian-provider/package.json index 34c477e1ee..42f9da9113 100644 --- a/plugins/auth-backend-module-atlassian-provider/package.json +++ b/plugins/auth-backend-module-atlassian-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-atlassian-provider", - "version": "0.3.3-next.1", + "version": "0.3.3-next.2", "description": "The atlassian-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-auth0-provider/CHANGELOG.md b/plugins/auth-backend-module-auth0-provider/CHANGELOG.md index bd72623c32..884a10bdf9 100644 --- a/plugins/auth-backend-module-auth0-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-auth0-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-auth0-provider +## 0.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.1.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-auth0-provider/package.json b/plugins/auth-backend-module-auth0-provider/package.json index ad857a3ddb..43f5d6cfd1 100644 --- a/plugins/auth-backend-module-auth0-provider/package.json +++ b/plugins/auth-backend-module-auth0-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-auth0-provider", - "version": "0.1.3-next.1", + "version": "0.1.3-next.2", "description": "The auth0-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md b/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md index bab6b48dab..ed6fca9fb3 100644 --- a/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-auth-backend-module-aws-alb-provider +## 0.3.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-backend@0.24.1-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.3.1-next.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 9c051165d7..4f513dc904 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.3.1-next.1", + "version": "0.3.1-next.2", "description": "The aws-alb provider module for the Backstage auth backend.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-azure-easyauth-provider/CHANGELOG.md b/plugins/auth-backend-module-azure-easyauth-provider/CHANGELOG.md index 7808d77a28..cdc6c21097 100644 --- a/plugins/auth-backend-module-azure-easyauth-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-azure-easyauth-provider/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-auth-backend-module-azure-easyauth-provider +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/catalog-model@1.7.2-next.0 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-azure-easyauth-provider/package.json b/plugins/auth-backend-module-azure-easyauth-provider/package.json index c521b33435..159ced3d65 100644 --- a/plugins/auth-backend-module-azure-easyauth-provider/package.json +++ b/plugins/auth-backend-module-azure-easyauth-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-azure-easyauth-provider", - "version": "0.2.3-next.1", + "version": "0.2.3-next.2", "description": "The azure-easyauth-provider backend module for the auth plugin.", "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 1111537aa4..9742024bea 100644 --- a/plugins/auth-backend-module-bitbucket-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-bitbucket-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-bitbucket-provider +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-bitbucket-provider/package.json b/plugins/auth-backend-module-bitbucket-provider/package.json index ded19e9238..8134785461 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.2.3-next.1", + "version": "0.2.3-next.2", "description": "The bitbucket-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-bitbucket-server-provider/CHANGELOG.md b/plugins/auth-backend-module-bitbucket-server-provider/CHANGELOG.md index 687583ebf0..b494d0f98b 100644 --- a/plugins/auth-backend-module-bitbucket-server-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-bitbucket-server-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-bitbucket-server-provider +## 0.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.1.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-bitbucket-server-provider/package.json b/plugins/auth-backend-module-bitbucket-server-provider/package.json index 589e4fa91c..306c931bda 100644 --- a/plugins/auth-backend-module-bitbucket-server-provider/package.json +++ b/plugins/auth-backend-module-bitbucket-server-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-bitbucket-server-provider", - "version": "0.1.3-next.1", + "version": "0.1.3-next.2", "description": "The bitbucket-server-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-cloudflare-access-provider/CHANGELOG.md b/plugins/auth-backend-module-cloudflare-access-provider/CHANGELOG.md index 6db569fbde..05bb865a9c 100644 --- a/plugins/auth-backend-module-cloudflare-access-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-cloudflare-access-provider/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-auth-backend-module-cloudflare-access-provider +## 0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/config@1.3.1-next.0 + ## 0.3.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-cloudflare-access-provider/package.json b/plugins/auth-backend-module-cloudflare-access-provider/package.json index 994d2df694..a6ab768f0f 100644 --- a/plugins/auth-backend-module-cloudflare-access-provider/package.json +++ b/plugins/auth-backend-module-cloudflare-access-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-cloudflare-access-provider", - "version": "0.3.3-next.1", + "version": "0.3.3-next.2", "description": "The cloudflare-access-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md b/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md index f34710f0a1..312a18eac7 100644 --- a/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-auth-backend-module-gcp-iap-provider +## 0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/types@1.2.0 + ## 0.3.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-gcp-iap-provider/package.json b/plugins/auth-backend-module-gcp-iap-provider/package.json index b5a9c4bd68..f39dde45b9 100644 --- a/plugins/auth-backend-module-gcp-iap-provider/package.json +++ b/plugins/auth-backend-module-gcp-iap-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-gcp-iap-provider", - "version": "0.3.3-next.1", + "version": "0.3.3-next.2", "description": "A GCP IAP auth provider module for the Backstage auth backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-github-provider/CHANGELOG.md b/plugins/auth-backend-module-github-provider/CHANGELOG.md index 9dd1e27943..1b59b8647f 100644 --- a/plugins/auth-backend-module-github-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-github-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-github-provider +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-github-provider/package.json b/plugins/auth-backend-module-github-provider/package.json index 45b2495e7a..49dca01723 100644 --- a/plugins/auth-backend-module-github-provider/package.json +++ b/plugins/auth-backend-module-github-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-github-provider", - "version": "0.2.3-next.1", + "version": "0.2.3-next.2", "description": "The github-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md b/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md index 5822e9b8aa..ecfa128461 100644 --- a/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-gitlab-provider +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-gitlab-provider/package.json b/plugins/auth-backend-module-gitlab-provider/package.json index eb8efa482f..b006aeb15f 100644 --- a/plugins/auth-backend-module-gitlab-provider/package.json +++ b/plugins/auth-backend-module-gitlab-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-gitlab-provider", - "version": "0.2.3-next.1", + "version": "0.2.3-next.2", "description": "The gitlab-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-google-provider/CHANGELOG.md b/plugins/auth-backend-module-google-provider/CHANGELOG.md index 023721fd6e..439de2acdc 100644 --- a/plugins/auth-backend-module-google-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-google-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-google-provider +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-google-provider/package.json b/plugins/auth-backend-module-google-provider/package.json index 169ae171b6..e336c96987 100644 --- a/plugins/auth-backend-module-google-provider/package.json +++ b/plugins/auth-backend-module-google-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-google-provider", - "version": "0.2.3-next.1", + "version": "0.2.3-next.2", "description": "A Google auth provider module for the Backstage auth backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-guest-provider/CHANGELOG.md b/plugins/auth-backend-module-guest-provider/CHANGELOG.md index 64f8deaaa4..8c03d41a0b 100644 --- a/plugins/auth-backend-module-guest-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-guest-provider/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-auth-backend-module-guest-provider +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/catalog-model@1.7.2-next.0 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-guest-provider/package.json b/plugins/auth-backend-module-guest-provider/package.json index 53bd5b72ba..22b24139f6 100644 --- a/plugins/auth-backend-module-guest-provider/package.json +++ b/plugins/auth-backend-module-guest-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-guest-provider", - "version": "0.2.3-next.1", + "version": "0.2.3-next.2", "description": "The guest-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md b/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md index aa043345a7..c9ceff5f82 100644 --- a/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-microsoft-provider +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-microsoft-provider/package.json b/plugins/auth-backend-module-microsoft-provider/package.json index 4a66ca2e32..4853cf95a2 100644 --- a/plugins/auth-backend-module-microsoft-provider/package.json +++ b/plugins/auth-backend-module-microsoft-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-microsoft-provider", - "version": "0.2.3-next.1", + "version": "0.2.3-next.2", "description": "The microsoft-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md b/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md index 1214418320..2d1a8ffd95 100644 --- a/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-oauth2-provider +## 0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.3.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-oauth2-provider/package.json b/plugins/auth-backend-module-oauth2-provider/package.json index b75f6e39c2..fb0ee690df 100644 --- a/plugins/auth-backend-module-oauth2-provider/package.json +++ b/plugins/auth-backend-module-oauth2-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-oauth2-provider", - "version": "0.3.3-next.1", + "version": "0.3.3-next.2", "description": "The oauth2-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md b/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md index 44c74e288c..ef29374df0 100644 --- a/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-backend-module-oauth2-proxy-provider +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-oauth2-proxy-provider/package.json b/plugins/auth-backend-module-oauth2-proxy-provider/package.json index 8b173df200..84258c01c7 100644 --- a/plugins/auth-backend-module-oauth2-proxy-provider/package.json +++ b/plugins/auth-backend-module-oauth2-proxy-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-oauth2-proxy-provider", - "version": "0.2.3-next.1", + "version": "0.2.3-next.2", "description": "The oauth2-proxy-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-oidc-provider/CHANGELOG.md b/plugins/auth-backend-module-oidc-provider/CHANGELOG.md index 5900d01590..1f4f574d06 100644 --- a/plugins/auth-backend-module-oidc-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-oidc-provider/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-backend-module-oidc-provider +## 0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-backend@0.24.1-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.3.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-oidc-provider/package.json b/plugins/auth-backend-module-oidc-provider/package.json index 2e40d255c6..9e10260bbd 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.3.3-next.1", + "version": "0.3.3-next.2", "description": "The oidc-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-okta-provider/CHANGELOG.md b/plugins/auth-backend-module-okta-provider/CHANGELOG.md index 4c8437f3c4..36c5a56db6 100644 --- a/plugins/auth-backend-module-okta-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-okta-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-okta-provider +## 0.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.1.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-okta-provider/package.json b/plugins/auth-backend-module-okta-provider/package.json index 0712c714ef..8ca4e26db2 100644 --- a/plugins/auth-backend-module-okta-provider/package.json +++ b/plugins/auth-backend-module-okta-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-okta-provider", - "version": "0.1.3-next.1", + "version": "0.1.3-next.2", "description": "The okta-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-onelogin-provider/CHANGELOG.md b/plugins/auth-backend-module-onelogin-provider/CHANGELOG.md index 8b26308542..be3263db85 100644 --- a/plugins/auth-backend-module-onelogin-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-onelogin-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-onelogin-provider +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-onelogin-provider/package.json b/plugins/auth-backend-module-onelogin-provider/package.json index 67ca38acce..4f92065d30 100644 --- a/plugins/auth-backend-module-onelogin-provider/package.json +++ b/plugins/auth-backend-module-onelogin-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-onelogin-provider", - "version": "0.2.3-next.1", + "version": "0.2.3-next.2", "description": "The onelogin-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md b/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md index 7606f9120e..f1e14601f9 100644 --- a/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-backend-module-pinniped-provider +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/config@1.3.1-next.0 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-pinniped-provider/package.json b/plugins/auth-backend-module-pinniped-provider/package.json index 2d93b4f236..a70e51018d 100644 --- a/plugins/auth-backend-module-pinniped-provider/package.json +++ b/plugins/auth-backend-module-pinniped-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-pinniped-provider", - "version": "0.2.3-next.1", + "version": "0.2.3-next.2", "description": "The pinniped-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md b/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md index 3245132355..088d9acef5 100644 --- a/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-backend-module-vmware-cloud-provider +## 0.4.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/catalog-model@1.7.2-next.0 + ## 0.4.2-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-vmware-cloud-provider/package.json b/plugins/auth-backend-module-vmware-cloud-provider/package.json index b31f291e18..a005fd1762 100644 --- a/plugins/auth-backend-module-vmware-cloud-provider/package.json +++ b/plugins/auth-backend-module-vmware-cloud-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-vmware-cloud-provider", - "version": "0.4.2-next.1", + "version": "0.4.2-next.2", "description": "The vmware-cloud-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend/CHANGELOG.md b/plugins/auth-backend/CHANGELOG.md index d35c858747..b41eee890e 100644 --- a/plugins/auth-backend/CHANGELOG.md +++ b/plugins/auth-backend/CHANGELOG.md @@ -1,5 +1,36 @@ # @backstage/plugin-auth-backend +## 0.24.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-backend-module-atlassian-provider@0.3.3-next.2 + - @backstage/plugin-auth-backend-module-auth0-provider@0.1.3-next.2 + - @backstage/plugin-auth-backend-module-bitbucket-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.1.3-next.2 + - @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.3.3-next.2 + - @backstage/plugin-auth-backend-module-github-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-gitlab-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-microsoft-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-oauth2-provider@0.3.3-next.2 + - @backstage/plugin-auth-backend-module-oidc-provider@0.3.3-next.2 + - @backstage/plugin-auth-backend-module-okta-provider@0.1.3-next.2 + - @backstage/plugin-auth-backend-module-onelogin-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-aws-alb-provider@0.3.1-next.2 + - @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.3.3-next.2 + - @backstage/plugin-auth-backend-module-google-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.3-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + ## 0.24.1-next.1 ### Patch Changes diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index e33f72a5d8..63fa6861d5 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.1-next.1", + "version": "0.24.1-next.2", "description": "A Backstage backend plugin that handles authentication", "backstage": { "role": "backend-plugin", diff --git a/plugins/auth-node/CHANGELOG.md b/plugins/auth-node/CHANGELOG.md index 3cae640270..e3209aaa45 100644 --- a/plugins/auth-node/CHANGELOG.md +++ b/plugins/auth-node/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-auth-node +## 0.5.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + ## 0.5.5-next.1 ### Patch Changes diff --git a/plugins/auth-node/package.json b/plugins/auth-node/package.json index 6b5861d494..cb7f02fd95 100644 --- a/plugins/auth-node/package.json +++ b/plugins/auth-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-node", - "version": "0.5.5-next.1", + "version": "0.5.5-next.2", "backstage": { "role": "node-library", "pluginId": "auth", diff --git a/plugins/auth-react/CHANGELOG.md b/plugins/auth-react/CHANGELOG.md index 6ffb637999..8f47451e59 100644 --- a/plugins/auth-react/CHANGELOG.md +++ b/plugins/auth-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-react +## 0.1.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + ## 0.1.10-next.1 ### Patch Changes diff --git a/plugins/auth-react/package.json b/plugins/auth-react/package.json index 9242dd2369..5241176b4c 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.10-next.1", + "version": "0.1.10-next.2", "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 c6b894c7a3..c0d50270cf 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.26-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.0-next.1 + ## 0.2.26-next.0 ### Patch Changes diff --git a/plugins/bitbucket-cloud-common/bitbucket-cloud.oas.json b/plugins/bitbucket-cloud-common/bitbucket-cloud.oas.json index d897d83047..ead80230c6 100644 --- a/plugins/bitbucket-cloud-common/bitbucket-cloud.oas.json +++ b/plugins/bitbucket-cloud-common/bitbucket-cloud.oas.json @@ -24400,7 +24400,7 @@ "title": "Pagination", "description": "Learn more about pagination", "icon": "data:image/svg+xml;base64,b'PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMjM4LjgyIDE1MS42Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6I2IyZDRmZjt9LmNscy0ye2ZpbGw6IzRjOWFmZjt9LmNscy0ze2ZpbGw6IzAwNTJjYzt9LmNscy00e29wYWNpdHk6MC42O30uY2xzLTV7ZmlsbDp1cmwoI2xpbmVhci1ncmFkaWVudCk7fS5jbHMtNntmaWxsOnVybCgjbGluZWFyLWdyYWRpZW50LTIpO30uY2xzLTd7ZmlsbDp1cmwoI2xpbmVhci1ncmFkaWVudC0zKTt9LmNscy04e2ZpbGw6dXJsKCNsaW5lYXItZ3JhZGllbnQtNCk7fS5jbHMtOXtmaWxsOnVybCgjbGluZWFyLWdyYWRpZW50LTUpO30uY2xzLTEwLC5jbHMtMTEsLmNscy0xMntmaWxsOm5vbmU7fS5jbHMtMTB7c3Ryb2tlOiMzMzg0ZmY7fS5jbHMtMTAsLmNscy0xMSwuY2xzLTEyLC5jbHMtMTN7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLXdpZHRoOjJweDt9LmNscy0xMXtzdHJva2U6I2ZmYWIwMDt9LmNscy0xMntzdHJva2U6I2ZhZmJmYzt9LmNscy0xM3tmaWxsOiNmZmFiMDA7c3Ryb2tlOiMyNjg0ZmY7fTwvc3R5bGU+PGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXItZ3JhZGllbnQiIHkxPSI2NS4xNyIgeDI9Ijg2LjM4IiB5Mj0iNjUuMTciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM0YzlhZmYiLz48c3RvcCBvZmZzZXQ9IjAuMDgiIHN0b3AtY29sb3I9IiM0YzlhZmYiIHN0b3Atb3BhY2l0eT0iMC45NCIvPjxzdG9wIG9mZnNldD0iMC4yNCIgc3RvcC1jb2xvcj0iIzRjOWFmZiIgc3RvcC1vcGFjaXR5PSIwLjc4Ii8+PHN0b3Agb2Zmc2V0PSIwLjQ1IiBzdG9wLWNvbG9yPSIjNGM5YWZmIiBzdG9wLW9wYWNpdHk9IjAuNTMiLz48c3RvcCBvZmZzZXQ9IjAuNTUiIHN0b3AtY29sb3I9IiM0YzlhZmYiIHN0b3Atb3BhY2l0eT0iMC40Ii8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhci1ncmFkaWVudC0yIiB4MT0iMTUyLjQ0IiB5MT0iNjUuMTciIHgyPSIyMzguODIiIHkyPSI2NS4xNyIgeGxpbms6aHJlZj0iI2xpbmVhci1ncmFkaWVudCIvPjxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyLWdyYWRpZW50LTMiIHgxPSIxOC44NSIgeTE9IjExOC43OCIgeDI9IjEyNi4wOCIgeTI9IjExLjU2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIwLjA2IiBzdG9wLWNvbG9yPSIjMDA2NWZmIi8+PHN0b3Agb2Zmc2V0PSIwLjE5IiBzdG9wLWNvbG9yPSIjMDA2NWZmIiBzdG9wLW9wYWNpdHk9IjAuOTQiLz48c3RvcCBvZmZzZXQ9IjAuNDYiIHN0b3AtY29sb3I9IiMwMDY1ZmYiIHN0b3Atb3BhY2l0eT0iMC43OCIvPjxzdG9wIG9mZnNldD0iMC44MiIgc3RvcC1jb2xvcj0iIzAwNjVmZiIgc3RvcC1vcGFjaXR5PSIwLjUzIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDA2NWZmIiBzdG9wLW9wYWNpdHk9IjAuNCIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXItZ3JhZGllbnQtNCIgeDE9IjExMi43NSIgeTE9IjExOC43OCIgeDI9IjIxOS45NyIgeTI9IjExLjU2IiB4bGluazpocmVmPSIjbGluZWFyLWdyYWRpZW50LTMiLz48bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhci1ncmFkaWVudC01IiB4MT0iNTAuOTciIHkxPSIxMzMuNjEiIHgyPSIxODcuODYiIHkyPSItMy4yOCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iMC42NiIgc3RvcC1jb2xvcj0iIzI1Mzg1OCIvPjxzdG9wIG9mZnNldD0iMC44OCIgc3RvcC1jb2xvcj0iIzI1Mzg1OCIgc3RvcC1vcGFjaXR5PSIwLjgzIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMjUzODU4IiBzdG9wLW9wYWNpdHk9IjAuNyIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjx0aXRsZT5WaWV3IFZlcnNpb25zPC90aXRsZT48ZyBpZD0iTGF5ZXJfMiIgZGF0YS1uYW1lPSJMYXllciAyIj48ZyBpZD0iU29mdHdhcmUiPjxjaXJjbGUgY2xhc3M9ImNscy0xIiBjeD0iOTQuNTMiIGN5PSIxNDcuOTMiIHI9IjMuNjciLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjEwNi45NCIgY3k9IjE0Ny45MyIgcj0iMy42NyIvPjxjaXJjbGUgY2xhc3M9ImNscy0zIiBjeD0iMTE5LjM0IiBjeT0iMTQ3LjkzIiByPSIzLjY3Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxMzEuNzUiIGN5PSIxNDcuOTMiIHI9IjMuNjciLz48Y2lyY2xlIGNsYXNzPSJjbHMtMSIgY3g9IjE0NC4xNiIgY3k9IjE0Ny45MyIgcj0iMy42NyIvPjxnIGNsYXNzPSJjbHMtNCI+PHJlY3QgaWQ9Il9SZWN0YW5nbGVfIiBkYXRhLW5hbWU9IiZsdDtSZWN0YW5nbGUmZ3Q7IiBjbGFzcz0iY2xzLTUiIHk9IjI1LjkyIiB3aWR0aD0iODYuMzgiIGhlaWdodD0iNzguNDkiLz48L2c+PGcgY2xhc3M9ImNscy00Ij48cmVjdCBpZD0iX1JlY3RhbmdsZV8yIiBkYXRhLW5hbWU9IiZsdDtSZWN0YW5nbGUmZ3Q7IiBjbGFzcz0iY2xzLTYiIHg9IjE1Mi40NCIgeT0iMjUuOTIiIHdpZHRoPSI4Ni4zOCIgaGVpZ2h0PSI3OC40OSIvPjwvZz48cmVjdCBpZD0iX1JlY3RhbmdsZV8zIiBkYXRhLW5hbWU9IiZsdDtSZWN0YW5nbGUmZ3Q7IiBjbGFzcz0iY2xzLTciIHg9IjE2LjI4IiB5PSIxNC4xMiIgd2lkdGg9IjExMi4zNiIgaGVpZ2h0PSIxMDIuMDkiLz48cmVjdCBpZD0iX1JlY3RhbmdsZV80IiBkYXRhLW5hbWU9IiZsdDtSZWN0YW5nbGUmZ3Q7IiBjbGFzcz0iY2xzLTgiIHg9IjExMC4xOCIgeT0iMTQuMTIiIHdpZHRoPSIxMTIuMzYiIGhlaWdodD0iMTAyLjA5Ii8+PHJlY3QgaWQ9Il9SZWN0YW5nbGVfNSIgZGF0YS1uYW1lPSImbHQ7UmVjdGFuZ2xlJmd0OyIgY2xhc3M9ImNscy05IiB4PSI0Ny42OSIgd2lkdGg9IjE0My40NSIgaGVpZ2h0PSIxMzAuMzQiLz48bGluZSBjbGFzcz0iY2xzLTEwIiB4MT0iNzkuMTYiIHkxPSIxNi4xOCIgeDI9IjExNy4yNCIgeTI9IjE2LjE4Ii8+PGxpbmUgY2xhc3M9ImNscy0xMCIgeDE9IjYyLjkzIiB5MT0iMTYuMTgiIHgyPSI3Mi42IiB5Mj0iMTYuMTgiLz48bGluZSBjbGFzcz0iY2xzLTExIiB4MT0iNzkuMTYiIHkxPSIyNi45NSIgeDI9IjExNy4yNCIgeTI9IjI2Ljk1Ii8+PGxpbmUgY2xhc3M9ImNscy0xMCIgeDE9IjYyLjkzIiB5MT0iMjYuOTUiIHgyPSI3Mi42IiB5Mj0iMjYuOTUiLz48bGluZSBjbGFzcz0iY2xzLTEwIiB4MT0iNzkuMTYiIHkxPSIzNy43MiIgeDI9IjE1MC43IiB5Mj0iMzcuNzIiLz48bGluZSBjbGFzcz0iY2xzLTEwIiB4MT0iNjIuOTMiIHkxPSIzNy43MiIgeDI9IjcyLjYiIHkyPSIzNy43MiIvPjxsaW5lIGNsYXNzPSJjbHMtMTEiIHgxPSIxNTAuNyIgeTE9IjQ4LjQ5IiB4Mj0iMTc1LjU5IiB5Mj0iNDguNDkiLz48bGluZSBjbGFzcz0iY2xzLTEyIiB4MT0iMTEwLjMyIiB5MT0iNDguNDkiIHgyPSIxNDMuMDUiIHkyPSI0OC40OSIvPjxsaW5lIGNsYXNzPSJjbHMtMTEiIHgxPSI3OS4xNiIgeTE9IjQ4LjQ5IiB4Mj0iMTAxLjM3IiB5Mj0iNDguNDkiLz48bGluZSBjbGFzcz0iY2xzLTEwIiB4MT0iNjIuOTMiIHkxPSI0OC40OSIgeDI9IjcyLjYiIHkyPSI0OC40OSIvPjxsaW5lIGNsYXNzPSJjbHMtMTAiIHgxPSI3OS4xNiIgeTE9IjU5LjI2IiB4Mj0iMTUwLjciIHkyPSI1OS4yNiIvPjxsaW5lIGNsYXNzPSJjbHMtMTAiIHgxPSI2Mi45MyIgeTE9IjU5LjI2IiB4Mj0iNzIuNiIgeTI9IjU5LjI2Ii8+PGxpbmUgY2xhc3M9ImNscy0xMCIgeDE9Ijc5LjE2IiB5MT0iNzAuMDMiIHgyPSIxNzUuNTkiIHkyPSI3MC4wMyIvPjxsaW5lIGNsYXNzPSJjbHMtMTAiIHgxPSI2Mi45MyIgeTE9IjcwLjAzIiB4Mj0iNzIuNiIgeTI9IjcwLjAzIi8+PGxpbmUgY2xhc3M9ImNscy0xMSIgeDE9Ijc5LjE2IiB5MT0iODAuNzkiIHgyPSIxMTcuMjQiIHkyPSI4MC43OSIvPjxsaW5lIGNsYXNzPSJjbHMtMTAiIHgxPSI2Mi45MyIgeTE9IjgwLjc5IiB4Mj0iNzIuNiIgeTI9IjgwLjc5Ii8+PGxpbmUgY2xhc3M9ImNscy0xMyIgeDE9Ijc5LjE2IiB5MT0iOTEuNTYiIHgyPSIxNDkuMDYiIHkyPSI5MS41NiIvPjxsaW5lIGNsYXNzPSJjbHMtMTAiIHgxPSI2Mi45MyIgeTE9IjkxLjU2IiB4Mj0iNzIuNiIgeTI9IjkxLjU2Ii8+PGxpbmUgY2xhc3M9ImNscy0xMCIgeDE9IjYyLjkzIiB5MT0iODAuNzkiIHgyPSI3Mi42IiB5Mj0iODAuNzkiLz48bGluZSBjbGFzcz0iY2xzLTEwIiB4MT0iNjIuOTMiIHkxPSI5MS41NiIgeDI9IjcyLjYiIHkyPSI5MS41NiIvPjxsaW5lIGNsYXNzPSJjbHMtMTEiIHgxPSI3OS4xNiIgeTE9IjEwMi4zMyIgeDI9IjExNy4yNCIgeTI9IjEwMi4zMyIvPjxsaW5lIGNsYXNzPSJjbHMtMTAiIHgxPSI2Mi45MyIgeTE9IjEwMi4zMyIgeDI9IjcyLjYiIHkyPSIxMDIuMzMiLz48bGluZSBjbGFzcz0iY2xzLTEwIiB4MT0iMTI1Ljk4IiB5MT0iMTEzLjEiIHgyPSIxNDkuMDYiIHkyPSIxMTMuMSIvPjxsaW5lIGNsYXNzPSJjbHMtMTIiIHgxPSI3OS4xNiIgeTE9IjExMy4xIiB4Mj0iMTE3LjI0IiB5Mj0iMTEzLjEiLz48bGluZSBjbGFzcz0iY2xzLTEwIiB4MT0iNjIuOTMiIHkxPSIxMTMuMSIgeDI9IjcyLjYiIHkyPSIxMTMuMSIvPjwvZz48L2c+PC9zdmc+'", - "body": "\nEndpoints that return collections of objects should always apply pagination.\nPaginated collections are always wrapped in the following wrapper object:\n\n```json\n{\n \"size\": 5421,\n \"page\": 2,\n \"pagelen\": 10,\n \"next\": \"https://api.bitbucket.org/2.0/repositories/pypy/pypy/commits?page=3\",\n \"previous\": \"https://api.bitbucket.org/2.0/repositories/pypy/pypy/commits?page=1\",\n \"values\": [\n ...\n ]\n}\n```\n\nPagination is often page-bound, with a query parameter page indicating which\npage is to be returned.\n\nHowever, clients are not expected to construct URLs themselves by manipulating\nthe page number query parameter. Instead, the response contains a link to the\nnext page. This link should be treated as an opaque location that is not to be\nconstructed by clients or even assumed to be predictable. The only contract\naround the next link is that it will return the next chunk of results.\n\nLack of a next link in the response indicates the end of the collection.\n\nThe paginated response contains the following fields:\n\n| Field | Value |\n|------------|----------|\n| `size` | Total number of objects in the response. This is an optional element that is not provided in all responses, as it can be expensive to compute. |\n| `page` | Page number of the current results. This is an optional element that is not provided in all responses. |\n| `pagelen` | Current number of objects on the existing page. Globally, the minimum length is 10 and the maximum is 100. Some APIs may specify a different default. |\n| `next` | Link to the next page if it exists. The last page of a collection does not have this value. Use this link to navigate the result set and refrain from constructing your own URLs. |\n| `previous` | Link to previous page if it exists. A collections first page does not have this value. This is an optional element that is not provided in all responses. Some result sets strictly support forward navigation and never provide previous links. Clients must anticipate that backwards navigation is not always available. Use this link to navigate the result set and refrain from constructing your own URLs. |\n| `values` | The list of objects. This contains at most `pagelen` objects. |\n\nThe link to the next page is included such that you don't have to hardcode or construct any links. Only values and next are guaranteed (except the last page, which lacks next). This is because the previous and size values can be expensive for some data sets.\n\nIt is important to realize that Bitbucket support both list-based pagination and iterator-based pagination. List-based pagination assumes that the collection is a discrete, immutable, consistently ordered, finite array of objects with a fixed size. Clients navigate a list-based collection by requesting offset-based chunks. In Bitbucket Cloud, list-based responses include the optional size, page, and previous element. The the next and previous links typically resemble something like /foo/bar?page=4.\n\nHowever, not all result sets can be treated as immutable and finite – much like how programming languages tend to distinguish between lists and arrays on one hand and iterators or stream on the other. Where an list-based pagination offers random access into any point in a collection, iterator-based pagination can only navigate forward one element at a time. In Bitbucket such iterator-based pagination contains the next link and pagelen elements, but not necessarily anything else. In these cases, the next link's value often contains an unpredictable hash instead of an explicit page number. The commits resource uses iterator-based pagination.\n" + "body": "\nEndpoints that return collections of objects should always apply pagination.\nPaginated collections are always wrapped in the following wrapper object:\n\n```json\n{\n \"size\": 5421,\n \"page\": 2,\n \"pagelen\": 10,\n \"next\": \"https://api.bitbucket.org/2.0/repositories/pypy/pypy/commits?page=3\",\n \"previous\": \"https://api.bitbucket.org/2.0/repositories/pypy/pypy/commits?page=1\",\n \"values\": [\n ...\n ]\n}\n```\n\nPagination is often page-bound, with a query parameter page indicating which\npage is to be returned.\n\nHowever, clients are not expected to construct URLs themselves by manipulating\nthe page number query parameter. Instead, the response contains a link to the\nnext page. This link should be treated as an opaque location that is not to be\nconstructed by clients or even assumed to be predictable. The only contract\naround the next link is that it will return the next chunk of results.\n\nLack of a next link in the response indicates the end of the collection.\n\nThe paginated response contains the following fields:\n\n| Field | Value |\n|------------|----------|\n| `size` | Total number of objects in the response. This is an optional element that is not provided in all responses, as it can be expensive to compute. |\n| `page` | Page number of the current results. This is an optional element that is not provided in all responses. |\n| `pagelen` | Current number of objects on the existing page. Globally, the minimum length is 10 and the maximum is 100. Some APIs may specify a different default. |\n| `next` | Link to the next page if it exists. The last page of a collection does not have this value. Use this link to navigate the result set and refrain from constructing your own URLs. |\n| `previous` | Link to previous page if it exists. A collections first page does not have this value. This is an optional element that is not provided in all responses. Some result sets strictly support forward navigation and never provide previous links. Clients must anticipate that backwards navigation is not always available. Use this link to navigate the result set and refrain from constructing your own URLs. |\n| `values` | The list of objects. This contains at most `pagelen` objects. |\n\nThe link to the next page is included such that you don't have to hardcode or construct any links. Only values and next are guaranteed (except the last page, which lacks next). This is because the previous and size values can be expensive for some data sets.\n\nIt is important to realize that Bitbucket support both list-based pagination and iterator-based pagination. List-based pagination assumes that the collection is a discrete, immutable, consistently ordered, finite array of objects with a fixed size. Clients navigate a list-based collection by requesting offset-based chunks. In Bitbucket Cloud, list-based responses include the optional size, page, and previous element. The next and previous links typically resemble something like /foo/bar?page=4.\n\nHowever, not all result sets can be treated as immutable and finite – much like how programming languages tend to distinguish between lists and arrays on one hand and iterators or stream on the other. Where an list-based pagination offers random access into any point in a collection, iterator-based pagination can only navigate forward one element at a time. In Bitbucket such iterator-based pagination contains the next link and pagelen elements, but not necessarily anything else. In these cases, the next link's value often contains an unpredictable hash instead of an explicit page number. The commits resource uses iterator-based pagination.\n" }, { "anchor": "partial-response", diff --git a/plugins/bitbucket-cloud-common/package.json b/plugins/bitbucket-cloud-common/package.json index 361608ee37..9a9099e5db 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.26-next.0", + "version": "0.2.26-next.1", "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 eb91db01fb..07a4438b6e 100644 --- a/plugins/catalog-backend-module-aws/CHANGELOG.md +++ b/plugins/catalog-backend-module-aws/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-backend-module-aws +## 0.4.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-aws-node@0.1.14-next.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + ## 0.4.6-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json index 992e79658c..c2f1e3f34b 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.6-next.1", + "version": "0.4.6-next.2", "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 01038c112d..ebb1fe39c4 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.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-catalog-common@1.1.2-next.0 + ## 0.3.0-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-azure/package.json b/plugins/catalog-backend-module-azure/package.json index 7efb73ea2c..389bc1cfc9 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.0-next.1", + "version": "0.3.0-next.2", "description": "A Backstage catalog backend module that helps integrate towards Azure", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md b/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md index 3eec2220aa..c7e9b52de4 100644 --- a/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md +++ b/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-backstage-openapi +## 0.4.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/backend-openapi-utils@0.4.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + ## 0.4.3-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-backstage-openapi/package.json b/plugins/catalog-backend-module-backstage-openapi/package.json index d847bb5dca..191e1567d7 100644 --- a/plugins/catalog-backend-module-backstage-openapi/package.json +++ b/plugins/catalog-backend-module-backstage-openapi/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-backstage-openapi", - "version": "0.4.3-next.1", + "version": "0.4.3-next.2", "backstage": { "role": "backend-plugin-module", "pluginId": "catalog", diff --git a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md index f0f57133cf..082ba8461e 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-catalog-backend-module-bitbucket-cloud +## 0.4.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-bitbucket-cloud-common@0.2.26-next.1 + - @backstage/plugin-catalog-common@1.1.2-next.0 + ## 0.4.3-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-cloud/package.json b/plugins/catalog-backend-module-bitbucket-cloud/package.json index e2f2a51e90..73bbf48ffd 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.3-next.1", + "version": "0.4.3-next.2", "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-server/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md index e82471e694..d7318f53ea 100644 --- a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-backend-module-bitbucket-server +## 0.3.0-next.2 + +### Minor Changes + +- 3f34ea9: Throttles Bitbucket Server API calls + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + ## 0.2.5-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-server/package.json b/plugins/catalog-backend-module-bitbucket-server/package.json index ac90aaf86a..f82a7bba16 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.2.5-next.1", + "version": "0.3.0-next.2", "backstage": { "role": "backend-plugin-module", "pluginId": "catalog", @@ -56,6 +56,7 @@ "@backstage/errors": "workspace:^", "@backstage/integration": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", + "p-throttle": "^4.1.1", "uuid": "^11.0.0" }, "devDependencies": { 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 ee2caf7ffd..73373ffff1 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.ts @@ -19,6 +19,19 @@ import { getBitbucketServerRequestOptions, } from '@backstage/integration'; import { BitbucketServerProject, BitbucketServerRepository } from './types'; +import pThrottle from 'p-throttle'; + +// 1 per second +const throttle = pThrottle({ + limit: 1, + interval: 1000, +}); + +const throttledFetch = throttle( + async (url: RequestInfo, options?: RequestInit) => { + return await fetch(url, options); + }, +); /** * A client for interacting with a Bitbucket Server instance @@ -65,7 +78,7 @@ export class BitbucketServerClient { path: string; }): Promise { const base = new URL(this.config.apiBaseUrl); - return fetch( + return throttledFetch( `${base.protocol}//${base.host}/projects/${options.projectKey}/repos/${options.repo}/raw/${options.path}`, getBitbucketServerRequestOptions(this.config), ); @@ -76,7 +89,7 @@ export class BitbucketServerClient { repo: string; }): Promise { const request = `${this.config.apiBaseUrl}/projects/${options.projectKey}/repos/${options.repo}`; - const response = await fetch( + const response = await throttledFetch( request, getBitbucketServerRequestOptions(this.config), ); @@ -117,16 +130,17 @@ export class BitbucketServerClient { } private async request(req: Request): Promise { - return fetch(req, getBitbucketServerRequestOptions(this.config)).then( - (response: Response) => { - if (!response.ok) { - throw new Error( - `Unexpected response for ${req.method} ${req.url}. Expected 200 but got ${response.status} - ${response.statusText}`, - ); - } - return response; - }, - ); + return throttledFetch( + req, + getBitbucketServerRequestOptions(this.config), + ).then((response: Response) => { + if (!response.ok) { + throw new Error( + `Unexpected response for ${req.method} ${req.url}. Expected 200 but got ${response.status} - ${response.statusText}`, + ); + } + return response; + }); } } diff --git a/plugins/catalog-backend-module-gcp/CHANGELOG.md b/plugins/catalog-backend-module-gcp/CHANGELOG.md index bc59702162..b8d319592e 100644 --- a/plugins/catalog-backend-module-gcp/CHANGELOG.md +++ b/plugins/catalog-backend-module-gcp/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-gcp +## 0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + ## 0.3.3-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-gcp/package.json b/plugins/catalog-backend-module-gcp/package.json index 5f173b4bb8..be2f0ba442 100644 --- a/plugins/catalog-backend-module-gcp/package.json +++ b/plugins/catalog-backend-module-gcp/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gcp", - "version": "0.3.3-next.1", + "version": "0.3.3-next.2", "description": "A Backstage catalog backend module that helps integrate towards GCP", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-gerrit/CHANGELOG.md b/plugins/catalog-backend-module-gerrit/CHANGELOG.md index 19c7daf10e..2801831552 100644 --- a/plugins/catalog-backend-module-gerrit/CHANGELOG.md +++ b/plugins/catalog-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-gerrit +## 0.2.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + ## 0.2.5-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json index 9fe81d7794..b2c35e14b4 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.2.5-next.1", + "version": "0.2.5-next.2", "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 9affcffb85..782f70896a 100644 --- a/plugins/catalog-backend-module-github-org/CHANGELOG.md +++ b/plugins/catalog-backend-module-github-org/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-github-org +## 0.3.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-backend-module-github@0.7.8-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + ## 0.3.5-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-github-org/package.json b/plugins/catalog-backend-module-github-org/package.json index a05a95951d..802b960a83 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.5-next.1", + "version": "0.3.5-next.2", "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 bccafc89a2..a78b623ca4 100644 --- a/plugins/catalog-backend-module-github/CHANGELOG.md +++ b/plugins/catalog-backend-module-github/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-catalog-backend-module-github +## 0.7.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-catalog-common@1.1.2-next.0 + ## 0.7.8-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json index ede3f2b1b5..511c4019af 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.8-next.1", + "version": "0.7.8-next.2", "description": "A Backstage catalog backend module that helps integrate towards GitHub", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md b/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md index 0d7a36b32b..f6b29c16a4 100644 --- a/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-backend-module-gitlab-org +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-backend-module-gitlab@0.6.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + ## 0.2.4-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitlab-org/package.json b/plugins/catalog-backend-module-gitlab-org/package.json index 94daed3905..d0f00076a5 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.4-next.1", + "version": "0.2.4-next.2", "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 9f97a2d634..ba0605d660 100644 --- a/plugins/catalog-backend-module-gitlab/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-catalog-backend-module-gitlab +## 0.6.0-next.2 + +### Minor Changes + +- 99dce5c: Implemented discovery for top-level groups defined in config.group or if undefined global top-level group in Gitlab + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-catalog-common@1.1.2-next.0 + ## 0.5.1-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json index 4649de9304..75c376a355 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.5.1-next.1", + "version": "0.6.0-next.2", "description": "A Backstage catalog backend module that helps integrate towards GitLab", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-gitlab/src/__testUtils__/handlers.ts b/plugins/catalog-backend-module-gitlab/src/__testUtils__/handlers.ts index 953ade6b7c..041aa5b835 100644 --- a/plugins/catalog-backend-module-gitlab/src/__testUtils__/handlers.ts +++ b/plugins/catalog-backend-module-gitlab/src/__testUtils__/handlers.ts @@ -83,7 +83,7 @@ const httpHandlers = [ }), rest.get( - `${apiBaseUrlSaas}/groups/subgroup1/members/all`, + `${apiBaseUrlSaas}/groups/group1%2Fsubgroup1/members/all`, (_req, res, ctx) => { return res(ctx.json(subgroup_saas_users_response)); // To-DO change }, @@ -136,6 +136,22 @@ const httpHandlers = [ // dynamic handlers +// https://docs.gitlab.com/ee/api/groups.html#list-group-details supports encoded path and id +const httpGroupFindByEncodedPathDynamic = all_groups_response.flatMap(group => [ + // Handler for apiBaseUrl + rest.get(`${apiBaseUrl}/groups/${group.full_path}`, (_, res, ctx) => { + return res( + ctx.json(all_groups_response.find(g => g.full_path === group.full_path)), + ); + }), + // Handler for apiSaaSBaseUrl + rest.get(`${apiBaseUrlSaas}/groups/${group.full_path}`, (_, res, ctx) => { + return res( + ctx.json(all_groups_response.find(g => g.full_path === group.full_path)), + ); + }), +]); + const httpGroupFindByIdDynamic = all_groups_response.map(group => { return rest.get(`${apiBaseUrl}/groups/${group.id}`, (_, res, ctx) => { return res(ctx.json(all_groups_response.find(g => g.id === group.id))); @@ -618,4 +634,5 @@ export const handlers = [ ...httpGroupListDescendantProjectsById, ...httpGroupListDescendantProjectsByName, ...graphqlHandlers, + ...httpGroupFindByEncodedPathDynamic, ]; diff --git a/plugins/catalog-backend-module-gitlab/src/__testUtils__/mocks.ts b/plugins/catalog-backend-module-gitlab/src/__testUtils__/mocks.ts index 2547015df8..d9914c0d0c 100644 --- a/plugins/catalog-backend-module-gitlab/src/__testUtils__/mocks.ts +++ b/plugins/catalog-backend-module-gitlab/src/__testUtils__/mocks.ts @@ -1041,7 +1041,7 @@ export const all_groups_response: GitLabGroup[] = [ { id: 1, name: 'group1', - description: '', + description: 'description1', full_path: 'group1', }, { @@ -1804,6 +1804,7 @@ export const expected_group_user_entity: MockObject[] = [ 'url:https://example.com/group1', 'example.com/team-path': 'group1', }, + description: 'description1', name: 'group1', }, spec: { @@ -2090,6 +2091,7 @@ export const expected_full_org_scan_entities: MockObject[] = [ 'url:https://example.com/group1', 'example.com/team-path': 'group1', }, + description: 'description1', name: 'group1', }, spec: { @@ -2347,7 +2349,7 @@ export const expected_full_members_group_org_scan_entities: MockObject[] = [ name: 'JohnDoe', }, spec: { - memberOf: ['subgroup1'], + memberOf: ['group1', 'subgroup1'], // since #26554 also config.group needs to be here. profile: { displayName: 'John Doe', email: 'john.doe@company.com', @@ -2431,6 +2433,30 @@ export const expected_full_members_group_org_scan_entities: MockObject[] = [ }, locationKey: 'GitlabOrgDiscoveryEntityProvider:test-id', }, + { + entity: { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Group', + metadata: { + annotations: { + 'backstage.io/managed-by-location': 'url:https://example.com/group1', + 'backstage.io/managed-by-origin-location': + 'url:https://example.com/group1', + 'example.com/team-path': 'group1', + }, + description: 'description1', + name: 'group1', + }, + spec: { + children: [], + profile: { + displayName: 'group1', + }, + type: 'team', + }, + }, + locationKey: 'GitlabOrgDiscoveryEntityProvider:test-id', + }, { entity: { apiVersion: 'backstage.io/v1alpha1', @@ -2472,7 +2498,7 @@ export const expected_group_members_group_org_scan_entities: MockObject[] = [ name: 'JohnDoe', }, spec: { - memberOf: ['subgroup1'], + memberOf: ['subgroup1', 'group1'], profile: { displayName: 'John Doe', email: 'john.doe@company.com', @@ -2507,6 +2533,30 @@ export const expected_group_members_group_org_scan_entities: MockObject[] = [ }, locationKey: 'GitlabOrgDiscoveryEntityProvider:test-id', }, + { + entity: { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Group', + metadata: { + annotations: { + 'backstage.io/managed-by-location': 'url:https://example.com/group1', + 'backstage.io/managed-by-origin-location': + 'url:https://example.com/group1', + 'example.com/team-path': 'group1', + }, + name: 'group1', + description: 'description1', + }, + spec: { + children: [], + profile: { + displayName: 'group1', + }, + type: 'team', + }, + }, + locationKey: 'GitlabOrgDiscoveryEntityProvider:test-id', + }, ]; export const all_self_hosted_group1_members: MockObject[] = [ diff --git a/plugins/catalog-backend-module-gitlab/src/lib/client.ts b/plugins/catalog-backend-module-gitlab/src/lib/client.ts index 4003ee5ea7..81ba58db5d 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/client.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/client.ts @@ -165,6 +165,15 @@ export class GitLabClient { return this.pagedRequest(`/groups`, options); } + // https://docs.gitlab.com/ee/api/groups.html#list-group-details + // id can either be group id or encoded full path + async getGroupByPath( + groupPath: string, + options?: CommonListOptions, + ): Promise { + return this.nonPagedRequest(`/groups/${groupPath}`, options); + } + async listDescendantGroups( groupPath: string, ): Promise> { diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts index a15894b236..5f62cedb71 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts @@ -435,7 +435,7 @@ describe('GitlabOrgDiscoveryEntityProvider - refresh', () => { }); // This should return all members of the self-hosted instance regardless of the group set -> expected_full_members_group_org_scan_entities - // All instance members, but only the group entities below the config.group + // All instance members, but only the group entities of config.group and below (#26554) it('Self-hosted: should get all instance users when restrictUsersToGroup is not set', async () => { const config = new ConfigReader(mock.config_org_group_selfHosted); const schedule = new PersistingTaskRunner(); diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts index 277a5a8c51..1fbd2a2a13 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts @@ -366,6 +366,7 @@ export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { if (this.gitLabClient.isSelfManaged() && this.config.restrictUsersToGroup) { groups = (await this.gitLabClient.listDescendantGroups(this.config.group)) .items; + groups.push(await this.gitLabClient.getGroupByPath(this.config.group)); // adds the parent group for #26554 users = paginated( options => this.gitLabClient.listGroupMembers(this.config.group, options), // calls /groups//members @@ -395,14 +396,18 @@ export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { else { groups = (await this.gitLabClient.listDescendantGroups(this.config.group)) .items; + + groups.push(await this.gitLabClient.getGroupByPath(this.config.group)); // adds the parent group for #26554 + const rootGroupSplit = this.config.group.split('/'); - const rootGroup = this.config.restrictUsersToGroup - ? rootGroupSplit[rootGroupSplit.length - 1] + const groupPath = this.config.restrictUsersToGroup + ? this.config.group : rootGroupSplit[0]; + users = paginated( options => this.gitLabClient.listSaaSUsers( - rootGroup, + groupPath, options, this.config.includeUsersWithoutSeat, ), @@ -775,7 +780,8 @@ export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { return ( this.config.groupPattern.test(group.full_path) && (!this.config.group || - group.full_path.startsWith(`${this.config.group}/`)) + group.full_path.startsWith(`${this.config.group}/`) || + group.full_path === this.config.group) ); } diff --git a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md index db5a402e0a..5f25c7e4f7 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md +++ b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-catalog-backend-module-incremental-ingestion +## 0.6.1-next.2 + +### Patch Changes + +- dfc8b41: Updated dependency `@opentelemetry/api` to `^1.9.0`. +- d42ecb0: Remove backend-common package from incremental-ingestion plugin and update related code +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 0.6.1-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-incremental-ingestion/package.json b/plugins/catalog-backend-module-incremental-ingestion/package.json index f2f58e13e3..855973c834 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/package.json +++ b/plugins/catalog-backend-module-incremental-ingestion/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-incremental-ingestion", - "version": "0.6.1-next.1", + "version": "0.6.1-next.2", "description": "An entity provider for streaming large asset sources into the catalog", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-ldap/CHANGELOG.md b/plugins/catalog-backend-module-ldap/CHANGELOG.md index 9423a0847c..036e3cf152 100644 --- a/plugins/catalog-backend-module-ldap/CHANGELOG.md +++ b/plugins/catalog-backend-module-ldap/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-backend-module-ldap +## 0.11.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + ## 0.11.0-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-ldap/package.json b/plugins/catalog-backend-module-ldap/package.json index 860c39f8fe..ac76079370 100644 --- a/plugins/catalog-backend-module-ldap/package.json +++ b/plugins/catalog-backend-module-ldap/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-ldap", - "version": "0.11.0-next.1", + "version": "0.11.0-next.2", "description": "A Backstage catalog backend module that helps integrate towards LDAP", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-logs/CHANGELOG.md b/plugins/catalog-backend-module-logs/CHANGELOG.md index b835c1cfe6..213d04dd40 100644 --- a/plugins/catalog-backend-module-logs/CHANGELOG.md +++ b/plugins/catalog-backend-module-logs/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-backend-module-logs +## 0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + ## 0.1.5-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-logs/package.json b/plugins/catalog-backend-module-logs/package.json index 276040b7f0..402b6b3e8f 100644 --- a/plugins/catalog-backend-module-logs/package.json +++ b/plugins/catalog-backend-module-logs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-logs", - "version": "0.1.5-next.1", + "version": "0.1.5-next.2", "description": "A module that subscribes to catalog releated events and logs them.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-msgraph/CHANGELOG.md b/plugins/catalog-backend-module-msgraph/CHANGELOG.md index 5c79632259..93f8b70860 100644 --- a/plugins/catalog-backend-module-msgraph/CHANGELOG.md +++ b/plugins/catalog-backend-module-msgraph/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-msgraph +## 0.6.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + ## 0.6.5-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json index 40d0a02f24..8661290585 100644 --- a/plugins/catalog-backend-module-msgraph/package.json +++ b/plugins/catalog-backend-module-msgraph/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-msgraph", - "version": "0.6.5-next.1", + "version": "0.6.5-next.2", "description": "A Backstage catalog backend module that helps integrate towards Microsoft Graph", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.ts b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.ts index 60e5c3d79b..4f1c9efbe2 100644 --- a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.ts +++ b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.ts @@ -296,7 +296,7 @@ export function resolveRelations( groupMember: Map>, groupMemberOf: Map>, ) { - // Build reference lookup tables, we reference them by the id the the graph + // Build reference lookup tables, we reference them by the id of the graph const groupMap: Map = new Map(); // by group-id or tenant-id for (const group of groups) { diff --git a/plugins/catalog-backend-module-openapi/CHANGELOG.md b/plugins/catalog-backend-module-openapi/CHANGELOG.md index 5b4c8e8321..72e969e708 100644 --- a/plugins/catalog-backend-module-openapi/CHANGELOG.md +++ b/plugins/catalog-backend-module-openapi/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-openapi +## 0.2.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + ## 0.2.5-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-openapi/package.json b/plugins/catalog-backend-module-openapi/package.json index 5af307fa3f..8f7fae6f1e 100644 --- a/plugins/catalog-backend-module-openapi/package.json +++ b/plugins/catalog-backend-module-openapi/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-openapi", - "version": "0.2.5-next.1", + "version": "0.2.5-next.2", "description": "A Backstage catalog backend module that helps with OpenAPI specifications", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md index e878c65559..9034f0fda9 100644 --- a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md +++ b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-puppetdb +## 0.2.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + ## 0.2.5-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-puppetdb/package.json b/plugins/catalog-backend-module-puppetdb/package.json index 50a1a7d69b..80cc2af988 100644 --- a/plugins/catalog-backend-module-puppetdb/package.json +++ b/plugins/catalog-backend-module-puppetdb/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-puppetdb", - "version": "0.2.5-next.1", + "version": "0.2.5-next.2", "description": "A Backstage catalog backend module that helps integrate towards PuppetDB", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md b/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md index 9509d56d04..0bec90e9db 100644 --- a/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md +++ b/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-scaffolder-entity-model +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-scaffolder-common@1.5.8-next.1 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-scaffolder-entity-model/package.json b/plugins/catalog-backend-module-scaffolder-entity-model/package.json index 94ac6c74e9..8aa73ba42b 100644 --- a/plugins/catalog-backend-module-scaffolder-entity-model/package.json +++ b/plugins/catalog-backend-module-scaffolder-entity-model/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-scaffolder-entity-model", - "version": "0.2.3-next.1", + "version": "0.2.3-next.2", "description": "Adds support for the scaffolder specific entity model (e.g. the Template kind) to the catalog backend plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-unprocessed/CHANGELOG.md b/plugins/catalog-backend-module-unprocessed/CHANGELOG.md index 9c044ccd8a..8dd8ca1c2f 100644 --- a/plugins/catalog-backend-module-unprocessed/CHANGELOG.md +++ b/plugins/catalog-backend-module-unprocessed/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-backend-module-unprocessed +## 0.5.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.6-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 0.5.3-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-unprocessed/package.json b/plugins/catalog-backend-module-unprocessed/package.json index 6a93b27bdc..42685e45a0 100644 --- a/plugins/catalog-backend-module-unprocessed/package.json +++ b/plugins/catalog-backend-module-unprocessed/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-unprocessed", - "version": "0.5.3-next.1", + "version": "0.5.3-next.2", "description": "Backstage Catalog module to view unprocessed entities", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend/CHANGELOG.md b/plugins/catalog-backend/CHANGELOG.md index 9a61eba8b6..65abfa1a07 100644 --- a/plugins/catalog-backend/CHANGELOG.md +++ b/plugins/catalog-backend/CHANGELOG.md @@ -1,5 +1,36 @@ # @backstage/plugin-catalog-backend +## 1.29.0-next.2 + +### Minor Changes + +- c1307b4: Implement `/entities` in terms of `queryEntities` to not run into memory and performance problems on large catalogs + +### Patch Changes + +- dfc8b41: Updated dependency `@opentelemetry/api` to `^1.9.0`. +- 8013c9c: Perform the by-query count inlined with the main query +- feba9ee: Use a join based strategy for filtering, when having small page sizes +- 1fdb48e: Use a faster count method on pg when computing some metrics +- 0c33465: Implement `/entities/by-name/:kind/:namespace/:name` using `getEntitiesByRefs` +- d93390d: When parsing filters, do not make redundant `anyOf` and `allOf` nodes when there's only a single entry within them +- 24ecea8: Avoid extra ordering in by-query when the user doesn't ask for it +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/backend-openapi-utils@0.4.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/plugin-search-backend-module-catalog@0.2.6-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 1.29.0-next.1 ### Minor Changes diff --git a/plugins/catalog-backend/config.d.ts b/plugins/catalog-backend/config.d.ts index 8dd5e50480..384765f92e 100644 --- a/plugins/catalog-backend/config.d.ts +++ b/plugins/catalog-backend/config.d.ts @@ -138,6 +138,16 @@ export interface Config { }>; }>; + /** + * Disables the compatibility layer for relations in returned entities that + * ensures that all relations objects have both `target` and `targetRef`. + * + * Enabling this option significantly reduces the memory usage of the + * catalog, and slightly increases performance, but may break consumers that + * rely on the existence of `target` in the relations objects. + */ + disableRelationsCompatibility?: boolean; + /** * The strategy to use for entities that are orphaned, i.e. no longer have * any other entities or providers referencing them. The default value is diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index b5c09c8eea..09c6afd454 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend", - "version": "1.29.0-next.1", + "version": "1.29.0-next.2", "description": "The Backstage backend plugin that provides the Backstage catalog", "backstage": { "role": "backend-plugin", diff --git a/plugins/catalog-backend/src/catalog/types.ts b/plugins/catalog-backend/src/catalog/types.ts index b3e52fb480..1fbf337986 100644 --- a/plugins/catalog-backend/src/catalog/types.ts +++ b/plugins/catalog-backend/src/catalog/types.ts @@ -52,8 +52,22 @@ export type EntitiesRequest = { credentials: BackstageCredentials; }; +/** + * Encapsulates either a deserialized or serialized entities to be sent in a response. + * @internal + */ +export type EntitiesResponseItems = + | { + type: 'object'; + entities: (Entity | null)[]; + } + | { + type: 'raw'; + entities: (string | null)[]; + }; + export type EntitiesResponse = { - entities: Entity[]; + entities: EntitiesResponseItems; pageInfo: PageInfo; }; @@ -86,7 +100,7 @@ export interface EntitiesBatchResponse { * The list of entities, in the same order as the refs in the request. Entries * that are null signify that no entity existed with that ref. */ - items: Array; + items: EntitiesResponseItems; } export type EntityAncestryResponse = { @@ -224,7 +238,7 @@ export interface QueryEntitiesResponse { /** * The entities for the current pagination request */ - items: Entity[]; + items: EntitiesResponseItems; pageInfo: { /** diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts index 37608b1493..e530c30d8b 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts @@ -283,7 +283,7 @@ describe('DefaultProcessingDatabase', () => { ); it.each(databases.eachSupportedId())( - 'adds deferred entities to the the refresh_state table to be picked up later, %p', + 'adds deferred entities to the refresh_state table to be picked up later, %p', async databaseId => { const { knex, db } = await createDatabase(databaseId); await insertRefreshStateRow(knex, { diff --git a/plugins/catalog-backend/src/database/metrics.ts b/plugins/catalog-backend/src/database/metrics.ts index d8cd87558f..809405d69f 100644 --- a/plugins/catalog-backend/src/database/metrics.ts +++ b/plugins/catalog-backend/src/database/metrics.ts @@ -98,20 +98,40 @@ export function initDatabaseMetrics(knex: Knex) { description: 'Total amount of registered locations in the catalog', }) .addCallback(async gauge => { - const total = await knex('locations').count({ - count: '*', - }); - gauge.observe(Number(total[0].count)); + if (knex.client.config.client === 'pg') { + // https://stackoverflow.com/questions/7943233/fast-way-to-discover-the-row-count-of-a-table-in-postgresql + const total = await knex.raw(` + SELECT reltuples::bigint AS estimate + FROM pg_class + WHERE oid = 'locations'::regclass; + `); + gauge.observe(Number(total.rows[0].estimate)); + } else { + const total = await knex('locations').count({ + count: '*', + }); + gauge.observe(Number(total[0].count)); + } }), relations: meter .createObservableGauge('catalog_relations_count', { description: 'Total amount of relations between entities', }) .addCallback(async gauge => { - const total = await knex('relations').count({ - count: '*', - }); - gauge.observe(Number(total[0].count)); + if (knex.client.config.client === 'pg') { + // https://stackoverflow.com/questions/7943233/fast-way-to-discover-the-row-count-of-a-table-in-postgresql + const total = await knex.raw(` + SELECT reltuples::bigint AS estimate + FROM pg_class + WHERE oid = 'relations'::regclass; + `); + gauge.observe(Number(total.rows[0].estimate)); + } else { + const total = await knex('relations').count({ + count: '*', + }); + gauge.observe(Number(total[0].count)); + } }), }; } diff --git a/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.test.ts b/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.test.ts index 3e2dee7ae0..894949a691 100644 --- a/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.test.ts +++ b/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.test.ts @@ -64,7 +64,7 @@ describe('AuthorizedEntitiesCatalog', () => { credentials: mockCredentials.none(), }), ).toEqual({ - entities: [], + entities: { type: 'object', entities: [] }, pageInfo: { hasNextPage: false }, }); }); @@ -113,7 +113,7 @@ describe('AuthorizedEntitiesCatalog', () => { credentials: mockCredentials.none(), }), ).resolves.toEqual({ - items: [null], + items: { type: 'object', entities: [null] }, }); expect(fakeCatalog.entitiesBatch).not.toHaveBeenCalled(); @@ -174,7 +174,7 @@ describe('AuthorizedEntitiesCatalog', () => { filter: { key: 'kind', values: ['b'] }, }), ).resolves.toEqual({ - items: [], + items: { type: 'object', entities: [] }, pageInfo: {}, totalItems: 0, }); @@ -226,7 +226,7 @@ describe('AuthorizedEntitiesCatalog', () => { ]; fakeCatalog.queryEntities.mockResolvedValue({ - items: entities, + items: { type: 'object', entities }, pageInfo: { nextCursor: { isPrevious: false, @@ -254,7 +254,7 @@ describe('AuthorizedEntitiesCatalog', () => { }); expect(response).toEqual({ - items: entities, + items: { type: 'object', entities: entities }, totalItems: 4, pageInfo: { nextCursor: { @@ -290,7 +290,7 @@ describe('AuthorizedEntitiesCatalog', () => { }); expect(response).toEqual({ - items: entities, + items: { type: 'object', entities: entities }, totalItems: 4, pageInfo: { nextCursor: { @@ -338,7 +338,9 @@ describe('AuthorizedEntitiesCatalog', () => { conditions: { rule: 'IS_ENTITY_KIND', params: { kinds: ['b'] } }, }, ]); - fakeCatalog.entities.mockResolvedValue({ entities: [] }); + fakeCatalog.entities.mockResolvedValue({ + entities: { type: 'object', entities: [] }, + }); const catalog = new AuthorizedEntitiesCatalog( fakeCatalog, fakePermissionApi, @@ -360,7 +362,10 @@ describe('AuthorizedEntitiesCatalog', () => { }, ]); fakeCatalog.entities.mockResolvedValue({ - entities: [{ kind: 'b', namespace: 'default', name: 'my-component' }], + entities: { + type: 'object', + entities: [{ kind: 'b', namespace: 'default', name: 'my-component' }], + }, }); const catalog = new AuthorizedEntitiesCatalog( fakeCatalog, diff --git a/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.ts b/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.ts index 5358e90825..073e153dcc 100644 --- a/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.ts +++ b/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.ts @@ -60,7 +60,7 @@ export class AuthorizedEntitiesCatalog implements EntitiesCatalog { if (authorizeDecision.result === AuthorizeResult.DENY) { return { - entities: [], + entities: { type: 'object', entities: [] }, pageInfo: { hasNextPage: false }, }; } @@ -92,7 +92,10 @@ export class AuthorizedEntitiesCatalog implements EntitiesCatalog { if (authorizeDecision.result === AuthorizeResult.DENY) { return { - items: new Array(request.entityRefs.length).fill(null), + items: { + type: 'object', + entities: new Array(request.entityRefs.length).fill(null), + }, }; } @@ -123,7 +126,7 @@ export class AuthorizedEntitiesCatalog implements EntitiesCatalog { if (authorizeDecision.result === AuthorizeResult.DENY) { return { - items: [], + items: { type: 'object', entities: [] }, pageInfo: {}, totalItems: 0, }; @@ -208,7 +211,7 @@ export class AuthorizedEntitiesCatalog implements EntitiesCatalog { allOf: [permissionFilter, basicEntityFilter({ 'metadata.uid': uid })], }, }); - if (entities.length === 0) { + if (entities.entities.length === 0) { throw new NotAllowedError(); } } diff --git a/plugins/catalog-backend/src/service/CatalogBuilder.ts b/plugins/catalog-backend/src/service/CatalogBuilder.ts index 31ec40b887..7ce308e796 100644 --- a/plugins/catalog-backend/src/service/CatalogBuilder.ts +++ b/plugins/catalog-backend/src/service/CatalogBuilder.ts @@ -115,6 +115,7 @@ import { UrlReaderService, SchedulerService, } from '@backstage/backend-plugin-api'; +import { entitiesResponseToObjects } from './response'; /** * This is a duplicate of the alpha `CatalogPermissionRule` type, for use in the stable API. @@ -485,6 +486,10 @@ export class CatalogBuilder { discovery, }); + const disableRelationsCompatibility = config.getOptionalBoolean( + 'catalog.disableRelationsCompatibility', + ); + const policy = this.buildEntityPolicy(); const processors = this.buildProcessors(); const parser = this.parser || defaultEntityDataParser; @@ -521,6 +526,7 @@ export class CatalogBuilder { database: dbClient, logger, stitcher, + disableRelationsCompatibility, }); let permissionsService: PermissionsService; @@ -566,7 +572,10 @@ export class CatalogBuilder { }, }); - const entitiesByRef = keyBy(entities, stringifyEntityRef); + const entitiesByRef = keyBy( + entitiesResponseToObjects(entities), + stringifyEntityRef, + ); return resourceRefs.map( resourceRef => @@ -629,6 +638,7 @@ export class CatalogBuilder { auth, httpAuth, permissionsService, + disableRelationsCompatibility, }); await connectEntityProviders(providerDatabase, entityProviders); diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts index bb2ba3d587..070b93ab2c 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts @@ -38,6 +38,7 @@ import { Stitcher } from '../stitching/types'; import { DefaultEntitiesCatalog } from './DefaultEntitiesCatalog'; import { EntitiesRequest } from '../catalog/types'; import { buildEntitySearch } from '../database/operations/stitcher/buildEntitySearch'; +import { entitiesResponseToObjects } from './response'; jest.setTimeout(60_000); @@ -310,10 +311,11 @@ describe('DefaultEntitiesCatalog', () => { const testFilter = { key: 'spec.test', }; - const { entities } = await catalog.entities({ + const res = await catalog.entities({ filter: testFilter, credentials: mockCredentials.none(), }); + const entities = entitiesResponseToObjects(res.entities); expect(entities.length).toBe(1); expect(entities[0]).toEqual(entity2); @@ -351,10 +353,11 @@ describe('DefaultEntitiesCatalog', () => { key: 'spec.test', }, }; - const { entities } = await catalog.entities({ + const res = await catalog.entities({ filter: testFilter, credentials: mockCredentials.none(), }); + const entities = entitiesResponseToObjects(res.entities); expect(entities.length).toBe(1); expect(entities[0]).toEqual(entity1); @@ -416,7 +419,7 @@ describe('DefaultEntitiesCatalog', () => { values: ['red'], }, }; - const { entities } = await catalog.entities({ + const res = await catalog.entities({ filter: { allOf: [ testFilter1, @@ -427,6 +430,7 @@ describe('DefaultEntitiesCatalog', () => { }, credentials: mockCredentials.none(), }); + const entities = entitiesResponseToObjects(res.entities); expect(entities.length).toBe(2); expect(entities).toContainEqual(entity2); @@ -465,7 +469,7 @@ describe('DefaultEntitiesCatalog', () => { const testFilter2 = { key: 'metadata.desc', }; - const { entities } = await catalog.entities({ + const res = await catalog.entities({ filter: { not: { allOf: [testFilter1, testFilter2], @@ -474,6 +478,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }); + const entities = entitiesResponseToObjects(res.entities); expect(entities.length).toBe(1); expect(entities).toContainEqual(entity1); @@ -509,10 +514,11 @@ describe('DefaultEntitiesCatalog', () => { key: 'kind', values: [], }; - const { entities } = await catalog.entities({ + const res = await catalog.entities({ filter: testFilter, credentials: mockCredentials.none(), }); + const entities = entitiesResponseToObjects(res.entities); expect(entities.length).toBe(0); }, @@ -553,10 +559,11 @@ describe('DefaultEntitiesCatalog', () => { stitcher, }); - const { entities } = await catalog.entities(); + const res = await catalog.entities(); + const entities = entitiesResponseToObjects(res.entities); expect( - entities.find(e => e.metadata.name === 'one')!.relations, + entities.find(e => e?.metadata.name === 'one')!.relations, ).toEqual([ { type: 'r', @@ -565,7 +572,7 @@ describe('DefaultEntitiesCatalog', () => { }, ]); expect( - entities.find(e => e.metadata.name === 'two')!.relations, + entities.find(e => e?.metadata.name === 'two')!.relations, ).toEqual([ { type: 'r', @@ -615,7 +622,9 @@ describe('DefaultEntitiesCatalog', () => { return catalog .entities({ ...request, credentials: mockCredentials.none() }) .then(response => - response.entities.map(e => e.metadata.name).toSorted(), + entitiesResponseToObjects(response.entities) + .map(e => e!.metadata.name) + .toSorted(), ); } @@ -678,7 +687,11 @@ describe('DefaultEntitiesCatalog', () => { ): Promise { return catalog .entities({ ...request, credentials: mockCredentials.none() }) - .then(response => response.entities.map(e => e.metadata.name)); + .then(response => + entitiesResponseToObjects(response.entities).map( + e => e!.metadata.name, + ), + ); } await expect( @@ -764,7 +777,7 @@ describe('DefaultEntitiesCatalog', () => { stitcher, }); - const { items } = await catalog.entitiesBatch({ + const res = await catalog.entitiesBatch({ entityRefs: [ 'k:default/two', 'k:default/one', @@ -775,6 +788,7 @@ describe('DefaultEntitiesCatalog', () => { ], credentials: mockCredentials.none(), }); + const items = entitiesResponseToObjects(res.items); expect(items.map(e => e && stringifyEntityRef(e))).toEqual([ 'k:default/two', @@ -819,11 +833,12 @@ describe('DefaultEntitiesCatalog', () => { stitcher, }); - const { items } = await catalog.entitiesBatch({ + const res = await catalog.entitiesBatch({ entityRefs: ['k:default/two', 'k:default/one'], filter: { key: 'spec.owner', values: ['me'] }, credentials: mockCredentials.none(), }); + const items = entitiesResponseToObjects(res.items); expect(items.map(e => e && stringifyEntityRef(e))).toEqual([ 'k:default/two', @@ -881,7 +896,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response1 = await catalog.queryEntities(request1); - expect(response1.items).toEqual([entityFrom('A'), entityFrom('B')]); + expect(entitiesResponseToObjects(response1.items)).toEqual([ + entityFrom('A'), + entityFrom('B'), + ]); expect(response1.pageInfo.nextCursor).toBeDefined(); expect(response1.pageInfo.prevCursor).toBeUndefined(); expect(response1.totalItems).toBe(names.length); @@ -893,7 +911,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response2 = await catalog.queryEntities(request2); - expect(response2.items).toEqual([entityFrom('C'), entityFrom('D')]); + expect(entitiesResponseToObjects(response2.items)).toEqual([ + entityFrom('C'), + entityFrom('D'), + ]); expect(response2.pageInfo.nextCursor).toBeDefined(); expect(response2.pageInfo.prevCursor).toBeDefined(); expect(response2.totalItems).toBe(names.length); @@ -905,7 +926,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response3 = await catalog.queryEntities(request3); - expect(response3.items).toEqual([entityFrom('E'), entityFrom('F')]); + expect(entitiesResponseToObjects(response3.items)).toEqual([ + entityFrom('E'), + entityFrom('F'), + ]); expect(response3.pageInfo.nextCursor).toBeDefined(); expect(response3.pageInfo.prevCursor).toBeDefined(); expect(response3.totalItems).toBe(names.length); @@ -917,7 +941,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response4 = await catalog.queryEntities(request4); - expect(response4.items).toEqual([entityFrom('C'), entityFrom('D')]); + expect(entitiesResponseToObjects(response4.items)).toEqual([ + entityFrom('C'), + entityFrom('D'), + ]); expect(response4.pageInfo.nextCursor).toBeDefined(); expect(response4.pageInfo.prevCursor).toBeDefined(); expect(response4.totalItems).toBe(names.length); @@ -929,7 +956,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response5 = await catalog.queryEntities(request5); - expect(response5.items).toEqual([entityFrom('A'), entityFrom('B')]); + expect(entitiesResponseToObjects(response5.items)).toEqual([ + entityFrom('A'), + entityFrom('B'), + ]); expect(response5.pageInfo.nextCursor).toBeDefined(); expect(response5.pageInfo.prevCursor).toBeUndefined(); expect(response5.totalItems).toBe(names.length); @@ -941,7 +971,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response6 = await catalog.queryEntities(request6); - expect(response6.items).toEqual([entityFrom('C'), entityFrom('D')]); + expect(entitiesResponseToObjects(response6.items)).toEqual([ + entityFrom('C'), + entityFrom('D'), + ]); expect(response6.pageInfo.nextCursor).toBeDefined(); expect(response6.pageInfo.prevCursor).toBeDefined(); expect(response6.totalItems).toBe(names.length); @@ -953,7 +986,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response7 = await catalog.queryEntities(request7); - expect(response7.items).toEqual([entityFrom('E'), entityFrom('F')]); + expect(entitiesResponseToObjects(response7.items)).toEqual([ + entityFrom('E'), + entityFrom('F'), + ]); expect(response7.pageInfo.nextCursor).toBeDefined(); expect(response7.pageInfo.prevCursor).toBeDefined(); expect(response7.totalItems).toBe(names.length); @@ -965,7 +1001,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response7bis = await catalog.queryEntities(request7bis); - expect(response7bis.items).toEqual([ + expect(entitiesResponseToObjects(response7bis.items)).toEqual([ entityFrom('E'), entityFrom('F'), entityFrom('G'), @@ -981,7 +1017,9 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response8 = await catalog.queryEntities(request8); - expect(response8.items).toEqual([entityFrom('G')]); + expect(entitiesResponseToObjects(response8.items)).toEqual([ + entityFrom('G'), + ]); expect(response8.pageInfo.nextCursor).toBeUndefined(); expect(response8.pageInfo.prevCursor).toBeDefined(); expect(response8.totalItems).toBe(names.length); @@ -1035,7 +1073,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response1 = await catalog.queryEntities(request1); - expect(response1.items).toEqual([entityFrom('G'), entityFrom('F')]); + expect(entitiesResponseToObjects(response1.items)).toEqual([ + entityFrom('G'), + entityFrom('F'), + ]); expect(response1.pageInfo.nextCursor).toBeDefined(); expect(response1.pageInfo.prevCursor).toBeUndefined(); expect(response1.totalItems).toBe(names.length); @@ -1047,7 +1088,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response2 = await catalog.queryEntities(request2); - expect(response2.items).toEqual([entityFrom('E'), entityFrom('D')]); + expect(entitiesResponseToObjects(response2.items)).toEqual([ + entityFrom('E'), + entityFrom('D'), + ]); expect(response2.pageInfo.nextCursor).toBeDefined(); expect(response2.pageInfo.prevCursor).toBeDefined(); expect(response2.totalItems).toBe(names.length); @@ -1059,7 +1103,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response3 = await catalog.queryEntities(request3); - expect(response3.items).toEqual([entityFrom('C'), entityFrom('B')]); + expect(entitiesResponseToObjects(response3.items)).toEqual([ + entityFrom('C'), + entityFrom('B'), + ]); expect(response3.pageInfo.nextCursor).toBeDefined(); expect(response3.pageInfo.prevCursor).toBeDefined(); expect(response3.totalItems).toBe(names.length); @@ -1072,7 +1119,10 @@ describe('DefaultEntitiesCatalog', () => { }; const response4 = await catalog.queryEntities(request4); - expect(response4.items).toEqual([entityFrom('E'), entityFrom('D')]); + expect(entitiesResponseToObjects(response4.items)).toEqual([ + entityFrom('E'), + entityFrom('D'), + ]); expect(response4.pageInfo.nextCursor).toBeDefined(); expect(response4.pageInfo.prevCursor).toBeDefined(); expect(response4.totalItems).toBe(names.length); @@ -1084,7 +1134,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response5 = await catalog.queryEntities(request5); - expect(response5.items).toEqual([entityFrom('G'), entityFrom('F')]); + expect(entitiesResponseToObjects(response5.items)).toEqual([ + entityFrom('G'), + entityFrom('F'), + ]); expect(response5.pageInfo.nextCursor).toBeDefined(); expect(response5.pageInfo.prevCursor).toBeUndefined(); expect(response5.totalItems).toBe(names.length); @@ -1096,7 +1149,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response6 = await catalog.queryEntities(request6); - expect(response6.items).toEqual([entityFrom('E'), entityFrom('D')]); + expect(entitiesResponseToObjects(response6.items)).toEqual([ + entityFrom('E'), + entityFrom('D'), + ]); expect(response6.pageInfo.nextCursor).toBeDefined(); expect(response6.pageInfo.prevCursor).toBeDefined(); expect(response6.totalItems).toBe(names.length); @@ -1108,7 +1164,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response7 = await catalog.queryEntities(request7); - expect(response7.items).toEqual([entityFrom('C'), entityFrom('B')]); + expect(entitiesResponseToObjects(response7.items)).toEqual([ + entityFrom('C'), + entityFrom('B'), + ]); expect(response7.pageInfo.nextCursor).toBeDefined(); expect(response7.pageInfo.prevCursor).toBeDefined(); expect(response7.totalItems).toBe(names.length); @@ -1120,7 +1179,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response7bis = await catalog.queryEntities(request7bis); - expect(response7bis.items).toEqual([ + expect(entitiesResponseToObjects(response7bis.items)).toEqual([ entityFrom('C'), entityFrom('B'), entityFrom('A'), @@ -1136,7 +1195,9 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response8 = await catalog.queryEntities(request8); - expect(response8.items).toEqual([entityFrom('A')]); + expect(entitiesResponseToObjects(response8.items)).toEqual([ + entityFrom('A'), + ]); expect(response8.pageInfo.nextCursor).toBeUndefined(); expect(response8.pageInfo.prevCursor).toBeDefined(); expect(response8.totalItems).toBe(names.length); @@ -1188,7 +1249,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response = await catalog.queryEntities(request); - expect(response.items).toEqual([ + expect(entitiesResponseToObjects(response.items)).toEqual([ entityFrom('atcatss'), entityFrom('cat'), entityFrom('dogcat'), @@ -1246,7 +1307,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response = await catalog.queryEntities(request); - expect(response.items).toEqual(entities); + expect(entitiesResponseToObjects(response.items)).toEqual(entities); expect(response.pageInfo.nextCursor).toBeUndefined(); expect(response.pageInfo.prevCursor).toBeUndefined(); expect(response.totalItems).toBe(1); @@ -1301,7 +1362,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response = await catalog.queryEntities(request); - expect(response.items).toEqual([ + expect(entitiesResponseToObjects(response.items)).toEqual([ entityFrom('1', { uid: 'id1', title: 'cat' }), entityFrom('2', { uid: 'id2', title: 'atcatss' }), entityFrom('4', { uid: 'id4', title: 'dogcat' }), @@ -1314,7 +1375,7 @@ describe('DefaultEntitiesCatalog', () => { ...request, limit: 2, }); - expect(paginatedResponse.items).toEqual([ + expect(entitiesResponseToObjects(paginatedResponse.items)).toEqual([ entityFrom('1', { uid: 'id1', title: 'cat' }), entityFrom('2', { uid: 'id2', title: 'atcatss' }), ]); @@ -1326,7 +1387,7 @@ describe('DefaultEntitiesCatalog', () => { cursor: paginatedResponse.pageInfo.nextCursor!, credentials: mockCredentials.none(), }); - expect(paginatedResponseNext.items).toEqual([ + expect(entitiesResponseToObjects(paginatedResponseNext.items)).toEqual([ entityFrom('4', { uid: 'id4', title: 'dogcat' }), ]); expect(paginatedResponseNext.pageInfo.nextCursor).toBeUndefined(); @@ -1404,7 +1465,7 @@ describe('DefaultEntitiesCatalog', () => { }; const response = await catalog.queryEntities(request); - expect(response.items).toEqual([ + expect(entitiesResponseToObjects(response.items)).toEqual([ entityFrom('KingOfTheJungle', { uid: 'id0', title: 'lion' }), entityFrom('NotKingOfTheJungle', { uid: 'id1', title: 'cat' }), entityFrom('NotACatKing', { uid: 'id2', title: 'atcatss' }), @@ -1418,7 +1479,7 @@ describe('DefaultEntitiesCatalog', () => { ...request, limit: 2, }); - expect(paginatedResponse.items).toEqual([ + expect(entitiesResponseToObjects(paginatedResponse.items)).toEqual([ entityFrom('KingOfTheJungle', { uid: 'id0', title: 'lion' }), entityFrom('NotKingOfTheJungle', { uid: 'id1', title: 'cat' }), ]); @@ -1430,7 +1491,7 @@ describe('DefaultEntitiesCatalog', () => { cursor: paginatedResponse.pageInfo.nextCursor!, credentials: mockCredentials.none(), }); - expect(paginatedResponseNext.items).toEqual([ + expect(entitiesResponseToObjects(paginatedResponseNext.items)).toEqual([ entityFrom('NotACatKing', { uid: 'id2', title: 'atcatss' }), entityFrom('123', { uid: 'id3', title: 'king' }), ]); @@ -1474,7 +1535,11 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response = await catalog.queryEntities(request); - expect(response).toEqual({ totalItems: 20, items: [], pageInfo: {} }); + expect(response).toEqual({ + totalItems: 20, + items: { type: 'raw', entities: [] }, + pageInfo: {}, + }); }, ); @@ -1509,7 +1574,10 @@ describe('DefaultEntitiesCatalog', () => { let response = await catalog.queryEntities(request); expect(response).toEqual({ totalItems: 0, - items: expect.objectContaining({ length: 10 }), + items: { + type: 'raw', + entities: expect.objectContaining({ length: 10 }), + }, pageInfo: { nextCursor: expect.anything() }, }); response = await catalog.queryEntities({ @@ -1518,7 +1586,10 @@ describe('DefaultEntitiesCatalog', () => { }); expect(response).toEqual({ totalItems: 0, - items: expect.objectContaining({ length: 5 }), + items: { + type: 'raw', + entities: expect.objectContaining({ length: 5 }), + }, pageInfo: { prevCursor: expect.anything() }, }); }, @@ -1553,7 +1624,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response1 = await catalog.queryEntities(request1); - expect(response1.items).toMatchObject([ + expect(entitiesResponseToObjects(response1.items)).toMatchObject([ entityFrom('AA'), entityFrom('AA'), ]); @@ -1568,7 +1639,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response2 = await catalog.queryEntities(request2); - expect(response2.items).toMatchObject([ + expect(entitiesResponseToObjects(response2.items)).toMatchObject([ entityFrom('AA'), entityFrom('AA'), ]); @@ -1583,7 +1654,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response3 = await catalog.queryEntities(request3); - expect(response3.items).toEqual([entityFrom('CC'), entityFrom('DD')]); + expect(entitiesResponseToObjects(response3.items)).toEqual([ + entityFrom('CC'), + entityFrom('DD'), + ]); expect(response3.pageInfo.nextCursor).toBeUndefined(); expect(response3.pageInfo.prevCursor).toBeDefined(); expect(response3.totalItems).toBe(6); @@ -1595,7 +1669,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response4 = await catalog.queryEntities(request4); - expect(response4.items).toMatchObject([ + expect(entitiesResponseToObjects(response4.items)).toMatchObject([ entityFrom('AA'), entityFrom('AA'), ]); @@ -1610,7 +1684,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response5 = await catalog.queryEntities(request5); - expect(response5.items).toMatchObject([ + expect(entitiesResponseToObjects(response5.items)).toMatchObject([ entityFrom('AA'), entityFrom('AA'), ]); @@ -1678,7 +1752,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response1 = await catalog.queryEntities(request1); - expect(response1.items).toMatchObject([ + expect(entitiesResponseToObjects(response1.items)).toMatchObject([ entityFrom('AA', { uid: '1', kind: 'included' }), entityFrom('AA', { uid: '2', kind: 'included' }), ]); @@ -1693,7 +1767,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response2 = await catalog.queryEntities(request2); - expect(response2.items).toMatchObject([ + expect(entitiesResponseToObjects(response2.items)).toMatchObject([ entityFrom('AA', { uid: '4', kind: 'included' }), entityFrom('AA', { uid: '5', kind: 'included' }), ]); @@ -1737,7 +1811,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response1 = await catalog.queryEntities(request1); - expect(response1.items).toMatchObject([ + expect(entitiesResponseToObjects(response1.items)).toMatchObject([ entityFrom('AA'), entityFrom('CC'), ]); @@ -1752,7 +1826,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response2 = await catalog.queryEntities(request2); - expect(response2.items).toMatchObject([ + expect(entitiesResponseToObjects(response2.items)).toMatchObject([ entityFrom('DD'), entityFrom('AA', { namespace: 'namespace2' }), ]); @@ -1767,7 +1841,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response3 = await catalog.queryEntities(request3); - expect(response3.items).toMatchObject([ + expect(entitiesResponseToObjects(response3.items)).toMatchObject([ entityFrom('AA', { namespace: 'namespace3' }), entityFrom('AA', { namespace: 'namespace4' }), ]); @@ -1782,7 +1856,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response4 = await catalog.queryEntities(request4); - expect(response4.items).toMatchObject([ + expect(entitiesResponseToObjects(response4.items)).toMatchObject([ entityFrom('DD'), entityFrom('AA', { namespace: 'namespace2' }), ]); @@ -1797,7 +1871,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response5 = await catalog.queryEntities(request5); - expect(response5.items).toMatchObject([ + expect(entitiesResponseToObjects(response5.items)).toMatchObject([ entityFrom('AA'), entityFrom('CC'), ]); @@ -1830,7 +1904,9 @@ describe('DefaultEntitiesCatalog', () => { orderFields: [{ field: 'metadata.title', order: 'asc' }], credentials: mockCredentials.none(), }) - .then(r => r.items.map(e => e.metadata.name)), + .then(r => + entitiesResponseToObjects(r.items).map(e => e!.metadata.name), + ), ).resolves.toEqual(['CC', 'BB', 'AA']); // 'AA' has no title, ends up last await expect( @@ -1839,7 +1915,9 @@ describe('DefaultEntitiesCatalog', () => { orderFields: [{ field: 'metadata.title', order: 'desc' }], credentials: mockCredentials.none(), }) - .then(r => r.items.map(e => e.metadata.name)), + .then(r => + entitiesResponseToObjects(r.items).map(e => e!.metadata.name), + ), ).resolves.toEqual(['BB', 'CC', 'AA']); // 'AA' has no title, ends up last }, ); @@ -1869,7 +1947,9 @@ describe('DefaultEntitiesCatalog', () => { limit: 10, credentials: mockCredentials.none(), }) - .then(r => r.items.map(e => e.metadata.name)), + .then(r => + entitiesResponseToObjects(r.items).map(e => e!.metadata.name), + ), ).resolves.toEqual(['AA', 'BB']); // simulate a situation where stitching is not yet complete @@ -1884,7 +1964,9 @@ describe('DefaultEntitiesCatalog', () => { limit: 10, credentials: mockCredentials.none(), }) - .then(r => r.items.map(e => e.metadata.name)), + .then(r => + entitiesResponseToObjects(r.items).map(e => e!.metadata.name), + ), ).resolves.toEqual(['BB']); }, ); diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts index fa43eb79d2..f0e0667bef 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts @@ -45,17 +45,16 @@ import { import { Stitcher } from '../stitching/types'; import { - expandLegacyCompoundRelationRefsInResponse, + expandLegacyCompoundRelationsInEntity, isQueryEntitiesCursorRequest, isQueryEntitiesInitialRequest, } from './util'; -import { - EntitiesSearchFilter, - EntityFilter, -} from '@backstage/plugin-catalog-node'; +import { EntityFilter } from '@backstage/plugin-catalog-node'; import { LoggerService } from '@backstage/backend-plugin-api'; +import { applyEntityFilterToQuery } from './request/applyEntityFilterToQuery'; +import { processRawEntitiesResult } from './response'; -const DEFAULT_LIMIT = 20; +const DEFAULT_LIMIT = 200; function parsePagination(input?: EntityPagination): EntityPagination { if (!input) { @@ -102,101 +101,29 @@ function stringifyPagination( return base64; } -function addCondition( - queryBuilder: Knex.QueryBuilder, - db: Knex, - filter: EntitiesSearchFilter, - negate: boolean = false, - entityIdField = 'entity_id', -): void { - const key = filter.key.toLowerCase(); - const values = filter.values?.map(v => v.toLowerCase()); - - // NOTE(freben): This used to be a set of OUTER JOIN, which may seem to - // make a lot of sense. However, it had abysmal performance on sqlite - // when datasets grew large, so we're using IN instead. - const matchQuery = db('search') - .select('search.entity_id') - .where({ key }) - .andWhere(function keyFilter() { - if (values?.length === 1) { - this.where({ value: values.at(0) }); - } else if (values) { - this.andWhere('value', 'in', values); - } - }); - queryBuilder.andWhere(entityIdField, negate ? 'not in' : 'in', matchQuery); -} - -function isEntitiesSearchFilter( - filter: EntitiesSearchFilter | EntityFilter, -): filter is EntitiesSearchFilter { - return filter.hasOwnProperty('key'); -} - -function isOrEntityFilter( - filter: { anyOf: EntityFilter[] } | EntityFilter, -): filter is { anyOf: EntityFilter[] } { - return filter.hasOwnProperty('anyOf'); -} - -function isNegationEntityFilter( - filter: { not: EntityFilter } | EntityFilter, -): filter is { not: EntityFilter } { - return filter.hasOwnProperty('not'); -} - -function parseFilter( - filter: EntityFilter, - query: Knex.QueryBuilder, - db: Knex, - negate: boolean = false, - entityIdField = 'entity_id', -): Knex.QueryBuilder { - if (isNegationEntityFilter(filter)) { - return parseFilter(filter.not, query, db, !negate, entityIdField); - } - - if (isEntitiesSearchFilter(filter)) { - return query.andWhere(function filterFunction() { - addCondition(this, db, filter, negate, entityIdField); - }); - } - - return query[negate ? 'andWhereNot' : 'andWhere'](function filterFunction() { - if (isOrEntityFilter(filter)) { - for (const subFilter of filter.anyOf ?? []) { - this.orWhere(subQuery => - parseFilter(subFilter, subQuery, db, false, entityIdField), - ); - } - } else { - for (const subFilter of filter.allOf ?? []) { - this.andWhere(subQuery => - parseFilter(subFilter, subQuery, db, false, entityIdField), - ); - } - } - }); -} - export class DefaultEntitiesCatalog implements EntitiesCatalog { private readonly database: Knex; private readonly logger: LoggerService; private readonly stitcher: Stitcher; + private readonly disableRelationsCompatibility: boolean; constructor(options: { database: Knex; logger: LoggerService; stitcher: Stitcher; + disableRelationsCompatibility?: boolean; }) { this.database = options.database; this.logger = options.logger; this.stitcher = options.stitcher; + this.disableRelationsCompatibility = Boolean( + options.disableRelationsCompatibility, + ); } async entities(request?: EntitiesRequest): Promise { const db = this.database; + const { limit, offset } = parsePagination(request?.pagination); let entitiesQuery = db('final_entities').select('final_entities.*'); @@ -216,13 +143,12 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { entitiesQuery = entitiesQuery.whereNotNull('final_entities.final_entity'); if (request?.filter) { - entitiesQuery = parseFilter( - request.filter, - entitiesQuery, - db, - false, - 'final_entities.entity_id', - ); + entitiesQuery = applyEntityFilterToQuery({ + filter: request.filter, + targetQuery: entitiesQuery, + onEntityIdField: 'final_entities.entity_id', + knex: db, + }); } request?.order?.forEach(({ order }, index) => { @@ -248,7 +174,6 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { entitiesQuery.orderBy('final_entities.entity_id', 'asc'); // stable sort } - const { limit, offset } = parsePagination(request?.pagination); if (limit !== undefined) { entitiesQuery = entitiesQuery.limit(limit + 1); } @@ -271,16 +196,19 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { }; } - let entities: Entity[] = rows.map(e => JSON.parse(e.final_entity!)); - - if (request?.fields) { - entities = entities.map(e => request.fields!(e)); - } - - expandLegacyCompoundRelationRefsInResponse(entities); - return { - entities, + entities: processRawEntitiesResult( + rows.map(r => r.final_entity!), + this.disableRelationsCompatibility + ? request?.fields + : e => { + expandLegacyCompoundRelationsInEntity(e); + if (request?.fields) { + return request.fields(e); + } + return e; + }, + ), pageInfo, }; } @@ -288,7 +216,7 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { async entitiesBatch( request: EntitiesBatchRequest, ): Promise { - const lookup = new Map(); + const lookup = new Map(); for (const chunk of lodashChunk(request.entityRefs, 200)) { let query = this.database('final_entities') @@ -299,34 +227,27 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { .whereIn('final_entities.entity_ref', chunk); if (request?.filter) { - query = parseFilter( - request.filter, - query, - this.database, - false, - 'final_entities.entity_id', - ); + query = applyEntityFilterToQuery({ + filter: request.filter, + targetQuery: query, + onEntityIdField: 'final_entities.entity_id', + knex: this.database, + }); } for (const row of await query) { - lookup.set(row.entityRef, row.entity ? JSON.parse(row.entity) : null); + lookup.set(row.entityRef, row.entity ? row.entity : null); } } - let items = request.entityRefs.map(ref => lookup.get(ref) ?? null); + const items = request.entityRefs.map(ref => lookup.get(ref) ?? null); - if (request.fields) { - items = items.map(e => e && request.fields!(e)); - } - - return { items }; + return { items: processRawEntitiesResult(items, request.fields) }; } async queryEntities( request: QueryEntitiesRequest, ): Promise { - const db = this.database; - const limit = request.limit ?? DEFAULT_LIMIT; const cursor: Omit & { @@ -354,7 +275,7 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { // The first part of the query builder is a subquery that applies all of the // filtering. - const dbQuery = db.with( + const dbQuery = this.database.with( 'filtered', ['entity_id', 'final_entity', ...(sortField ? ['value'] : [])], inner => { @@ -383,13 +304,12 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { // Add regular filters, if given if (cursor.filter) { - parseFilter( - cursor.filter, - inner, - db, - false, - 'final_entities.entity_id', - ); + applyEntityFilterToQuery({ + filter: cursor.filter, + targetQuery: inner, + onEntityIdField: 'final_entities.entity_id', + knex: this.database, + }); } // Add full text search filters, if given @@ -406,20 +326,20 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { // If there is one item, apply the like query to the top level query which is already // filtered based on the singular sortField. inner.andWhereRaw( - 'value like ?', + 'search.value like ?', `%${normalizedFullTextFilterTerm.toLocaleLowerCase('en-US')}%`, ); } else { - const matchQuery = db('search') - .select('entity_id') + const matchQuery = this.database('search') + .select('search.entity_id') // textFilterFields must be lowercased to match searchable keys in database, i.e. spec.profile.displayName -> spec.profile.displayname .whereIn( - 'key', + 'search.key', textFilterFields.map(field => field.toLocaleLowerCase('en-US')), ) .andWhere(function keyFilter() { this.andWhereRaw( - 'value like ?', + 'search.value like ?', `%${normalizedFullTextFilterTerm.toLocaleLowerCase( 'en-US', )}%`, @@ -457,13 +377,13 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { const [first, second] = cursor.orderFieldValues; dbQuery.andWhere(function nested() { this.where( - 'value', + 'filtered.value', isFetchingBackwards !== isOrderingDescending ? '<' : '>', first, ) - .orWhere('value', '=', first) + .orWhere('filtered.value', '=', first) .andWhere( - 'entity_id', + 'filtered.entity_id', isFetchingBackwards !== isOrderingDescending ? '<' : '>', second, ); @@ -480,20 +400,20 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { if (isFetchingBackwards) { order = invertOrder(order); } - if (db.client.config.client === 'pg') { + if (this.database.client.config.client === 'pg') { // pg correctly orders by the column value and handling nulls in one go dbQuery.orderBy([ ...(sortField ? [ { - column: 'value', + column: 'filtered.value', order, nulls: 'last', }, ] : []), { - column: 'entity_id', + column: 'filtered.entity_id', order, }, ]); @@ -505,18 +425,18 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { ...(sortField ? [ { - column: 'value', + column: 'filtered.value', order: undefined, nulls: 'last', }, { - column: 'value', + column: 'filtered.value', order, }, ] : []), { - column: 'entity_id', + column: 'filtered.entity_id', order, }, ]); @@ -590,12 +510,11 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { } : undefined; - const items = rows - .map(e => JSON.parse(e.final_entity!)) - .map(e => (request.fields ? request.fields(e) : e)); - return { - items, + items: processRawEntitiesResult( + rows.map(r => r.final_entity!), + request.fields, + ), pageInfo: { ...(!!prevCursor && { prevCursor }), ...(!!nextCursor && { nextCursor }), @@ -768,13 +687,12 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { .groupBy(['search.key', 'search.original_value']); if (request.filter) { - parseFilter( - request.filter, - query, - this.database, - false, - 'search.entity_id', - ); + applyEntityFilterToQuery({ + filter: request.filter, + targetQuery: query, + onEntityIdField: 'search.entity_id', + knex: this.database, + }); } const rows = await query; diff --git a/plugins/catalog-backend/src/service/createRouter.test.ts b/plugins/catalog-backend/src/service/createRouter.test.ts index e728017f0b..53f831d320 100644 --- a/plugins/catalog-backend/src/service/createRouter.test.ts +++ b/plugins/catalog-backend/src/service/createRouter.test.ts @@ -136,7 +136,7 @@ describe('createRouter readonly disabled', () => { ]; entitiesCatalog.queryEntities.mockResolvedValueOnce({ - items: [entities[0]], + items: { type: 'object', entities: [entities[0]] }, pageInfo: {}, totalItems: 1, }); @@ -149,7 +149,7 @@ describe('createRouter readonly disabled', () => { it('parses single and multiple request parameters and passes them down', async () => { entitiesCatalog.queryEntities.mockResolvedValueOnce({ - items: [], + items: { type: 'object', entities: [] }, pageInfo: {}, totalItems: 0, }); @@ -185,7 +185,7 @@ describe('createRouter readonly disabled', () => { ]; entitiesCatalog.queryEntities.mockResolvedValueOnce({ - items, + items: { type: 'object', entities: items }, totalItems: 100, pageInfo: { nextCursor: mockCursor() }, }); @@ -203,7 +203,7 @@ describe('createRouter readonly disabled', () => { it('parses initial request', async () => { entitiesCatalog.queryEntities.mockResolvedValueOnce({ - items: [], + items: { type: 'object', entities: [] }, pageInfo: {}, totalItems: 0, }); @@ -239,7 +239,7 @@ describe('createRouter readonly disabled', () => { it('parses encoded params request', async () => { entitiesCatalog.queryEntities.mockResolvedValueOnce({ - items: [], + items: { type: 'object', entities: [] }, pageInfo: {}, totalItems: 0, }); @@ -283,7 +283,7 @@ describe('createRouter readonly disabled', () => { ]; entitiesCatalog.queryEntities.mockResolvedValueOnce({ - items, + items: { type: 'object', entities: items }, totalItems: 100, pageInfo: { nextCursor: mockCursor() }, }); @@ -312,7 +312,7 @@ describe('createRouter readonly disabled', () => { ]; entitiesCatalog.queryEntities.mockResolvedValueOnce({ - items, + items: { type: 'object', entities: items }, totalItems: 100, pageInfo: { nextCursor: mockCursor({ fullTextFilter: { term: 'mySearch' } }), @@ -354,7 +354,7 @@ describe('createRouter readonly disabled', () => { ]; entitiesCatalog.queryEntities.mockResolvedValueOnce({ - items, + items: { type: 'object', entities: items }, totalItems: 100, pageInfo: { nextCursor: mockCursor() }, }); @@ -379,7 +379,7 @@ describe('createRouter readonly disabled', () => { ]; entitiesCatalog.queryEntities.mockResolvedValueOnce({ - items, + items: { type: 'object', entities: items }, totalItems: 100, pageInfo: { nextCursor: mockCursor() }, }); @@ -402,7 +402,7 @@ describe('createRouter readonly disabled', () => { }, }; entitiesCatalog.entities.mockResolvedValue({ - entities: [entity], + entities: { type: 'object', entities: [entity] }, pageInfo: { hasNextPage: false }, }); @@ -419,7 +419,7 @@ describe('createRouter readonly disabled', () => { it('responds with a 404 for missing entities', async () => { entitiesCatalog.entities.mockResolvedValue({ - entities: [], + entities: { type: 'object', entities: [] }, pageInfo: { hasNextPage: false }, }); @@ -446,7 +446,7 @@ describe('createRouter readonly disabled', () => { }, }; entitiesCatalog.entitiesBatch.mockResolvedValue({ - items: [entity], + items: { type: 'object', entities: [entity] }, }); const response = await request(app).get('/entities/by-name/k/ns/n'); @@ -462,7 +462,7 @@ describe('createRouter readonly disabled', () => { it('responds with a 404 for missing entities', async () => { entitiesCatalog.entitiesBatch.mockResolvedValue({ - items: [null], + items: { type: 'object', entities: [null] }, }); const response = await request(app).get('/entities/by-name/b/d/c'); @@ -533,7 +533,9 @@ describe('createRouter readonly disabled', () => { }, }; const entityRef = stringifyEntityRef(entity); - entitiesCatalog.entitiesBatch.mockResolvedValue({ items: [entity] }); + entitiesCatalog.entitiesBatch.mockResolvedValue({ + items: { type: 'object', entities: [entity] }, + }); const response = await request(app) .post('/entities/by-refs?filter=kind=Component') .set('Content-Type', 'application/json') @@ -858,7 +860,7 @@ describe('createRouter readonly disabled', () => { }); }); -describe('createRouter readonly enabled', () => { +describe('createRouter readonly and raw json enabled', () => { let entitiesCatalog: jest.Mocked; let app: express.Express; let locationService: jest.Mocked; @@ -881,6 +883,7 @@ describe('createRouter readonly enabled', () => { getLocationByEntity: jest.fn(), }; const router = await createRouter({ + disableRelationsCompatibility: true, entitiesCatalog, locationService, logger: mockServices.logger.mock(), @@ -908,7 +911,7 @@ describe('createRouter readonly enabled', () => { ]; entitiesCatalog.queryEntities.mockResolvedValueOnce({ - items: [entities[0]], + items: { type: 'raw', entities: [JSON.stringify(entities[0])] }, pageInfo: {}, totalItems: 1, }); @@ -1128,7 +1131,7 @@ describe('NextRouter permissioning', () => { }, }; entitiesCatalog.entities.mockResolvedValueOnce({ - entities: [spideySense], + entities: { type: 'object', entities: [spideySense] }, pageInfo: { hasNextPage: false }, }); diff --git a/plugins/catalog-backend/src/service/createRouter.ts b/plugins/catalog-backend/src/service/createRouter.ts index d70419c565..601b0b1098 100644 --- a/plugins/catalog-backend/src/service/createRouter.ts +++ b/plugins/catalog-backend/src/service/createRouter.ts @@ -23,7 +23,7 @@ import { stringifyEntityRef, } from '@backstage/catalog-model'; import { Config } from '@backstage/config'; -import { InputError, NotFoundError, serializeError } from '@backstage/errors'; +import { InputError, serializeError } from '@backstage/errors'; import express from 'express'; import yn from 'yn'; import { z } from 'zod'; @@ -41,10 +41,9 @@ import { parseEntityFacetParams } from './request/parseEntityFacetParams'; import { parseEntityOrderParams } from './request/parseEntityOrderParams'; import { LocationService, RefreshService } from './types'; import { - createEntityArrayJsonStream, disallowReadonlyMode, encodeCursor, - expandLegacyCompoundRelationRefsInResponse, + expandLegacyCompoundRelationsInEntity, locationInput, validateRequestBody, } from './util'; @@ -60,6 +59,12 @@ import { import { LocationAnalyzer } from '@backstage/plugin-catalog-node'; import { AuthorizedValidationService } from './AuthorizedValidationService'; import { DeferredPromise, createDeferred } from '@backstage/types'; +import { + createEntityArrayJsonStream, + processEntitiesResponseItems, + writeEntitiesResponse, + writeSingleEntityResponse, +} from './response'; /** * Options used by {@link createRouter}. @@ -80,6 +85,7 @@ export interface RouterOptions { auth: AuthService; httpAuth: HttpAuthService; permissionsService: PermissionsService; + disableRelationsCompatibility?: boolean; } /** @@ -107,6 +113,7 @@ export async function createRouter( permissionsService, auth, httpAuth, + disableRelationsCompatibility = false, } = options; const readonlyEnabled = @@ -164,7 +171,7 @@ export async function createRouter( res.setHeader('link', `<${url.pathname}${url.search}>; rel="next"`); } - res.json(entities); + await writeEntitiesResponse(res, entities); return; } @@ -203,12 +210,17 @@ export async function createRouter( : { credentials, fields, limit, cursor }, ); - if (result.items.length) { + if (result.items.entities.length) { await locks?.writeLock; signal.throwIfAborted(); - expandLegacyCompoundRelationRefsInResponse(result.items); + if (!disableRelationsCompatibility) { + result.items = processEntitiesResponseItems( + result.items, + expandLegacyCompoundRelationsInEntity, + ); + } if (!responseStream.send(result.items)) { // The kernel buffer is full. Create the lock but do not await it // yet - we can better spend our time going to the next round of @@ -241,8 +253,8 @@ export async function createRouter( credentials: await httpAuth.credentials(req), }); - res.json({ - items, + await writeEntitiesResponse(res, items, entities => ({ + items: entities, totalItems, pageInfo: { ...(pageInfo.nextCursor && { @@ -252,7 +264,7 @@ export async function createRouter( prevCursor: encodeCursor(pageInfo.prevCursor), }), }, - }); + })); }) .get('/entities/by-uid/:uid', async (req, res) => { const { uid } = req.params; @@ -260,10 +272,7 @@ export async function createRouter( filter: basicEntityFilter({ 'metadata.uid': uid }), credentials: await httpAuth.credentials(req), }); - if (!entities.length) { - throw new NotFoundError(`No entity with uid ${uid}`); - } - res.status(200).json(entities[0]); + writeSingleEntityResponse(res, entities, `No entity with uid ${uid}`); }) .delete('/entities/by-uid/:uid', async (req, res) => { const { uid } = req.params; @@ -278,12 +287,11 @@ export async function createRouter( entityRefs: [stringifyEntityRef({ kind, namespace, name })], credentials: await httpAuth.credentials(req), }); - if (!items[0]) { - throw new NotFoundError( - `No entity named '${name}' found, with kind '${kind}' in namespace '${namespace}'`, - ); - } - res.status(200).json(items[0]); + writeSingleEntityResponse( + res, + items, + `No entity named '${name}' found, with kind '${kind}' in namespace '${namespace}'`, + ); }) .get( '/entities/by-name/:kind/:namespace/:name/ancestry', @@ -298,13 +306,15 @@ export async function createRouter( ) .post('/entities/by-refs', async (req, res) => { const request = entitiesBatchRequest(req); - const response = await entitiesCatalog.entitiesBatch({ + const { items } = await entitiesCatalog.entitiesBatch({ entityRefs: request.entityRefs, filter: parseEntityFilterParams(req.query), fields: parseEntityTransformParams(req.query, request.fields), credentials: await httpAuth.credentials(req), }); - res.status(200).json(response); + await writeEntitiesResponse(res, items, entities => ({ + items: entities, + })); }) .get('/entity-facets', async (req, res) => { const response = await entitiesCatalog.facets({ diff --git a/plugins/catalog-backend/src/service/request/applyEntityFilterToQuery.test.ts b/plugins/catalog-backend/src/service/request/applyEntityFilterToQuery.test.ts new file mode 100644 index 0000000000..ea64f5b400 --- /dev/null +++ b/plugins/catalog-backend/src/service/request/applyEntityFilterToQuery.test.ts @@ -0,0 +1,196 @@ +/* + * 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 { TestDatabases } from '@backstage/backend-test-utils'; +import { applyEntityFilterToQuery } from './applyEntityFilterToQuery'; +import { + DbFinalEntitiesRow, + DbRefreshStateRow, + DbSearchRow, +} from '../../database/tables'; +import { Knex } from 'knex'; +import { applyDatabaseMigrations } from '../../database/migrations'; +import { EntityFilter } from '@backstage/plugin-catalog-node'; +import { Entity, stringifyEntityRef } from '@backstage/catalog-model'; +import { v4 as uuid } from 'uuid'; +import { buildEntitySearch } from '../../database/operations/stitcher/buildEntitySearch'; + +jest.setTimeout(60_000); + +const databases = TestDatabases.create(); +const strategies = ['in', 'join'] as const; + +describe.each(databases.eachSupportedId())( + 'applyEntityFilterToQuery, %p', + databaseId => { + // #region setup + let knex: Knex; + + beforeAll(async () => { + knex = await databases.init(databaseId); + await applyDatabaseMigrations(knex); + await addEntity({ + apiVersion: 'a', + kind: 'k', + metadata: { name: '1', namespace: 'default' }, + spec: { + foo: 'a', + unique: true, + }, + }); + await addEntity({ + apiVersion: 'a', + kind: 'k', + metadata: { name: '2', namespace: 'default' }, + spec: { + foo: 'a', + }, + }); + await addEntity({ + apiVersion: 'a', + kind: 'k', + metadata: { name: '3', namespace: 'default' }, + spec: { + foo: 'b', + }, + }); + await addEntity({ + apiVersion: 'a', + kind: 'k', + metadata: { name: '4', namespace: 'default' }, + spec: {}, + }); + }); + + afterAll(async () => { + knex.destroy(); + }); + + async function addEntity(entity: Entity) { + const id = uuid(); + const entityRef = stringifyEntityRef(entity); + const entityJson = JSON.stringify(entity); + + await knex('refresh_state').insert({ + entity_id: id, + entity_ref: entityRef, + unprocessed_entity: entityJson, + errors: '[]', + next_update_at: '2031-01-01 23:00:00', + last_discovery_at: '2021-04-01 13:37:00', + }); + + await knex('final_entities').insert({ + entity_id: id, + entity_ref: entityRef, + final_entity: entityJson, + hash: 'h', + stitch_ticket: '', + }); + + const search = await buildEntitySearch(id, entity); + await knex('search').insert(search); + + return id; + } + // #endregion + + describe.each(strategies)('with strategy %p', strategy => { + async function query(filter: EntityFilter): Promise { + const q = + knex('final_entities').whereNotNull( + 'final_entity', + ); + applyEntityFilterToQuery({ + filter: filter, + targetQuery: q, + onEntityIdField: 'final_entities.entity_id', + knex, + strategy, + }); + return await q.then(rows => + rows + .map(row => JSON.parse(row.final_entity!).metadata.name) + .toSorted(), + ); + } + + it('filters correctly', async () => { + await expect(query({ key: 'spec.foo' })).resolves.toEqual([ + '1', + '2', + '3', + ]); + + await expect( + query({ key: 'spec.foo', values: ['a'] }), + ).resolves.toEqual(['1', '2']); + + await expect( + query({ key: 'spec.foo', values: ['b'] }), + ).resolves.toEqual(['3']); + + await expect( + query({ key: 'spec.foo', values: ['a', 'b'] }), + ).resolves.toEqual(['1', '2', '3']); + + await expect( + query({ + anyOf: [ + { key: 'spec.foo', values: ['a'] }, + { key: 'spec.foo', values: ['b'] }, + ], + }), + ).resolves.toEqual(['1', '2', '3']); + + await expect( + query({ not: { key: 'spec.foo', values: ['a'] } }), + ).resolves.toEqual(['3', '4']); + + await expect( + query({ + not: { + anyOf: [ + { key: 'spec.foo', values: ['a'] }, + { key: 'spec.foo', values: ['b'] }, + ], + }, + }), + ).resolves.toEqual(['4']); + + await expect( + query({ + allOf: [ + { key: 'spec.foo' }, + { not: { key: 'spec.foo', values: ['a'] } }, + ], + }), + ).resolves.toEqual(['3']); + + await expect(query({ key: 'spec.unique' })).resolves.toEqual(['1']); + + await expect( + query({ + allOf: [ + { key: 'spec.foo', values: ['a'] }, + { not: { key: 'spec.unique' } }, + ], + }), + ).resolves.toEqual(['2']); + }); + }); + }, +); diff --git a/plugins/catalog-backend/src/service/request/applyEntityFilterToQuery.ts b/plugins/catalog-backend/src/service/request/applyEntityFilterToQuery.ts new file mode 100644 index 0000000000..b2a7fb6708 --- /dev/null +++ b/plugins/catalog-backend/src/service/request/applyEntityFilterToQuery.ts @@ -0,0 +1,130 @@ +/* + * 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 { + EntitiesSearchFilter, + EntityFilter, +} from '@backstage/plugin-catalog-node'; +import { Knex } from 'knex'; +import { DbSearchRow } from '../../database/tables'; + +function isEntitiesSearchFilter( + filter: EntitiesSearchFilter | EntityFilter, +): filter is EntitiesSearchFilter { + return filter.hasOwnProperty('key'); +} + +function isOrEntityFilter( + filter: EntityFilter, +): filter is { anyOf: EntityFilter[] } { + return filter.hasOwnProperty('anyOf'); +} + +function isNegationEntityFilter( + filter: EntityFilter, +): filter is { not: EntityFilter } { + return filter.hasOwnProperty('not'); +} + +/** + * Applies filtering through a number of WHERE IN subqueries. Example: + * + * ``` + * SELECT * FROM final_entities + * WHERE + * entity_id IN ( + * SELECT entity_id FROM search + * WHERE key = 'kind' AND value = 'component' + * ) + * AND entity_id IN ( + * SELECT entity_id FROM search + * WHERE key = 'spec.lifecycle' AND value = 'production' + * ) + * AND final_entities.final_entity IS NOT NULL + * ``` + * + * This strategy is a good all-rounder, in the sense that it has medium-good + * performance on most queries on all database engines. However, it does not + * scale well down to very short runtimes as well as the JOIN strategy. + */ +function applyInStrategy( + filter: EntityFilter, + targetQuery: Knex.QueryBuilder, + onEntityIdField: string, + knex: Knex, + negate: boolean, +): Knex.QueryBuilder { + if (isNegationEntityFilter(filter)) { + return applyInStrategy( + filter.not, + targetQuery, + onEntityIdField, + knex, + !negate, + ); + } + + if (isEntitiesSearchFilter(filter)) { + const key = filter.key.toLowerCase(); + const values = filter.values?.map(v => v.toLowerCase()); + const matchQuery = knex('search') + .select('search.entity_id') + .where({ key }) + .andWhere(function keyFilter() { + if (values?.length === 1) { + this.where({ value: values.at(0) }); + } else if (values) { + this.andWhere('value', 'in', values); + } + }); + return targetQuery.andWhere( + onEntityIdField, + negate ? 'not in' : 'in', + matchQuery, + ); + } + + return targetQuery[negate ? 'andWhereNot' : 'andWhere']( + function filterFunction() { + if (isOrEntityFilter(filter)) { + for (const subFilter of filter.anyOf ?? []) { + this.orWhere(subQuery => + applyInStrategy(subFilter, subQuery, onEntityIdField, knex, false), + ); + } + } else { + for (const subFilter of filter.allOf ?? []) { + this.andWhere(subQuery => + applyInStrategy(subFilter, subQuery, onEntityIdField, knex, false), + ); + } + } + }, + ); +} + +// The actual exported function +export function applyEntityFilterToQuery(options: { + filter: EntityFilter; + targetQuery: Knex.QueryBuilder; + onEntityIdField: string; + knex: Knex; + strategy?: 'in' | 'join'; +}): Knex.QueryBuilder { + const { filter, targetQuery, onEntityIdField, knex } = options; + + return applyInStrategy(filter, targetQuery, onEntityIdField, knex, false); +} diff --git a/plugins/catalog-backend/src/service/response/createEntityArrayJsonStream.ts b/plugins/catalog-backend/src/service/response/createEntityArrayJsonStream.ts new file mode 100644 index 0000000000..4762afd2d9 --- /dev/null +++ b/plugins/catalog-backend/src/service/response/createEntityArrayJsonStream.ts @@ -0,0 +1,79 @@ +/* + * 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 { EntitiesResponseItems } from '../../catalog/types'; +import { Response } from 'express'; + +export interface EntityArrayJsonStream { + send(entities: EntitiesResponseItems): boolean; + complete(): void; + close(): void; +} + +// Helps stream EntitiesResponseItems[] as a JSON response stream to avoid performance issues +export function createEntityArrayJsonStream( + res: Response, +): EntityArrayJsonStream { + // Imitate the httpRouter behavior of pretty-printing in development + const prettyPrint = process.env.NODE_ENV === 'development'; + let firstSend = true; + let completed = false; + + return { + send(response) { + if (firstSend) { + res.setHeader('Content-Type', 'application/json; charset=utf-8'); + res.status(200); + res.flushHeaders(); + } + + if (response.type === 'raw') { + let needsDrain = false; + for (const item of response.entities) { + const prefix = firstSend ? '[' : ','; + firstSend = false; + needsDrain ||= !res.write(prefix + item, 'utf8'); + } + return !needsDrain; + } + + let data: string; + if (prettyPrint) { + data = JSON.stringify(response.entities, null, 2); + data = firstSend ? data.slice(0, -2) : `,\n${data.slice(2, -2)}`; + } else { + data = JSON.stringify(response.entities); + data = firstSend ? data.slice(0, -1) : `,${data.slice(1, -1)}`; + } + + firstSend = false; + return res.write(data, 'utf8'); + }, + complete() { + if (firstSend) { + res.json([]); + } else { + res.end(prettyPrint ? '\n]' : ']', 'utf8'); + } + completed = true; + }, + close() { + if (!completed) { + res.end(); + } + }, + }; +} diff --git a/plugins/catalog-backend/src/service/response/index.ts b/plugins/catalog-backend/src/service/response/index.ts new file mode 100644 index 0000000000..2e01071dbd --- /dev/null +++ b/plugins/catalog-backend/src/service/response/index.ts @@ -0,0 +1,23 @@ +/* + * 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. + */ + +export { + processRawEntitiesResult, + processEntitiesResponseItems, + entitiesResponseToObjects, +} from './process'; +export { writeSingleEntityResponse, writeEntitiesResponse } from './write'; +export { createEntityArrayJsonStream } from './createEntityArrayJsonStream'; diff --git a/plugins/catalog-backend/src/service/response/process.test.ts b/plugins/catalog-backend/src/service/response/process.test.ts new file mode 100644 index 0000000000..60b96608f7 --- /dev/null +++ b/plugins/catalog-backend/src/service/response/process.test.ts @@ -0,0 +1,115 @@ +/* + * 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 { Entity } from '@backstage/catalog-model'; +import { + entitiesResponseToObjects, + processEntitiesResponseItems, + processRawEntitiesResult, +} from './process'; + +const mockTransform = (entity: Entity): Entity => ({ + ...entity, + kind: `transformed-${entity.kind}`, +}); + +describe('processRawEntitiesResult', () => { + it('should prefer keeping results in raw form', () => { + expect(processRawEntitiesResult(['{"kind":"test"}', null])).toEqual({ + type: 'raw', + entities: ['{"kind":"test"}', null], + }); + + expect( + processRawEntitiesResult(['{"kind":"test"}', null], mockTransform), + ).toEqual({ + type: 'object', + entities: [{ kind: 'transformed-test' }, null], + }); + }); +}); + +describe('processEntitiesResponseItems', () => { + it('should transform entities in object form', () => { + expect( + processEntitiesResponseItems({ + type: 'object', + entities: [{ kind: 'test' } as Entity, null], + }), + ).toEqual({ + type: 'object', + entities: [{ kind: 'test' }, null], + }); + + expect( + processEntitiesResponseItems( + { + type: 'object', + entities: [{ kind: 'test' } as Entity, null], + }, + mockTransform, + ), + ).toEqual({ + type: 'object', + entities: [{ kind: 'transformed-test' }, null], + }); + }); + + it('should transform entities in raw form', () => { + expect( + processEntitiesResponseItems({ + type: 'raw', + entities: ['{"kind":"test"}', null], + }), + ).toEqual({ + type: 'raw', + entities: ['{"kind":"test"}', null], + }); + + expect( + processEntitiesResponseItems( + { + type: 'raw', + entities: ['{"kind":"test"}', null], + }, + mockTransform, + ), + ).toEqual({ + type: 'object', + entities: [{ kind: 'transformed-test' }, null], + }); + }); +}); + +describe('entitiesResponseToObjects', () => { + it('should convert entities in object form', () => { + expect( + entitiesResponseToObjects({ + type: 'object', + entities: [null, { kind: 'test' } as Entity], + }), + ).toEqual([null, { kind: 'test' }]); + }); + + it('should convert entities in raw form', () => { + expect( + entitiesResponseToObjects({ + type: 'raw', + entities: [null, '{"kind":"test"}'], + }), + ).toEqual([null, { kind: 'test' }]); + }); +}); diff --git a/plugins/catalog-backend/src/service/response/process.ts b/plugins/catalog-backend/src/service/response/process.ts new file mode 100644 index 0000000000..fa07063f5b --- /dev/null +++ b/plugins/catalog-backend/src/service/response/process.ts @@ -0,0 +1,62 @@ +/* + * 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 { Entity } from '@backstage/catalog-model'; +import { EntitiesResponseItems } from '../../catalog/types'; + +export function processRawEntitiesResult( + serializedEntities: (string | null)[], + transform?: (entity: Entity) => Entity, +): EntitiesResponseItems { + if (transform) { + return { + type: 'object', + entities: serializedEntities.map(e => + e !== null ? transform(JSON.parse(e)) : e, + ), + }; + } + + return { + type: 'raw', + entities: serializedEntities, + }; +} + +export function processEntitiesResponseItems( + response: EntitiesResponseItems, + transform?: (entity: Entity) => Entity, +): EntitiesResponseItems { + if (!transform) { + return response; + } + if (response.type === 'raw') { + return processRawEntitiesResult(response.entities, transform); + } + return { + type: 'object', + entities: response.entities.map(e => (e !== null ? transform(e) : e)), + }; +} + +export function entitiesResponseToObjects( + response: EntitiesResponseItems, +): (Entity | null)[] { + if (response.type === 'object') { + return response.entities; + } + return response.entities.map(e => (e !== null ? JSON.parse(e) : e)); +} diff --git a/plugins/catalog-backend/src/service/response/write.test.ts b/plugins/catalog-backend/src/service/response/write.test.ts new file mode 100644 index 0000000000..fdca874904 --- /dev/null +++ b/plugins/catalog-backend/src/service/response/write.test.ts @@ -0,0 +1,317 @@ +/* + * 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 express from 'express'; +import { mockErrorHandler } from '@backstage/backend-test-utils'; +import request from 'supertest'; +import { writeEntitiesResponse, writeSingleEntityResponse } from './write'; + +describe('writeSingleEntityResponse', () => { + const app = express(); + app.use(express.json()); + app.get('/echo', (req, res) => { + writeSingleEntityResponse(res, req.body, 'not found'); + }); + app.use(mockErrorHandler()); + + describe('in object form', () => { + it('should write a single entity', async () => { + const res = await request(app) + .get('/echo') + .send({ + type: 'object', + entities: [{ kind: 'Component' }, { kind: 'User' }], + }); + + expect(res.status).toBe(200); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.body).toEqual({ kind: 'Component' }); + }); + + it('should write a missing entity', async () => { + const res = await request(app) + .get('/echo') + .send({ type: 'object', entities: [null] }); + + expect(res.status).toBe(404); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.body).toMatchObject({ + error: { name: 'NotFoundError', message: 'not found' }, + }); + }); + + it('should write no entities', async () => { + const res = await request(app) + .get('/echo') + .send({ type: 'object', entities: [] }); + + expect(res.status).toBe(404); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.body).toMatchObject({ + error: { name: 'NotFoundError', message: 'not found' }, + }); + }); + }); + + describe('in raw form', () => { + it('should write a single entity', async () => { + const res = await request(app) + .get('/echo') + .send({ + type: 'raw', + entities: ['{"kind":"Component"}', '{"kind":"User"}'], + }); + + expect(res.status).toBe(200); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.body).toEqual({ kind: 'Component' }); + }); + + it('should write a missing entity', async () => { + const res = await request(app) + .get('/echo') + .send({ type: 'raw', entities: [null] }); + + expect(res.status).toBe(404); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.body).toMatchObject({ + error: { name: 'NotFoundError', message: 'not found' }, + }); + }); + + it('should write no entities', async () => { + const res = await request(app) + .get('/echo') + .send({ type: 'raw', entities: [] }); + + expect(res.status).toBe(404); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.body).toMatchObject({ + error: { name: 'NotFoundError', message: 'not found' }, + }); + }); + }); +}); + +describe('writeEntitiesResponse', () => { + const app = express(); + app.use(express.json()); + app.get('/echo', (req, res) => { + writeEntitiesResponse(res, req.body); + }); + app.get('/wrapped', (req, res) => { + writeEntitiesResponse(res, req.body, entities => ({ + page: 1, + items: entities, + totalItems: 1337, + })); + }); + app.use(mockErrorHandler()); + + describe('in object form', () => { + it('should return empty list', async () => { + const res = await request(app).get('/echo').send({ + type: 'object', + entities: [], + }); + + expect(res.status).toBe(200); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.body).toEqual([]); + }); + + it('should return mixed objects', async () => { + const res = await request(app) + .get('/echo') + .send({ + type: 'object', + entities: [{ kind: 'Component' }, null, { kind: 'User' }, null], + }); + + expect(res.status).toBe(200); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.body).toEqual([ + { kind: 'Component' }, + null, + { kind: 'User' }, + null, + ]); + }); + + it('should wrap response of empty list', async () => { + const res = await request(app) + .get('/wrapped') + .send({ type: 'object', entities: [] }); + + expect(res.status).toBe(200); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.body).toEqual({ page: 1, items: [], totalItems: 1337 }); + }); + + it('should wrap response of mixed list', async () => { + const res = await request(app) + .get('/wrapped') + .send({ + type: 'object', + entities: [{ kind: 'Component' }, null, { kind: 'User' }, null], + }); + + expect(res.status).toBe(200); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.body).toEqual({ + page: 1, + items: [{ kind: 'Component' }, null, { kind: 'User' }, null], + totalItems: 1337, + }); + }); + }); + + describe('in raw form', () => { + it('should return empty list', async () => { + const res = await request(app).get('/echo').send({ + type: 'raw', + entities: [], + }); + + expect(res.status).toBe(200); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.body).toEqual([]); + }); + + it('should return mixed objects', async () => { + const res = await request(app) + .get('/echo') + .send({ + type: 'raw', + entities: ['{"kind":"Component"}', null, '{"kind":"User"}', null], + }); + + expect(res.status).toBe(200); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.body).toEqual([ + { kind: 'Component' }, + null, + { kind: 'User' }, + null, + ]); + }); + + it('should wrap response of empty list', async () => { + const res = await request(app) + .get('/wrapped') + .send({ type: 'raw', entities: [] }); + + expect(res.status).toBe(200); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.body).toEqual({ page: 1, items: [], totalItems: 1337 }); + }); + + it('should wrap response of mixed list', async () => { + const res = await request(app) + .get('/wrapped') + .send({ + type: 'raw', + entities: ['{"kind":"Component"}', null, '{"kind":"User"}', null], + }); + + expect(res.status).toBe(200); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.body).toEqual({ + page: 1, + items: [{ kind: 'Component' }, null, { kind: 'User' }, null], + totalItems: 1337, + }); + }); + + it('should write a large wrapped response', async () => { + const entityMock = JSON.stringify({ + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'my-component', + namespace: 'default', + annotations: { + 'backstage.io/managed-by-location': 'url:https://example.com', + }, + }, + spec: { + type: 'service', + owner: 'me', + lifecycle: 'production', + }, + }); + const res = await request(app) + .get('/wrapped') + .send({ + type: 'raw', + entities: Array(300).fill(entityMock), + }); + + expect(res.status).toBe(200); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.body).toEqual({ + page: 1, + items: expect.objectContaining({ length: 300 }), + totalItems: 1337, + }); + }); + }); +}); diff --git a/plugins/catalog-backend/src/service/response/write.ts b/plugins/catalog-backend/src/service/response/write.ts new file mode 100644 index 0000000000..c2bca0953a --- /dev/null +++ b/plugins/catalog-backend/src/service/response/write.ts @@ -0,0 +1,103 @@ +/* + * 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 { Response } from 'express'; +import { EntitiesResponseItems } from '../../catalog/types'; +import { JsonValue } from '@backstage/types'; +import { NotFoundError } from '@backstage/errors'; + +const JSON_CONTENT_TYPE = 'application/json; charset=utf-8'; + +export function writeSingleEntityResponse( + res: Response, + response: EntitiesResponseItems, + notFoundMessage: string, +) { + if (response.type === 'object') { + if (!response.entities[0]) { + throw new NotFoundError(notFoundMessage); + } + + res.json(response.entities[0]); + } else { + if (!response.entities[0]) { + throw new NotFoundError(notFoundMessage); + } + + res.setHeader('Content-Type', JSON_CONTENT_TYPE); + res.end(response.entities[0]); + } +} + +export async function writeEntitiesResponse( + res: Response, + response: EntitiesResponseItems, + responseWrapper?: (entities: JsonValue) => JsonValue, +) { + if (response.type === 'object') { + res.json( + responseWrapper + ? responseWrapper?.(response.entities) + : response.entities, + ); + return; + } + + res.setHeader('Content-Type', JSON_CONTENT_TYPE); + + // responseWrapper allows the caller to render the entities within an object + let trailing = ''; + if (responseWrapper) { + const marker = `__MARKER_${Math.random().toString(36).slice(2, 10)}__`; + const wrapped = JSON.stringify(responseWrapper(marker)); + const parts = wrapped.split(`"${marker}"`); + if (parts.length !== 2) { + throw new Error( + `Entity items response was incorrectly wrapped into ${parts.length} different parts`, + ); + } + res.write(parts[0], 'utf8'); + trailing = parts[1]; + } + + let first = true; + for (const entity of response.entities) { + const prefix = first ? '[' : ','; + first = false; + + const needsDrain = !res.write(prefix + entity, 'utf8'); + if (needsDrain) { + const closed = await new Promise(resolve => { + function onContinue() { + res.off('drain', onContinue); + res.off('close', onClose); + resolve(false); + } + function onClose() { + res.off('drain', onContinue); + res.off('close', onClose); + resolve(true); + } + res.on('drain', onContinue); + res.on('close', onClose); + }); + if (closed) { + return; + } + } + } + res.end(`${first ? '[' : ''}]${trailing}`); +} diff --git a/plugins/catalog-backend/src/service/util.ts b/plugins/catalog-backend/src/service/util.ts index c05fb14558..9847cb7225 100644 --- a/plugins/catalog-backend/src/service/util.ts +++ b/plugins/catalog-backend/src/service/util.ts @@ -15,7 +15,7 @@ */ import { InputError, NotAllowedError } from '@backstage/errors'; -import { Request, Response } from 'express'; +import { Request } from 'express'; import lodash from 'lodash'; import { z } from 'zod'; import { @@ -148,75 +148,21 @@ export function decodeCursor(encodedCursor: string) { // sure that all adopters have re-stitched their entities so that the new // targetRef field is present on them, and that they have stopped consuming // the now-removed old field -// TODO(jhaals): Remove this in April 2022 -export function expandLegacyCompoundRelationRefsInResponse( - entities: Entity[], -): void { - for (const entity of entities) { - if (entity.relations) { - for (const relation of entity.relations as any) { - if (!relation.targetRef && relation.target) { - // This is the case where an old-form entity, not yet stitched with - // the updated code, was in the database - relation.targetRef = stringifyEntityRef(relation.target); - } else if (!relation.target && relation.targetRef) { - // This is the case where a new-form entity, stitched with the - // updated code, was in the database but we still want to produce - // the old data shape as well for compatibility reasons - relation.target = parseEntityRef(relation.targetRef); - } +// TODO(patriko): Remove this in catalog 2.0 +export function expandLegacyCompoundRelationsInEntity(entity: Entity): Entity { + if (entity.relations) { + for (const relation of entity.relations as any) { + if (!relation.targetRef && relation.target) { + // This is the case where an old-form entity, not yet stitched with + // the updated code, was in the database + relation.targetRef = stringifyEntityRef(relation.target); + } else if (!relation.target && relation.targetRef) { + // This is the case where a new-form entity, stitched with the + // updated code, was in the database but we still want to produce + // the old data shape as well for compatibility reasons + relation.target = parseEntityRef(relation.targetRef); } } } -} - -export interface EntityArrayJsonStream { - send(entities: Entity[]): boolean; - complete(): void; - close(): void; -} - -// Helps stream Entity[] as a JSON response stream to avoid performance issues -export function createEntityArrayJsonStream( - res: Response, -): EntityArrayJsonStream { - // Imitate the httpRouter behavior of pretty-printing in development - const prettyPrint = process.env.NODE_ENV === 'development'; - let firstSend = true; - let completed = false; - - return { - send(entities) { - if (firstSend) { - res.setHeader('Content-Type', 'application/json; charset=utf-8'); - res.status(200); - res.flushHeaders(); - } - - let data: string; - if (prettyPrint) { - data = JSON.stringify(entities, null, 2); - data = firstSend ? data.slice(0, -2) : `,\n${data.slice(2, -2)}`; - } else { - data = JSON.stringify(entities); - data = firstSend ? data.slice(0, -1) : `,${data.slice(1, -1)}`; - } - - firstSend = false; - return res.write(data); - }, - complete() { - if (firstSend) { - res.json([]); - } else { - res.end(prettyPrint ? '\n]' : ']'); - } - completed = true; - }, - close() { - if (!completed) { - res.end(); - } - }, - }; + return entity; } diff --git a/plugins/catalog-backend/src/tests/integration.test.ts b/plugins/catalog-backend/src/tests/integration.test.ts index 737bb107ca..e85ebe48ce 100644 --- a/plugins/catalog-backend/src/tests/integration.test.ts +++ b/plugins/catalog-backend/src/tests/integration.test.ts @@ -30,7 +30,6 @@ import { processingResult, } from '@backstage/plugin-catalog-node'; import { PermissionEvaluator } from '@backstage/plugin-permission-common'; -import { JsonObject } from '@backstage/types'; import { createHash } from 'crypto'; import { Knex } from 'knex'; import { EntitiesCatalog } from '../catalog/types'; @@ -55,6 +54,7 @@ import { DefaultStitcher } from '../stitching/DefaultStitcher'; import { mockServices } from '@backstage/backend-test-utils'; import { LoggerService } from '@backstage/backend-plugin-api'; import { DatabaseManager } from '@backstage/backend-common'; +import { entitiesResponseToObjects } from '../service/response'; const voidLogger = mockServices.logger.mock(); @@ -198,7 +198,7 @@ class TestHarness { readonly #proxyProgressTracker: ProxyProgressTracker; static async create(options?: { - config?: JsonObject; + disableRelationsCompatibility?: boolean; logger?: LoggerService; db?: Knex; permissions?: PermissionEvaluator; @@ -208,21 +208,19 @@ class TestHarness { emit: CatalogProcessorEmit, ): Promise; }) { - const config = new ConfigReader( - options?.config ?? { - backend: { - database: { - client: 'better-sqlite3', - connection: ':memory:', - }, - }, - catalog: { - stitchingStrategy: { - mode: 'immediate', - }, + const config = new ConfigReader({ + backend: { + database: { + client: 'better-sqlite3', + connection: ':memory:', }, }, - ); + catalog: { + stitchingStrategy: { + mode: 'immediate', + }, + }, + }); const logger = options?.logger ?? mockServices.logger.mock(); const db = options?.db ?? @@ -279,6 +277,7 @@ class TestHarness { database: db, logger, stitcher, + disableRelationsCompatibility: options?.disableRelationsCompatibility, }); const proxyProgressTracker = new ProxyProgressTracker( new NoopProgressTracker(), @@ -365,7 +364,12 @@ class TestHarness { async getOutputEntities(): Promise> { const { entities } = await this.#catalog.entities(); - return Object.fromEntries(entities.map(e => [stringifyEntityRef(e), e])); + return Object.fromEntries( + entitiesResponseToObjects(entities).map(e => [ + stringifyEntityRef(e!), + e!, + ]), + ); } async refresh(options: RefreshOptions) { @@ -781,4 +785,57 @@ describe('Catalog Backend Integration', () => { ], }); }); + + it('should return valid responses in raw JSON mode', async () => { + const harness = await TestHarness.create({ + disableRelationsCompatibility: true, + }); + + const entityA = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'a', + annotations: { + 'backstage.io/managed-by-location': 'url:.', + 'backstage.io/managed-by-origin-location': 'url:.', + }, + }, + }; + const entityB = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'b', + annotations: { + 'backstage.io/managed-by-location': 'url:.', + 'backstage.io/managed-by-origin-location': 'url:.', + }, + }, + }; + + await harness.setInputEntities([entityA, entityB]); + await expect(harness.process()).resolves.toEqual({}); + + await expect(harness.getOutputEntities()).resolves.toEqual({ + 'component:default/a': { + ...entityA, + metadata: { + ...entityA.metadata, + etag: expect.any(String), + uid: expect.any(String), + }, + relations: [], + }, + 'component:default/b': { + ...entityB, + metadata: { + ...entityB.metadata, + etag: expect.any(String), + uid: expect.any(String), + }, + relations: [], + }, + }); + }); }); diff --git a/plugins/catalog-common/CHANGELOG.md b/plugins/catalog-common/CHANGELOG.md index 1eca771dd2..21f0f63e42 100644 --- a/plugins/catalog-common/CHANGELOG.md +++ b/plugins/catalog-common/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-common +## 1.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + ## 1.1.1 ### Patch Changes diff --git a/plugins/catalog-common/package.json b/plugins/catalog-common/package.json index ecf16611ad..c7ba0aba6e 100644 --- a/plugins/catalog-common/package.json +++ b/plugins/catalog-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-common", - "version": "1.1.1", + "version": "1.1.2-next.0", "description": "Common functionalities for the catalog plugin", "backstage": { "role": "common-library", diff --git a/plugins/catalog-graph/CHANGELOG.md b/plugins/catalog-graph/CHANGELOG.md index fc773877c3..90cb575797 100644 --- a/plugins/catalog-graph/CHANGELOG.md +++ b/plugins/catalog-graph/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-graph +## 0.4.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/types@1.2.0 + ## 0.4.14-next.1 ### Patch Changes diff --git a/plugins/catalog-graph/README.md b/plugins/catalog-graph/README.md index 0862abbc96..b9400e8e8b 100644 --- a/plugins/catalog-graph/README.md +++ b/plugins/catalog-graph/README.md @@ -137,6 +137,20 @@ return ( ); ``` +Once you have your custom implementation, you can follow these steps to modify the required components: + +- In the `app.tsx` update the `CatalogGraphPage` component to include your custom styles: + +```tsx +} /> +``` + +- In the `Entity.tsx` file, update the `EntityCatalogGraphCard` component to this: + +```tsx + +``` + ## Development Run `yarn` in the root of this plugin to install all dependencies and then `yarn start` to run a [development version](./dev/index.tsx) of this plugin. diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index 2f6be0e50d..aa7649e01f 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-graph", - "version": "0.4.14-next.1", + "version": "0.4.14-next.2", "backstage": { "role": "frontend-plugin", "pluginId": "catalog-graph", diff --git a/plugins/catalog-import/CHANGELOG.md b/plugins/catalog-import/CHANGELOG.md index d33d758529..323aaa0803 100644 --- a/plugins/catalog-import/CHANGELOG.md +++ b/plugins/catalog-import/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-catalog-import +## 0.12.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/plugin-catalog-common@1.1.2-next.0 + ## 0.12.8-next.1 ### Patch Changes diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index 65f315a046..42929d872d 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-import", - "version": "0.12.8-next.1", + "version": "0.12.8-next.2", "description": "A Backstage plugin the helps you import entities into your catalog", "backstage": { "role": "frontend-plugin", diff --git a/plugins/catalog-node/CHANGELOG.md b/plugins/catalog-node/CHANGELOG.md index 42162d4fe5..a0c09fdc48 100644 --- a/plugins/catalog-node/CHANGELOG.md +++ b/plugins/catalog-node/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-node +## 1.15.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 1.15.0-next.1 ### Minor Changes diff --git a/plugins/catalog-node/package.json b/plugins/catalog-node/package.json index 23acfb724f..fbcdc1d95a 100644 --- a/plugins/catalog-node/package.json +++ b/plugins/catalog-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-node", - "version": "1.15.0-next.1", + "version": "1.15.0-next.2", "description": "The plugin-catalog-node module for @backstage/plugin-catalog-backend", "backstage": { "role": "node-library", diff --git a/plugins/catalog-react/CHANGELOG.md b/plugins/catalog-react/CHANGELOG.md index dd00d333db..15f549c248 100644 --- a/plugins/catalog-react/CHANGELOG.md +++ b/plugins/catalog-react/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-catalog-react +## 1.14.3-next.2 + +### Patch Changes + +- 95092a6: Fixed an issue where `` would re-render its children on page load for smaller screens, potentially leading to unnecessary additional backend requests. +- 4a43398: Fixed an issue where the `EntityOwnerPicker` component failed to load when the `mode` prop was set to `owners-only`. In this mode, the `EntityOwnerPicker` does not load details about the owners, such as `displayName` or `title`. To display these details, use `mode=all` instead. +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/frontend-test-utils@0.2.4-next.2 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + ## 1.14.3-next.1 ### Patch Changes diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index 8e02010362..243ffa483b 100644 --- a/plugins/catalog-react/package.json +++ b/plugins/catalog-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-react", - "version": "1.14.3-next.1", + "version": "1.14.3-next.2", "description": "A frontend library that helps other Backstage plugins interact with the catalog", "backstage": { "role": "web-library", diff --git a/plugins/catalog-react/src/components/CatalogFilterLayout/CatalogFilterLayout.tsx b/plugins/catalog-react/src/components/CatalogFilterLayout/CatalogFilterLayout.tsx index ee51020cbb..793d4741ad 100644 --- a/plugins/catalog-react/src/components/CatalogFilterLayout/CatalogFilterLayout.tsx +++ b/plugins/catalog-react/src/components/CatalogFilterLayout/CatalogFilterLayout.tsx @@ -34,8 +34,10 @@ export const Filters = (props: { drawerAnchor?: 'left' | 'right' | 'top' | 'bottom'; }; }) => { - const isScreenSmallerThanBreakpoint = useMediaQuery((theme: Theme) => - theme.breakpoints.down(props.options?.drawerBreakpoint ?? 'md'), + const isScreenSmallerThanBreakpoint = useMediaQuery( + (theme: Theme) => + theme.breakpoints.down(props.options?.drawerBreakpoint ?? 'md'), + { noSsr: true }, ); const theme = useTheme(); const [filterDrawerOpen, setFilterDrawerOpen] = useState(false); diff --git a/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePicker.tsx b/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePicker.tsx index eba4cc3a7a..fd88a7a31e 100644 --- a/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePicker.tsx +++ b/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePicker.tsx @@ -31,7 +31,7 @@ import { useEntityList, } from '../../hooks/useEntityListProvider'; import { EntityFilter } from '../../types'; -import { reduceBackendCatalogFilters } from '../../utils'; +import { reduceBackendCatalogFilters } from '../../utils/filters'; /** @public */ export type AllowedEntityFilters = { diff --git a/plugins/catalog-react/src/components/UserListPicker/useAllEntitiesCount.ts b/plugins/catalog-react/src/components/UserListPicker/useAllEntitiesCount.ts index cecd0e4db7..fa564382d8 100644 --- a/plugins/catalog-react/src/components/UserListPicker/useAllEntitiesCount.ts +++ b/plugins/catalog-react/src/components/UserListPicker/useAllEntitiesCount.ts @@ -20,7 +20,7 @@ import { useMemo, useRef } from 'react'; import useAsync from 'react-use/esm/useAsync'; import { catalogApiRef } from '../../api'; import { useEntityList } from '../../hooks'; -import { reduceCatalogFilters } from '../../utils'; +import { reduceCatalogFilters } from '../../utils/filters'; export function useAllEntitiesCount() { const catalogApi = useApi(catalogApiRef); diff --git a/plugins/catalog-react/src/components/UserListPicker/useOwnedEntitiesCount.ts b/plugins/catalog-react/src/components/UserListPicker/useOwnedEntitiesCount.ts index 10481e80a8..dbdc040165 100644 --- a/plugins/catalog-react/src/components/UserListPicker/useOwnedEntitiesCount.ts +++ b/plugins/catalog-react/src/components/UserListPicker/useOwnedEntitiesCount.ts @@ -21,7 +21,7 @@ import useAsync from 'react-use/esm/useAsync'; import { catalogApiRef } from '../../api'; import { EntityOwnerFilter, EntityUserFilter } from '../../filters'; import { useEntityList } from '../../hooks'; -import { CatalogFilters, reduceCatalogFilters } from '../../utils'; +import { CatalogFilters, reduceCatalogFilters } from '../../utils/filters'; import useAsyncFn from 'react-use/esm/useAsyncFn'; import useDeepCompareEffect from 'react-use/esm/useDeepCompareEffect'; diff --git a/plugins/catalog-react/src/components/UserListPicker/useStarredEntitiesCount.ts b/plugins/catalog-react/src/components/UserListPicker/useStarredEntitiesCount.ts index 082c683642..70dde024f8 100644 --- a/plugins/catalog-react/src/components/UserListPicker/useStarredEntitiesCount.ts +++ b/plugins/catalog-react/src/components/UserListPicker/useStarredEntitiesCount.ts @@ -23,7 +23,7 @@ import useAsync from 'react-use/esm/useAsync'; import { catalogApiRef } from '../../api'; import { EntityUserFilter } from '../../filters'; import { useEntityList, useStarredEntities } from '../../hooks'; -import { reduceCatalogFilters } from '../../utils'; +import { reduceCatalogFilters } from '../../utils/filters'; export function useStarredEntitiesCount() { const catalogApi = useApi(catalogApiRef); diff --git a/plugins/catalog-react/src/filters.ts b/plugins/catalog-react/src/filters.ts index 6c68dad9aa..c033298983 100644 --- a/plugins/catalog-react/src/filters.ts +++ b/plugins/catalog-react/src/filters.ts @@ -22,7 +22,7 @@ import { } from '@backstage/catalog-model'; import { AlphaEntity } from '@backstage/catalog-model/alpha'; import { EntityFilter, UserListFilterKind } from './types'; -import { getEntityRelations } from './utils'; +import { getEntityRelations } from './utils/getEntityRelations'; /** * Filter entities based on Kind. diff --git a/plugins/catalog-react/src/hooks/useEntityListProvider.tsx b/plugins/catalog-react/src/hooks/useEntityListProvider.tsx index 274ec52a18..b96357eb62 100644 --- a/plugins/catalog-react/src/hooks/useEntityListProvider.tsx +++ b/plugins/catalog-react/src/hooks/useEntityListProvider.tsx @@ -48,7 +48,7 @@ import { reduceBackendCatalogFilters, reduceCatalogFilters, reduceEntityFilters, -} from '../utils'; +} from '../utils/filters'; import { useApi } from '@backstage/core-plugin-api'; import { QueryEntitiesResponse } from '@backstage/catalog-client'; diff --git a/plugins/catalog-react/src/utils/index.ts b/plugins/catalog-react/src/utils/index.ts index 5afc32af63..5b2159ae2f 100644 --- a/plugins/catalog-react/src/utils/index.ts +++ b/plugins/catalog-react/src/utils/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export * from './filters'; + export { getEntityRelations } from './getEntityRelations'; export { getEntitySourceLocation } from './getEntitySourceLocation'; export type { EntitySourceLocation } from './getEntitySourceLocation'; diff --git a/plugins/catalog-unprocessed-entities-common/CHANGELOG.md b/plugins/catalog-unprocessed-entities-common/CHANGELOG.md index 10a8d5ad0d..027c99666b 100644 --- a/plugins/catalog-unprocessed-entities-common/CHANGELOG.md +++ b/plugins/catalog-unprocessed-entities-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-catalog-unprocessed-entities-common +## 0.0.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 0.0.5 ### Patch Changes diff --git a/plugins/catalog-unprocessed-entities-common/package.json b/plugins/catalog-unprocessed-entities-common/package.json index c570efd2da..4be731fc7d 100644 --- a/plugins/catalog-unprocessed-entities-common/package.json +++ b/plugins/catalog-unprocessed-entities-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-unprocessed-entities-common", - "version": "0.0.5", + "version": "0.0.6-next.0", "description": "Common functionalities for the catalog-unprocessed-entities plugin", "backstage": { "role": "common-library", diff --git a/plugins/catalog-unprocessed-entities/CHANGELOG.md b/plugins/catalog-unprocessed-entities/CHANGELOG.md index 613954353c..f06c156ebd 100644 --- a/plugins/catalog-unprocessed-entities/CHANGELOG.md +++ b/plugins/catalog-unprocessed-entities/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-unprocessed-entities +## 0.2.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + ## 0.2.12-next.1 ### Patch Changes diff --git a/plugins/catalog-unprocessed-entities/package.json b/plugins/catalog-unprocessed-entities/package.json index f1606efca7..e83b13e26f 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.12-next.1", + "version": "0.2.12-next.2", "backstage": { "role": "frontend-plugin", "pluginId": "catalog-unprocessed-entities", diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md index 4eb9dfcd09..4df5aa6fd7 100644 --- a/plugins/catalog/CHANGELOG.md +++ b/plugins/catalog/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-catalog +## 1.26.0-next.2 + +### Minor Changes + +- 25beb82: Adds an optional columns attribute to HasSubdomainsCardProps and changes its default columns +- 39f1abc: Consistent title behaviour across CatalogTable, CursorPaginatedCatalogTable, and OffsetPaginatedCatalogTable. + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + - @backstage/plugin-scaffolder-common@1.5.8-next.1 + - @backstage/plugin-search-common@1.2.16-next.0 + - @backstage/plugin-search-react@1.8.4-next.2 + ## 1.25.2-next.1 ### Patch Changes diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index 58106dbb11..4e030cb90b 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog", - "version": "1.25.2-next.1", + "version": "1.26.0-next.2", "description": "The Backstage plugin for browsing the Backstage catalog", "backstage": { "role": "frontend-plugin", diff --git a/plugins/catalog/report.api.md b/plugins/catalog/report.api.md index 8bc620d221..3692a919b3 100644 --- a/plugins/catalog/report.api.md +++ b/plugins/catalog/report.api.md @@ -10,6 +10,7 @@ import { BackstagePlugin } from '@backstage/core-plugin-api'; import { CatalogApi } from '@backstage/plugin-catalog-react'; import { ComponentEntity } from '@backstage/catalog-model'; import { CompoundEntityRef } from '@backstage/catalog-model'; +import { DomainEntity } from '@backstage/catalog-model'; import { Entity } from '@backstage/catalog-model'; import { EntityListContextProps } from '@backstage/plugin-catalog-react'; import { EntityListPagination } from '@backstage/plugin-catalog-react'; @@ -585,6 +586,8 @@ export interface HasSubcomponentsCardProps { // @public (undocumented) export interface HasSubdomainsCardProps { + // (undocumented) + columns?: TableColumn[]; // (undocumented) tableOptions?: TableOptions; // (undocumented) diff --git a/plugins/catalog/src/apis/StarredEntitiesApi/DefaultStarredEntitiesApi.ts b/plugins/catalog/src/apis/StarredEntitiesApi/DefaultStarredEntitiesApi.ts index f4b7771d04..5c06dc1ca2 100644 --- a/plugins/catalog/src/apis/StarredEntitiesApi/DefaultStarredEntitiesApi.ts +++ b/plugins/catalog/src/apis/StarredEntitiesApi/DefaultStarredEntitiesApi.ts @@ -69,7 +69,7 @@ export class DefaultStarredEntitiesApi implements StarredEntitiesApi { >(); private readonly observable = new ObservableImpl>(subscriber => { - // forward the the latest value + // forward the latest value subscriber.next(new Set(this.starredEntities)); this.subscribers.add(subscriber); diff --git a/plugins/catalog/src/components/HasSubdomainsCard/HasSubdomainsCard.tsx b/plugins/catalog/src/components/HasSubdomainsCard/HasSubdomainsCard.tsx index 71705ea90f..b52f5eacf7 100644 --- a/plugins/catalog/src/components/HasSubdomainsCard/HasSubdomainsCard.tsx +++ b/plugins/catalog/src/components/HasSubdomainsCard/HasSubdomainsCard.tsx @@ -14,12 +14,17 @@ * limitations under the License. */ -import { RELATION_HAS_PART } from '@backstage/catalog-model'; -import { InfoCardVariants, TableOptions } from '@backstage/core-components'; +import { DomainEntity, RELATION_HAS_PART } from '@backstage/catalog-model'; +import { + InfoCardVariants, + TableColumn, + TableOptions, +} from '@backstage/core-components'; import React from 'react'; import { - asComponentEntities, - componentEntityColumns, + asDomainEntities, + domainEntityColumns, + domainEntityHelpLink, RelatedEntitiesCard, } from '../RelatedEntitiesCard'; import { catalogTranslationRef } from '../../alpha/translation'; @@ -29,6 +34,7 @@ import { useTranslationRef } from '@backstage/core-plugin-api/alpha'; export interface HasSubdomainsCardProps { variant?: InfoCardVariants; tableOptions?: TableOptions; + columns?: TableColumn[]; title?: string; } @@ -36,8 +42,9 @@ export function HasSubdomainsCard(props: HasSubdomainsCardProps) { const { t } = useTranslationRef(catalogTranslationRef); const { variant = 'gridItem', - tableOptions = {}, title = t('hasSubdomainsCard.title'), + columns = domainEntityColumns, + tableOptions = {}, } = props; return ( ); diff --git a/plugins/catalog/src/components/RelatedEntitiesCard/RelatedEntitiesCard.tsx b/plugins/catalog/src/components/RelatedEntitiesCard/RelatedEntitiesCard.tsx index 5b57cbd80e..40481614e2 100644 --- a/plugins/catalog/src/components/RelatedEntitiesCard/RelatedEntitiesCard.tsx +++ b/plugins/catalog/src/components/RelatedEntitiesCard/RelatedEntitiesCard.tsx @@ -33,10 +33,13 @@ import { } from '@backstage/core-components'; import { asComponentEntities, + asDomainEntities, asResourceEntities, asSystemEntities, componentEntityColumns, componentEntityHelpLink, + domainEntityColumns, + domainEntityHelpLink, resourceEntityColumns, resourceEntityHelpLink, systemEntityColumns, @@ -137,3 +140,6 @@ RelatedEntitiesCard.asResourceEntities = asResourceEntities; RelatedEntitiesCard.systemEntityColumns = systemEntityColumns; RelatedEntitiesCard.systemEntityHelpLink = systemEntityHelpLink; RelatedEntitiesCard.asSystemEntities = asSystemEntities; +RelatedEntitiesCard.domainEntityColums = domainEntityColumns; +RelatedEntitiesCard.domainEntityHelpLink = domainEntityHelpLink; +RelatedEntitiesCard.asDomainEntities = asDomainEntities; diff --git a/plugins/catalog/src/components/RelatedEntitiesCard/presets.ts b/plugins/catalog/src/components/RelatedEntitiesCard/presets.ts index 8e3040ccf9..68930c578b 100644 --- a/plugins/catalog/src/components/RelatedEntitiesCard/presets.ts +++ b/plugins/catalog/src/components/RelatedEntitiesCard/presets.ts @@ -15,6 +15,7 @@ */ import { ComponentEntity, + DomainEntity, Entity, ResourceEntity, SystemEntity, @@ -55,3 +56,13 @@ export const systemEntityHelpLink: string = 'https://backstage.io/docs/features/software-catalog/descriptor-format#kind-system'; export const asSystemEntities = (entities: Entity[]): SystemEntity[] => entities as SystemEntity[]; + +export const domainEntityColumns: TableColumn[] = [ + EntityTable.columns.createEntityRefColumn({ defaultKind: 'domain' }), + EntityTable.columns.createOwnerColumn(), + EntityTable.columns.createMetadataDescriptionColumn(), +]; +export const domainEntityHelpLink: string = + 'https://backstage.io/docs/features/software-catalog/descriptor-format#kind-domain'; +export const asDomainEntities = (entities: Entity[]): DomainEntity[] => + entities as DomainEntity[]; diff --git a/plugins/config-schema/CHANGELOG.md b/plugins/config-schema/CHANGELOG.md index 6612b6aed2..b4393708db 100644 --- a/plugins/config-schema/CHANGELOG.md +++ b/plugins/config-schema/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-config-schema +## 0.1.63-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/types@1.2.0 + ## 0.1.63-next.1 ### Patch Changes diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json index 693534bfde..d48ca8dbc3 100644 --- a/plugins/config-schema/package.json +++ b/plugins/config-schema/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-config-schema", - "version": "0.1.63-next.1", + "version": "0.1.63-next.2", "description": "A Backstage plugin that lets you browse the configuration schema of your app", "backstage": { "role": "frontend-plugin", diff --git a/plugins/config-schema/src/components/SchemaView/ArrayView.tsx b/plugins/config-schema/src/components/SchemaView/ArrayView.tsx deleted file mode 100644 index abe2cfc327..0000000000 --- a/plugins/config-schema/src/components/SchemaView/ArrayView.tsx +++ /dev/null @@ -1,60 +0,0 @@ -/* - * 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 Box from '@material-ui/core/Box'; -import Typography from '@material-ui/core/Typography'; -import { Schema } from 'jsonschema'; -import React from 'react'; -import { ChildView } from './ChildView'; -import { MetadataView } from './MetadataView'; -import { SchemaViewProps } from './types'; - -export function ArrayView({ path, depth, schema }: SchemaViewProps) { - const itemDepth = depth + 1; - const itemPath = path ? `${path}[]` : '[]'; - const itemSchema = schema.items; - - return ( - <> - - {schema.description && ( - - {schema.description} - - )} - - - Items - - {schema.additionalItems && schema.additionalItems !== true && ( - <> - Additional Items - - - )} - - ); -} diff --git a/plugins/config-schema/src/components/SchemaView/ChildView.tsx b/plugins/config-schema/src/components/SchemaView/ChildView.tsx deleted file mode 100644 index b39e445688..0000000000 --- a/plugins/config-schema/src/components/SchemaView/ChildView.tsx +++ /dev/null @@ -1,127 +0,0 @@ -/* - * 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 { JsonValue } from '@backstage/types'; -import Box from '@material-ui/core/Box'; -import Chip from '@material-ui/core/Chip'; -import Divider from '@material-ui/core/Divider'; -import Typography from '@material-ui/core/Typography'; -import { makeStyles } from '@material-ui/core/styles'; -import { Schema } from 'jsonschema'; -import React, { useEffect, useRef } from 'react'; -import { useScrollTargets } from '../ScrollTargetsContext/ScrollTargetsContext'; -import { SchemaView } from './SchemaView'; - -export interface MetadataViewRowProps { - label: string; - text?: string; - data?: JsonValue; -} - -function titleVariant(depth: number) { - if (depth <= 1) { - return 'h2'; - } else if (depth === 2) { - return 'h3'; - } else if (depth === 3) { - return 'h4'; - } else if (depth === 4) { - return 'h5'; - } - return 'h6'; -} - -const useChildViewStyles = makeStyles(theme => ({ - title: { - marginBottom: 0, - }, - chip: { - marginLeft: theme.spacing(1), - marginRight: 0, - marginBottom: 0, - }, -})); - -export function ChildView({ - path, - depth, - schema, - required, - lastChild, -}: { - path: string; - depth: number; - schema?: Schema; - required?: boolean; - lastChild?: boolean; -}) { - const classes = useChildViewStyles(); - const titleRef = useRef(null); - const scroll = useScrollTargets(); - - useEffect(() => { - return scroll?.setScrollListener(path, () => { - titleRef.current?.scrollIntoView({ behavior: 'smooth' }); - }); - }, [scroll, path]); - - const chips = new Array(); - const chipProps = { size: 'small' as const, classes: { root: classes.chip } }; - - if (required) { - chips.push( - , - ); - } - - const visibility = (schema as { visibility?: string })?.visibility; - if (visibility === 'frontend') { - chips.push( - , - ); - } else if (visibility === 'secret') { - chips.push( - , - ); - } - - return ( - - - - - - {path} - - {chips.length > 0 && } - {chips} - - {schema && ( - - )} - - - ); -} diff --git a/plugins/config-schema/src/components/SchemaView/MatchView.tsx b/plugins/config-schema/src/components/SchemaView/MatchView.tsx deleted file mode 100644 index ba97ff9db5..0000000000 --- a/plugins/config-schema/src/components/SchemaView/MatchView.tsx +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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 Typography from '@material-ui/core/Typography'; -import { Schema } from 'jsonschema'; -import React from 'react'; -import { ChildView } from './ChildView'; - -export function MatchView({ - path, - depth, - schema, - label, -}: { - path: string; - depth: number; - schema: Schema[]; - label: string; -}) { - return ( - <> - {label} - {schema.map((optionSchema, index) => ( - - ))} - - ); -} diff --git a/plugins/config-schema/src/components/SchemaView/MetadataView.tsx b/plugins/config-schema/src/components/SchemaView/MetadataView.tsx deleted file mode 100644 index f3de041bed..0000000000 --- a/plugins/config-schema/src/components/SchemaView/MetadataView.tsx +++ /dev/null @@ -1,108 +0,0 @@ -/* - * 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 { JsonValue } from '@backstage/types'; -import Paper from '@material-ui/core/Paper'; -import Table from '@material-ui/core/Table'; -import TableBody from '@material-ui/core/TableBody'; -import TableCell from '@material-ui/core/TableCell'; -import TableRow from '@material-ui/core/TableRow'; -import Typography from '@material-ui/core/Typography'; -import { Schema } from 'jsonschema'; -import React from 'react'; - -export interface MetadataViewRowProps { - label: string; - text?: string; - data?: JsonValue; -} - -export function MetadataViewRow({ label, text, data }: MetadataViewRowProps) { - if (text === undefined && data === undefined) { - return null; - } - return ( - - - - {label} - - - - - {data ? JSON.stringify(data) : text} - - - - ); -} - -export function MetadataView({ schema }: { schema: Schema }) { - return ( - - - - - - {schema.additionalProperties === true && ( - - )} - {schema.additionalItems === true && ( - - )} - - - - - - - - - - - - - - - -
-
- ); -} diff --git a/plugins/config-schema/src/components/SchemaView/ObjectView.tsx b/plugins/config-schema/src/components/SchemaView/ObjectView.tsx deleted file mode 100644 index c7cf000e10..0000000000 --- a/plugins/config-schema/src/components/SchemaView/ObjectView.tsx +++ /dev/null @@ -1,95 +0,0 @@ -/* - * 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 Box from '@material-ui/core/Box'; -import Typography from '@material-ui/core/Typography'; -import React from 'react'; -import { ChildView } from './ChildView'; -import { MetadataView } from './MetadataView'; -import { SchemaViewProps } from './types'; - -function isRequired(name: string, required?: boolean | string[]) { - if (required === true) { - return true; - } - if (Array.isArray(required)) { - return required.includes(name); - } - return false; -} - -export function ObjectView({ path, depth, schema }: SchemaViewProps) { - const properties = Object.entries(schema.properties ?? {}); - const patternProperties = Object.entries(schema.patternProperties ?? {}); - - return ( - <> - {depth > 0 && ( - - {schema.description && ( - - {schema.description} - - )} - - - )} - {properties.length > 0 && ( - <> - {depth > 0 && Properties} - {properties.map(([name, propSchema], index) => ( - - ))} - - )} - {patternProperties.length > 0 && ( - <> - {depth > 0 && ( - Pattern Properties - )} - {patternProperties.map(([name, propSchema], index) => ( - ` : name} - depth={depth + 1} - schema={propSchema} - lastChild={index === patternProperties.length - 1} - required={isRequired(name, schema.required)} - /> - ))} - - )} - {schema.additionalProperties && schema.additionalProperties !== true && ( - <> - Additional Properties - - - )} - - ); -} diff --git a/plugins/config-schema/src/components/SchemaView/ScalarView.tsx b/plugins/config-schema/src/components/SchemaView/ScalarView.tsx deleted file mode 100644 index aeea1c04d7..0000000000 --- a/plugins/config-schema/src/components/SchemaView/ScalarView.tsx +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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 Box from '@material-ui/core/Box'; -import Typography from '@material-ui/core/Typography'; -import React from 'react'; -import { MetadataView } from './MetadataView'; -import { SchemaViewProps } from './types'; - -export function ScalarView({ schema }: SchemaViewProps) { - return ( - <> - {schema.description && ( - - {schema.description} - - )} - - - ); -} diff --git a/plugins/config-schema/src/components/SchemaView/SchemaView.tsx b/plugins/config-schema/src/components/SchemaView/SchemaView.tsx index defb7fc353..d7a8db4f69 100644 --- a/plugins/config-schema/src/components/SchemaView/SchemaView.tsx +++ b/plugins/config-schema/src/components/SchemaView/SchemaView.tsx @@ -14,11 +14,20 @@ * limitations under the License. */ -import React from 'react'; -import { ArrayView } from './ArrayView'; -import { MatchView } from './MatchView'; -import { ObjectView } from './ObjectView'; -import { ScalarView } from './ScalarView'; +import { JsonValue } from '@backstage/types'; +import Box from '@material-ui/core/Box'; +import Chip from '@material-ui/core/Chip'; +import Divider from '@material-ui/core/Divider'; +import Paper from '@material-ui/core/Paper'; +import Table from '@material-ui/core/Table'; +import TableBody from '@material-ui/core/TableBody'; +import TableCell from '@material-ui/core/TableCell'; +import TableRow from '@material-ui/core/TableRow'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; +import { Schema } from 'jsonschema'; +import React, { useEffect, useRef } from 'react'; +import { useScrollTargets } from '../ScrollTargetsContext/ScrollTargetsContext'; import { SchemaViewProps } from './types'; export function SchemaView(props: SchemaViewProps) { @@ -60,3 +69,337 @@ export function SchemaView(props: SchemaViewProps) { return ; } } + +function ArrayView({ path, depth, schema }: SchemaViewProps) { + const itemDepth = depth + 1; + const itemPath = path ? `${path}[]` : '[]'; + const itemSchema = schema.items; + + return ( + <> + + {schema.description && ( + + {schema.description} + + )} + + + Items + + {schema.additionalItems && schema.additionalItems !== true && ( + <> + Additional Items + + + )} + + ); +} + +function isRequired(name: string, required?: boolean | string[]) { + if (required === true) { + return true; + } + if (Array.isArray(required)) { + return required.includes(name); + } + return false; +} + +function ObjectView({ path, depth, schema }: SchemaViewProps) { + const properties = Object.entries(schema.properties ?? {}); + const patternProperties = Object.entries(schema.patternProperties ?? {}); + + return ( + <> + {depth > 0 && ( + + {schema.description && ( + + {schema.description} + + )} + + + )} + {properties.length > 0 && ( + <> + {depth > 0 && Properties} + {properties.map(([name, propSchema], index) => ( + + ))} + + )} + {patternProperties.length > 0 && ( + <> + {depth > 0 && ( + Pattern Properties + )} + {patternProperties.map(([name, propSchema], index) => ( + ` : name} + depth={depth + 1} + schema={propSchema} + lastChild={index === patternProperties.length - 1} + required={isRequired(name, schema.required)} + /> + ))} + + )} + {schema.additionalProperties && schema.additionalProperties !== true && ( + <> + Additional Properties + + + )} + + ); +} + +interface MetadataViewRowProps { + label: string; + text?: string; + data?: JsonValue; +} + +function titleVariant(depth: number) { + if (depth <= 1) { + return 'h2'; + } else if (depth === 2) { + return 'h3'; + } else if (depth === 3) { + return 'h4'; + } else if (depth === 4) { + return 'h5'; + } + return 'h6'; +} + +const useChildViewStyles = makeStyles(theme => ({ + title: { + marginBottom: 0, + }, + chip: { + marginLeft: theme.spacing(1), + marginRight: 0, + marginBottom: 0, + }, +})); + +function ChildView({ + path, + depth, + schema, + required, + lastChild, +}: { + path: string; + depth: number; + schema?: Schema; + required?: boolean; + lastChild?: boolean; +}) { + const classes = useChildViewStyles(); + const titleRef = useRef(null); + const scroll = useScrollTargets(); + + useEffect(() => { + return scroll?.setScrollListener(path, () => { + titleRef.current?.scrollIntoView({ behavior: 'smooth' }); + }); + }, [scroll, path]); + + const chips = new Array(); + const chipProps = { size: 'small' as const, classes: { root: classes.chip } }; + + if (required) { + chips.push( + , + ); + } + + const visibility = (schema as { visibility?: string })?.visibility; + if (visibility === 'frontend') { + chips.push( + , + ); + } else if (visibility === 'secret') { + chips.push( + , + ); + } + + return ( + + + + + + {path} + + {chips.length > 0 && } + {chips} + + {schema && ( + + )} + + + ); +} + +function MatchView({ + path, + depth, + schema, + label, +}: { + path: string; + depth: number; + schema: Schema[]; + label: string; +}) { + return ( + <> + {label} + {schema.map((optionSchema, index) => ( + + ))} + + ); +} + +function ScalarView({ schema }: SchemaViewProps) { + return ( + <> + {schema.description && ( + + {schema.description} + + )} + + + ); +} + +interface MetadataViewRowProps { + label: string; + text?: string; + data?: JsonValue; +} + +function MetadataViewRow({ label, text, data }: MetadataViewRowProps) { + if (text === undefined && data === undefined) { + return null; + } + return ( + + + + {label} + + + + + {data ? JSON.stringify(data) : text} + + + + ); +} + +function MetadataView({ schema }: { schema: Schema }) { + return ( + + + + + + {schema.additionalProperties === true && ( + + )} + {schema.additionalItems === true && ( + + )} + + + + + + + + + + + + + + + +
+
+ ); +} diff --git a/plugins/devtools-backend/CHANGELOG.md b/plugins/devtools-backend/CHANGELOG.md index 26b7e591fa..a634afb3da 100644 --- a/plugins/devtools-backend/CHANGELOG.md +++ b/plugins/devtools-backend/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-devtools-backend +## 0.5.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-devtools-common@0.1.14-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 0.5.0-next.1 ### Minor Changes diff --git a/plugins/devtools-backend/package.json b/plugins/devtools-backend/package.json index 956858b0e6..68c3f78e60 100644 --- a/plugins/devtools-backend/package.json +++ b/plugins/devtools-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools-backend", - "version": "0.5.0-next.1", + "version": "0.5.0-next.2", "backstage": { "role": "backend-plugin", "pluginId": "devtools", diff --git a/plugins/devtools-common/CHANGELOG.md b/plugins/devtools-common/CHANGELOG.md index bfbe305c18..719d0a5dbc 100644 --- a/plugins/devtools-common/CHANGELOG.md +++ b/plugins/devtools-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-devtools-common +## 0.1.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 0.1.13 ### Patch Changes diff --git a/plugins/devtools-common/package.json b/plugins/devtools-common/package.json index cc62fd1d07..713f515400 100644 --- a/plugins/devtools-common/package.json +++ b/plugins/devtools-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools-common", - "version": "0.1.13", + "version": "0.1.14-next.0", "description": "Common functionalities for the devtools plugin", "backstage": { "role": "common-library", diff --git a/plugins/devtools/CHANGELOG.md b/plugins/devtools/CHANGELOG.md index 2d6fba2c73..8aac4d63cb 100644 --- a/plugins/devtools/CHANGELOG.md +++ b/plugins/devtools/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-devtools +## 0.1.22-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/plugin-devtools-common@0.1.14-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + ## 0.1.22-next.1 ### Patch Changes diff --git a/plugins/devtools/package.json b/plugins/devtools/package.json index a5530c7eae..c1ea874878 100644 --- a/plugins/devtools/package.json +++ b/plugins/devtools/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools", - "version": "0.1.22-next.1", + "version": "0.1.22-next.2", "backstage": { "role": "frontend-plugin", "pluginId": "devtools", diff --git a/plugins/events-backend-module-aws-sqs/CHANGELOG.md b/plugins/events-backend-module-aws-sqs/CHANGELOG.md index cf813ac02c..72260d13e4 100644 --- a/plugins/events-backend-module-aws-sqs/CHANGELOG.md +++ b/plugins/events-backend-module-aws-sqs/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-events-backend-module-aws-sqs +## 0.4.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + ## 0.4.6-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-aws-sqs/package.json b/plugins/events-backend-module-aws-sqs/package.json index 4fa57975a7..dd051c85bd 100644 --- a/plugins/events-backend-module-aws-sqs/package.json +++ b/plugins/events-backend-module-aws-sqs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-aws-sqs", - "version": "0.4.6-next.1", + "version": "0.4.6-next.2", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-azure/CHANGELOG.md b/plugins/events-backend-module-azure/CHANGELOG.md index 80c6a9b182..a1072f96f3 100644 --- a/plugins/events-backend-module-azure/CHANGELOG.md +++ b/plugins/events-backend-module-azure/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-azure +## 0.2.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + ## 0.2.15-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-azure/package.json b/plugins/events-backend-module-azure/package.json index c3cecf42b8..2164f96939 100644 --- a/plugins/events-backend-module-azure/package.json +++ b/plugins/events-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-azure", - "version": "0.2.15-next.1", + "version": "0.2.15-next.2", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md index 0185dd7118..1c363bdf7d 100644 --- a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-bitbucket-cloud +## 0.2.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + ## 0.2.15-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-bitbucket-cloud/package.json b/plugins/events-backend-module-bitbucket-cloud/package.json index 71c38bd05c..2d6b86abba 100644 --- a/plugins/events-backend-module-bitbucket-cloud/package.json +++ b/plugins/events-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-bitbucket-cloud", - "version": "0.2.15-next.1", + "version": "0.2.15-next.2", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-gerrit/CHANGELOG.md b/plugins/events-backend-module-gerrit/CHANGELOG.md index 26be191dc7..37fbc34575 100644 --- a/plugins/events-backend-module-gerrit/CHANGELOG.md +++ b/plugins/events-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-gerrit +## 0.2.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + ## 0.2.15-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-gerrit/package.json b/plugins/events-backend-module-gerrit/package.json index b78c285780..5cfd52ee0a 100644 --- a/plugins/events-backend-module-gerrit/package.json +++ b/plugins/events-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gerrit", - "version": "0.2.15-next.1", + "version": "0.2.15-next.2", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-github/CHANGELOG.md b/plugins/events-backend-module-github/CHANGELOG.md index 8a37152557..8cf4a05752 100644 --- a/plugins/events-backend-module-github/CHANGELOG.md +++ b/plugins/events-backend-module-github/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-events-backend-module-github +## 0.2.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + ## 0.2.15-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-github/package.json b/plugins/events-backend-module-github/package.json index 112309cf33..17a920bc3c 100644 --- a/plugins/events-backend-module-github/package.json +++ b/plugins/events-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-github", - "version": "0.2.15-next.1", + "version": "0.2.15-next.2", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-gitlab/CHANGELOG.md b/plugins/events-backend-module-gitlab/CHANGELOG.md index 707ee4f953..33c97e2ba3 100644 --- a/plugins/events-backend-module-gitlab/CHANGELOG.md +++ b/plugins/events-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-events-backend-module-gitlab +## 0.2.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + ## 0.2.15-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-gitlab/package.json b/plugins/events-backend-module-gitlab/package.json index d20065f195..3c28a76c43 100644 --- a/plugins/events-backend-module-gitlab/package.json +++ b/plugins/events-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gitlab", - "version": "0.2.15-next.1", + "version": "0.2.15-next.2", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-test-utils/CHANGELOG.md b/plugins/events-backend-test-utils/CHANGELOG.md index 6b616e2346..f219442710 100644 --- a/plugins/events-backend-test-utils/CHANGELOG.md +++ b/plugins/events-backend-test-utils/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-events-backend-test-utils +## 0.1.39-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.6-next.2 + ## 0.1.39-next.1 ### Patch Changes diff --git a/plugins/events-backend-test-utils/package.json b/plugins/events-backend-test-utils/package.json index 2f3f5e1980..d6c40af29f 100644 --- a/plugins/events-backend-test-utils/package.json +++ b/plugins/events-backend-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-test-utils", - "version": "0.1.39-next.1", + "version": "0.1.39-next.2", "description": "The plugin-events-backend-test-utils for @backstage/plugin-events-node", "backstage": { "role": "node-library", diff --git a/plugins/events-backend/CHANGELOG.md b/plugins/events-backend/CHANGELOG.md index dc65db0745..fe8e168607 100644 --- a/plugins/events-backend/CHANGELOG.md +++ b/plugins/events-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-events-backend +## 0.4.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/backend-openapi-utils@0.4.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + ## 0.4.0-next.1 ### Minor Changes diff --git a/plugins/events-backend/package.json b/plugins/events-backend/package.json index 68f0a0ed62..39d6068d3b 100644 --- a/plugins/events-backend/package.json +++ b/plugins/events-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend", - "version": "0.4.0-next.1", + "version": "0.4.0-next.2", "backstage": { "role": "backend-plugin", "pluginId": "events", diff --git a/plugins/events-node/CHANGELOG.md b/plugins/events-node/CHANGELOG.md index 4867d7c155..a1d6a6114e 100644 --- a/plugins/events-node/CHANGELOG.md +++ b/plugins/events-node/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-events-node +## 0.4.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/types@1.2.0 + ## 0.4.6-next.1 ### Patch Changes diff --git a/plugins/events-node/package.json b/plugins/events-node/package.json index ece517490c..62653d2966 100644 --- a/plugins/events-node/package.json +++ b/plugins/events-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-node", - "version": "0.4.6-next.1", + "version": "0.4.6-next.2", "description": "The plugin-events-node module for @backstage/plugin-events-backend", "backstage": { "role": "node-library", diff --git a/plugins/example-todo-list-backend/CHANGELOG.md b/plugins/example-todo-list-backend/CHANGELOG.md index 9bbed12b56..16018e8305 100644 --- a/plugins/example-todo-list-backend/CHANGELOG.md +++ b/plugins/example-todo-list-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @internal/plugin-todo-list-backend +## 1.0.34-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 1.0.34-next.1 ### Patch Changes diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json index 0c3308584e..d6f796625e 100644 --- a/plugins/example-todo-list-backend/package.json +++ b/plugins/example-todo-list-backend/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list-backend", - "version": "1.0.34-next.1", + "version": "1.0.34-next.2", "backstage": { "role": "backend-plugin", "pluginId": "todo-list", diff --git a/plugins/example-todo-list-common/CHANGELOG.md b/plugins/example-todo-list-common/CHANGELOG.md index be5d7d5096..ad6b7898a2 100644 --- a/plugins/example-todo-list-common/CHANGELOG.md +++ b/plugins/example-todo-list-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @internal/plugin-todo-list-common +## 1.0.23-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 1.0.22 ### Patch Changes diff --git a/plugins/example-todo-list-common/package.json b/plugins/example-todo-list-common/package.json index f9a310ba6c..a06daec424 100644 --- a/plugins/example-todo-list-common/package.json +++ b/plugins/example-todo-list-common/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list-common", - "version": "1.0.22", + "version": "1.0.23-next.0", "backstage": { "role": "common-library", "pluginId": "todo-list", diff --git a/plugins/example-todo-list/CHANGELOG.md b/plugins/example-todo-list/CHANGELOG.md index ba8d7ca11a..7bbc9e46a1 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.34-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + ## 1.0.34-next.1 ### Patch Changes diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json index fda1df0094..bc10e46156 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.34-next.1", + "version": "1.0.34-next.2", "backstage": { "role": "frontend-plugin", "pluginId": "todo-list", diff --git a/plugins/home-react/CHANGELOG.md b/plugins/home-react/CHANGELOG.md index 044b35eeda..28e6d96519 100644 --- a/plugins/home-react/CHANGELOG.md +++ b/plugins/home-react/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-home-react +## 0.1.21-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + ## 0.1.21-next.1 ### Patch Changes diff --git a/plugins/home-react/package.json b/plugins/home-react/package.json index c8ae406c91..c3c93f88f6 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.21-next.1", + "version": "0.1.21-next.2", "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 5479623747..0c08fa3175 100644 --- a/plugins/home/CHANGELOG.md +++ b/plugins/home/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-home +## 0.8.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-home-react@0.1.21-next.2 + ## 0.8.3-next.1 ### Patch Changes diff --git a/plugins/home/package.json b/plugins/home/package.json index 9b8efd2335..f7d5f2ff4a 100644 --- a/plugins/home/package.json +++ b/plugins/home/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-home", - "version": "0.8.3-next.1", + "version": "0.8.3-next.2", "description": "A Backstage plugin that helps you build a home page", "backstage": { "role": "frontend-plugin", diff --git a/plugins/kubernetes-backend/CHANGELOG.md b/plugins/kubernetes-backend/CHANGELOG.md index 23a4dbc6a3..37d7d9dedb 100644 --- a/plugins/kubernetes-backend/CHANGELOG.md +++ b/plugins/kubernetes-backend/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-kubernetes-backend +## 0.19.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-kubernetes-node@0.2.1-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration-aws-node@0.1.14-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 0.19.1-next.1 ### Patch Changes diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index 59b9c4c300..7f55f24417 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-backend", - "version": "0.19.1-next.1", + "version": "0.19.1-next.2", "description": "A Backstage backend plugin that integrates towards Kubernetes", "backstage": { "role": "backend-plugin", diff --git a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts index 3491268d39..ac6a59a7c4 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts @@ -31,6 +31,7 @@ import { registerMswTestHooks, } from '@backstage/backend-test-utils'; import { + CustomResourceFetchResponse, FetchResponse, KubernetesRequestAuth, ObjectsByEntityResponse, @@ -1428,5 +1429,78 @@ describe('KubernetesFanOutHandler', () => { }), ); }); + it('fetch pod metrics when pods used', async () => { + getClustersByEntity.mockImplementation(() => + Promise.resolve({ + clusters: [ + { + name: 'test-cluster', + title: 'cluster-title', + url: '', + authMetadata: {}, + }, + ], + }), + ); + + sut = getKubernetesFanOutHandler([]); + + const resources: CustomResourceFetchResponse[] = [ + { + type: 'customresources', + resources: [ + { + apiVersion: 'v1', + kind: 'Pod', + metadata: { + namespace: `ns-test-component-test-cluster`, + }, + }, + ], + }, + ]; + + fetchObjectsForService.mockImplementation(async () => ({ + responses: resources, + errors: [], + })); + + const result = await sut.getCustomResourcesByEntity( + { + entity, + auth: {}, + customResources: [ + { + group: '', + apiVersion: 'v1', + plural: 'pods', + }, + ], + }, + { credentials: mockCredentials }, + ); + + expect(fetchObjectsForService).toHaveBeenCalledTimes(1); + expect(fetchPodMetricsByNamespaces).toHaveBeenCalledTimes(1); + expect(fetchPodMetricsByNamespaces).toHaveBeenCalledWith( + expect.anything(), + { type: 'anonymous' }, + new Set(['ns-test-component-test-cluster']), + expect.anything(), + ); + expect(result).toStrictEqual({ + items: [ + { + cluster: { + name: 'test-cluster', + title: 'cluster-title', + }, + errors: [], + podMetrics: [POD_METRICS_FIXTURE], + resources, + }, + ], + }); + }); }); }); diff --git a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts index 54a038fffd..31c0c91807 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts @@ -147,7 +147,11 @@ export interface KubernetesFanOutHandlerOptions export interface KubernetesRequestBody extends ObjectsByEntityRequest {} const isPodFetchResponse = (fr: FetchResponse): fr is PodFetchResponse => - fr.type === 'pods'; + fr.type === 'pods' || + (fr.type === 'customresources' && + fr.resources.length > 0 && + fr.resources[0].apiVersion === 'v1' && + fr.resources[0].kind === 'Pod'); const isString = (str: string | undefined): str is string => str !== undefined; const numberOrBigIntToNumberOrString = ( diff --git a/plugins/kubernetes-cluster/CHANGELOG.md b/plugins/kubernetes-cluster/CHANGELOG.md index f25cba07f4..359515568b 100644 --- a/plugins/kubernetes-cluster/CHANGELOG.md +++ b/plugins/kubernetes-cluster/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-kubernetes-cluster +## 0.0.20-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + - @backstage/plugin-kubernetes-react@0.5.2-next.2 + ## 0.0.20-next.1 ### Patch Changes diff --git a/plugins/kubernetes-cluster/package.json b/plugins/kubernetes-cluster/package.json index df03ec1321..29f1e857f5 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.20-next.1", + "version": "0.0.20-next.2", "description": "A Backstage plugin that shows details of Kubernetes clusters", "backstage": { "role": "frontend-plugin", diff --git a/plugins/kubernetes-common/CHANGELOG.md b/plugins/kubernetes-common/CHANGELOG.md index 8766aa9e6d..3b594da93a 100644 --- a/plugins/kubernetes-common/CHANGELOG.md +++ b/plugins/kubernetes-common/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-kubernetes-common +## 0.9.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 0.9.0 ### Minor Changes diff --git a/plugins/kubernetes-common/package.json b/plugins/kubernetes-common/package.json index fe1bb5e154..0f01a38dd4 100644 --- a/plugins/kubernetes-common/package.json +++ b/plugins/kubernetes-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-common", - "version": "0.9.0", + "version": "0.9.1-next.0", "description": "Common functionalities for kubernetes, to be shared between kubernetes and kubernetes-backend plugin", "backstage": { "role": "common-library", diff --git a/plugins/kubernetes-node/CHANGELOG.md b/plugins/kubernetes-node/CHANGELOG.md index 812fb7218f..d4d69efd81 100644 --- a/plugins/kubernetes-node/CHANGELOG.md +++ b/plugins/kubernetes-node/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-kubernetes-node +## 0.2.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + ## 0.2.1-next.1 ### Patch Changes diff --git a/plugins/kubernetes-node/package.json b/plugins/kubernetes-node/package.json index 1a23a35ef2..b15d289766 100644 --- a/plugins/kubernetes-node/package.json +++ b/plugins/kubernetes-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-node", - "version": "0.2.1-next.1", + "version": "0.2.1-next.2", "description": "Node.js library for the kubernetes plugin", "backstage": { "role": "node-library", diff --git a/plugins/kubernetes-react/CHANGELOG.md b/plugins/kubernetes-react/CHANGELOG.md index a76a42894c..902d065b8b 100644 --- a/plugins/kubernetes-react/CHANGELOG.md +++ b/plugins/kubernetes-react/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-kubernetes-react +## 0.5.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + ## 0.5.2-next.1 ### Patch Changes diff --git a/plugins/kubernetes-react/package.json b/plugins/kubernetes-react/package.json index 101e903e3c..f84cc7d881 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.2-next.1", + "version": "0.5.2-next.2", "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 513d5ec768..760c72b323 100644 --- a/plugins/kubernetes/CHANGELOG.md +++ b/plugins/kubernetes/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-kubernetes +## 0.12.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + - @backstage/plugin-kubernetes-react@0.5.2-next.2 + ## 0.12.2-next.1 ### Patch Changes diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index 6336ff286d..b13743f3bf 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes", - "version": "0.12.2-next.1", + "version": "0.12.2-next.2", "description": "A Backstage plugin that integrates towards Kubernetes", "backstage": { "role": "frontend-plugin", diff --git a/plugins/notifications-backend-module-email/CHANGELOG.md b/plugins/notifications-backend-module-email/CHANGELOG.md index dab3c8b735..0fc9419cfc 100644 --- a/plugins/notifications-backend-module-email/CHANGELOG.md +++ b/plugins/notifications-backend-module-email/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-notifications-backend-module-email +## 0.3.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-notifications-node@0.2.10-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration-aws-node@0.1.14-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-notifications-common@0.0.7-next.0 + ## 0.3.4-next.1 ### Patch Changes diff --git a/plugins/notifications-backend-module-email/package.json b/plugins/notifications-backend-module-email/package.json index e534053904..f86214a7c0 100644 --- a/plugins/notifications-backend-module-email/package.json +++ b/plugins/notifications-backend-module-email/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-backend-module-email", - "version": "0.3.4-next.1", + "version": "0.3.4-next.2", "description": "The email backend module for the notifications plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/notifications-backend/CHANGELOG.md b/plugins/notifications-backend/CHANGELOG.md index 9613b6c8d2..f8aab11db2 100644 --- a/plugins/notifications-backend/CHANGELOG.md +++ b/plugins/notifications-backend/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-notifications-backend +## 0.5.0-next.2 + +### Minor Changes + +- fc15b77: **BREAKING**: Removed redundant `/health` endpoint, switch to using [the built-in endpoint instead](https://backstage.io/docs/backend-system/core-services/root-health). + +### Patch Changes + +- fc15b77: Deprecated root '/' endpoints, moving them under `/notifications` instead. +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/plugin-notifications-node@0.2.10-next.2 + - @backstage/plugin-signals-node@0.1.15-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-notifications-common@0.0.7-next.0 + ## 0.4.4-next.1 ### Patch Changes diff --git a/plugins/notifications-backend/README.md b/plugins/notifications-backend/README.md index a6b6615d9f..080f1e746b 100644 --- a/plugins/notifications-backend/README.md +++ b/plugins/notifications-backend/README.md @@ -29,5 +29,5 @@ To be able to do so, `external access` needs to be enabled as described in the [ Once the API can be accessed, the request can look like: ``` -curl -X POST [YOUR_SERVER_URL]/api/notifications -H "Content-Type: application/json" -H "Authorization: Bearer [BASE64_ENCODED_ACCESS_TOKEN]" -d '{"recipients":{"type":"entity","entityRef":"user:development/guest"},"payload": {"title": "Title of user-targeted external message","description": "The description","link": "http://foo.com/bar","severity": "high","topic": "The topic"}}' +curl -X POST [YOUR_SERVER_URL]/api/notifications/notifications -H "Content-Type: application/json" -H "Authorization: Bearer [BASE64_ENCODED_ACCESS_TOKEN]" -d '{"recipients":{"type":"entity","entityRef":"user:development/guest"},"payload": {"title": "Title of user-targeted external message","description": "The description","link": "http://foo.com/bar","severity": "high","topic": "The topic"}}' ``` diff --git a/plugins/notifications-backend/package.json b/plugins/notifications-backend/package.json index e1e3519418..a1ba6a8b54 100644 --- a/plugins/notifications-backend/package.json +++ b/plugins/notifications-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-backend", - "version": "0.4.4-next.1", + "version": "0.5.0-next.2", "backstage": { "role": "backend-plugin", "pluginId": "notifications", diff --git a/plugins/notifications-backend/src/service/router.test.ts b/plugins/notifications-backend/src/service/router.test.ts index 470532b2dc..5126181c4f 100644 --- a/plugins/notifications-backend/src/service/router.test.ts +++ b/plugins/notifications-backend/src/service/router.test.ts @@ -23,7 +23,11 @@ import request from 'supertest'; import { createRouter } from './router'; import { ConfigReader } from '@backstage/config'; import { SignalsService } from '@backstage/plugin-signals-node'; -import { mockCredentials, mockServices } from '@backstage/backend-test-utils'; +import { + mockCredentials, + mockErrorHandler, + mockServices, +} from '@backstage/backend-test-utils'; import { NotificationSendOptions } from '@backstage/plugin-notifications-node'; import { catalogServiceMock } from '@backstage/plugin-catalog-node/testUtils'; @@ -68,26 +72,17 @@ describe('createRouter', () => { auth, catalog, }); - app = express().use(router); + app = express().use(router).use(mockErrorHandler()); }); beforeEach(() => { jest.resetAllMocks(); }); - describe('GET /health', () => { - it('returns ok', async () => { - const response = await request(app).get('/health'); - - expect(response.status).toEqual(200); - expect(response.body).toEqual({ status: 'ok' }); - }); - }); - - describe('POST /', () => { + describe('POST /notifications', () => { const sendNotification = async (data: NotificationSendOptions) => request(app) - .post('/') + .post('/notifications') .send(data) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); diff --git a/plugins/notifications-backend/src/service/router.ts b/plugins/notifications-backend/src/service/router.ts index 88cd1fd337..8a12a53be5 100644 --- a/plugins/notifications-backend/src/service/router.ts +++ b/plugins/notifications-backend/src/service/router.ts @@ -14,8 +14,7 @@ * limitations under the License. */ -import { errorHandler, PluginDatabaseManager } from '@backstage/backend-common'; -import express, { Request } from 'express'; +import express, { Request, Response } from 'express'; import Router from 'express-promise-router'; import { DatabaseNotificationsStore, @@ -31,6 +30,7 @@ import { import { InputError, NotFoundError } from '@backstage/errors'; import { AuthService, + DatabaseService, HttpAuthService, LoggerService, UserInfoService, @@ -53,7 +53,7 @@ import { Config } from '@backstage/config'; export interface RouterOptions { logger: LoggerService; config: Config; - database: PluginDatabaseManager; + database: DatabaseService; auth: AuthService; httpAuth: HttpAuthService; userInfo: UserInfoService; @@ -250,12 +250,7 @@ export async function createRouter( const router = Router(); router.use(express.json()); - router.get('/health', (_, response) => { - logger.info('PONG!'); - response.json({ status: 'ok' }); - }); - - router.get('/', async (req, res) => { + const listNotificationsHandler = async (req: Request, res: Response) => { const user = await getUser(req); const opts: NotificationGetOptions = { user: user, @@ -310,7 +305,10 @@ export async function createRouter( totalCount, notifications, }); - }); + }; + + router.get('/', listNotificationsHandler); // Deprecated endpoint + router.get('/notifications', listNotificationsHandler); router.get('/status', async (req: Request, res) => { const user = await getUser(req); @@ -345,8 +343,7 @@ export async function createRouter( }, ); - // Make sure this is the last "GET" handler - router.get('/:id', async (req, res) => { + const getNotificationHandler = async (req: Request, res: Response) => { const user = await getUser(req); const opts: NotificationGetOptions = { user: user, @@ -358,9 +355,13 @@ export async function createRouter( throw new NotFoundError('Not found'); } res.json(notifications[0]); - }); + }; - router.post('/update', async (req, res) => { + // Make sure this is the last "GET" handler + router.get('/:id', getNotificationHandler); // Deprecated endpoint + router.get('/notifications/:id', getNotificationHandler); + + const updateNotificationsHandler = async (req: Request, res: Response) => { const user = await getUser(req); const { ids, read, saved } = req.body; if (!ids || !Array.isArray(ids)) { @@ -397,7 +398,10 @@ export async function createRouter( const notifications = await store.getNotifications({ ids, user: user }); res.json(notifications); - }); + }; + + router.post('/update', updateNotificationsHandler); // Deprecated endpoint + router.post('/notifications/update', updateNotificationsHandler); const sendBroadcastNotification = async ( baseNotification: Omit, @@ -509,77 +513,79 @@ export async function createRouter( return notifications; }; - // Add new notification - router.post( - '/', - async (req: Request, res) => { - const credentials = await httpAuth.credentials(req, { - allow: ['service'], - }); + const createNotificationHandler = async ( + req: Request, + res: Response, + ) => { + const credentials = await httpAuth.credentials(req, { + allow: ['service'], + }); - const origin = credentials.principal.subject; - const opts = await processOptions(req.body, origin); - const { recipients, payload } = opts; - const { title, link } = payload; - const notifications: Notification[] = []; - let users = []; + const origin = credentials.principal.subject; + const opts = await processOptions(req.body, origin); + const { recipients, payload } = opts; + const { title, link } = payload; + const notifications: Notification[] = []; + let users = []; - if (!recipients || !title) { - logger.error(`Invalid notification request received`); - throw new InputError(`Invalid notification request received`); + if (!recipients || !title) { + logger.error(`Invalid notification request received`); + throw new InputError(`Invalid notification request received`); + } + + if (link) { + try { + validateLink(link); + } catch (e) { + throw new InputError('Invalid link provided', e); } + } - if (link) { - try { - validateLink(link); - } catch (e) { - throw new InputError('Invalid link provided', e); - } - } + const baseNotification = { + payload: { + ...payload, + severity: payload.severity ?? 'normal', + }, + origin, + created: new Date(), + }; - const baseNotification = { - payload: { - ...payload, - severity: payload.severity ?? 'normal', - }, + if (recipients.type === 'broadcast') { + const broadcast = await sendBroadcastNotification( + baseNotification, + opts, origin, - created: new Date(), - }; + ); + notifications.push(broadcast); + } else { + const entityRef = recipients.entityRef; - if (recipients.type === 'broadcast') { - const broadcast = await sendBroadcastNotification( - baseNotification, - opts, - origin, + try { + users = await getUsersForEntityRef( + entityRef, + recipients.excludeEntityRef ?? [], + { auth, catalogClient: catalog }, ); - notifications.push(broadcast); - } else { - const entityRef = recipients.entityRef; - - try { - users = await getUsersForEntityRef( - entityRef, - recipients.excludeEntityRef ?? [], - { auth, catalogClient: catalog }, - ); - } catch (e) { - logger.error(`Failed to resolve notification receivers: ${e}`); - throw new InputError('Failed to resolve notification receivers', e); - } - - const userNotifications = await sendUserNotifications( - baseNotification, - users, - opts, - origin, - ); - notifications.push(...userNotifications); + } catch (e) { + logger.error(`Failed to resolve notification receivers: ${e}`); + throw new InputError('Failed to resolve notification receivers', e); } - res.json(notifications); - }, - ); + const userNotifications = await sendUserNotifications( + baseNotification, + users, + opts, + origin, + ); + notifications.push(...userNotifications); + } + + res.json(notifications); + }; + + // Add new notification + router.post('/', createNotificationHandler); + router.post('/notifications', createNotificationHandler); - router.use(errorHandler()); return router; } diff --git a/plugins/notifications-common/CHANGELOG.md b/plugins/notifications-common/CHANGELOG.md index d5efc02e1a..8b536cc17f 100644 --- a/plugins/notifications-common/CHANGELOG.md +++ b/plugins/notifications-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-notifications-common +## 0.0.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1-next.0 + ## 0.0.6 ### Patch Changes diff --git a/plugins/notifications-common/package.json b/plugins/notifications-common/package.json index 3044b7fe9b..7d5689fb77 100644 --- a/plugins/notifications-common/package.json +++ b/plugins/notifications-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-common", - "version": "0.0.6", + "version": "0.0.7-next.0", "description": "Common functionalities for the notifications plugin", "backstage": { "role": "common-library", diff --git a/plugins/notifications-node/CHANGELOG.md b/plugins/notifications-node/CHANGELOG.md index 817dbda543..d35c6a9c9a 100644 --- a/plugins/notifications-node/CHANGELOG.md +++ b/plugins/notifications-node/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-notifications-node +## 0.2.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-signals-node@0.1.15-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/plugin-notifications-common@0.0.7-next.0 + ## 0.2.10-next.1 ### Patch Changes diff --git a/plugins/notifications-node/package.json b/plugins/notifications-node/package.json index c330e0db58..56db67f3cf 100644 --- a/plugins/notifications-node/package.json +++ b/plugins/notifications-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-node", - "version": "0.2.10-next.1", + "version": "0.2.10-next.2", "description": "Node.js library for the notifications plugin", "backstage": { "role": "node-library", diff --git a/plugins/notifications/CHANGELOG.md b/plugins/notifications/CHANGELOG.md index 111f59eab3..06ce8f8206 100644 --- a/plugins/notifications/CHANGELOG.md +++ b/plugins/notifications/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-notifications +## 0.5.0-next.2 + +### Minor Changes + +- fc15b77: Switched to using the new `/notifications` endpoints. Be sure to update the `notifications` plugin backend before deploying this frontend plugin change. + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/theme@0.6.3-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-notifications-common@0.0.7-next.0 + - @backstage/plugin-signals-react@0.0.8-next.0 + ## 0.4.2-next.1 ### Patch Changes diff --git a/plugins/notifications/package.json b/plugins/notifications/package.json index 5634b44c0e..a2ca6a3f20 100644 --- a/plugins/notifications/package.json +++ b/plugins/notifications/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications", - "version": "0.4.2-next.1", + "version": "0.5.0-next.2", "backstage": { "role": "frontend-plugin", "pluginId": "notifications", diff --git a/plugins/notifications/src/api/NotificationsClient.test.ts b/plugins/notifications/src/api/NotificationsClient.test.ts index f378269e45..8248ea9331 100644 --- a/plugins/notifications/src/api/NotificationsClient.test.ts +++ b/plugins/notifications/src/api/NotificationsClient.test.ts @@ -48,7 +48,7 @@ describe('NotificationsClient', () => { it('should fetch notifications from correct endpoint', async () => { server.use( - rest.get(`${mockBaseUrl}/`, (_, res, ctx) => + rest.get(`${mockBaseUrl}/notifications`, (_, res, ctx) => res(ctx.json(expectedResp)), ), ); @@ -58,7 +58,7 @@ describe('NotificationsClient', () => { it('should fetch notifications with options', async () => { server.use( - rest.get(`${mockBaseUrl}/`, (req, res, ctx) => { + rest.get(`${mockBaseUrl}/notifications`, (req, res, ctx) => { expect(req.url.search).toBe( '?limit=10&offset=0&search=find+me&read=true&createdAfter=1970-01-01T00%3A00%3A00.005Z', ); @@ -77,7 +77,7 @@ describe('NotificationsClient', () => { it('should omit unselected fetch options', async () => { server.use( - rest.get(`${mockBaseUrl}/`, (req, res, ctx) => { + rest.get(`${mockBaseUrl}/notifications`, (req, res, ctx) => { expect(req.url.search).toBe('?limit=10'); return res(ctx.json(expectedResp)); }), @@ -91,7 +91,7 @@ describe('NotificationsClient', () => { it('should fetch single notification', async () => { server.use( - rest.get(`${mockBaseUrl}/:id`, (req, res, ctx) => { + rest.get(`${mockBaseUrl}/notifications/:id`, (req, res, ctx) => { expect(req.params.id).toBe('acdaa8ca-262b-43c1-b74b-de06e5f3b3c7'); return res(ctx.json(testNotification)); }), @@ -115,12 +115,15 @@ describe('NotificationsClient', () => { it('should update notifications', async () => { server.use( - rest.post(`${mockBaseUrl}/update`, async (req, res, ctx) => { - expect(await req.json()).toEqual({ - ids: ['acdaa8ca-262b-43c1-b74b-de06e5f3b3c7'], - }); - return res(ctx.json(expectedResp)); - }), + rest.post( + `${mockBaseUrl}/notifications/update`, + async (req, res, ctx) => { + expect(await req.json()).toEqual({ + ids: ['acdaa8ca-262b-43c1-b74b-de06e5f3b3c7'], + }); + return res(ctx.json(expectedResp)); + }, + ), ); const response = await client.updateNotifications({ ids: ['acdaa8ca-262b-43c1-b74b-de06e5f3b3c7'], diff --git a/plugins/notifications/src/api/NotificationsClient.ts b/plugins/notifications/src/api/NotificationsClient.ts index 983065f96e..5e763ecb8c 100644 --- a/plugins/notifications/src/api/NotificationsClient.ts +++ b/plugins/notifications/src/api/NotificationsClient.ts @@ -71,23 +71,26 @@ export class NotificationsClient implements NotificationsApi { if (options?.minimumSeverity !== undefined) { queryString.append('minimumSeverity', options.minimumSeverity); } - const urlSegment = `?${queryString}`; - return await this.request(urlSegment); + return await this.request( + `/notifications?${queryString}`, + ); } async getNotification(id: string): Promise { - return await this.request(`${id}`); + return await this.request( + `/notifications/${encodeURIComponent(id)}`, + ); } async getStatus(): Promise { - return await this.request('status'); + return await this.request('/status'); } async updateNotifications( options: UpdateNotificationsOptions, ): Promise { - return await this.request('update', { + return await this.request('/notifications/update', { method: 'POST', body: JSON.stringify(options), headers: { 'Content-Type': 'application/json' }, @@ -95,29 +98,27 @@ export class NotificationsClient implements NotificationsApi { } async getNotificationSettings(): Promise { - return await this.request('settings'); + return await this.request('/settings'); } async updateNotificationSettings( settings: NotificationSettings, ): Promise { - return await this.request('settings', { + return await this.request('/settings', { method: 'POST', body: JSON.stringify(settings), headers: { 'Content-Type': 'application/json' }, }); } - private async request(path: string, init?: any): Promise { - const baseUrl = `${await this.discoveryApi.getBaseUrl('notifications')}/`; - const url = new URL(path, baseUrl); + private async request(path: string, init?: RequestInit): Promise { + const baseUrl = await this.discoveryApi.getBaseUrl('notifications'); + const res = await this.fetchApi.fetch(`${baseUrl}${path}`, init); - const response = await this.fetchApi.fetch(url.toString(), init); - - if (!response.ok) { - throw await ResponseError.fromResponse(response); + if (!res.ok) { + throw await ResponseError.fromResponse(res); } - return response.json() as Promise; + return res.json() as Promise; } } diff --git a/plugins/org-react/CHANGELOG.md b/plugins/org-react/CHANGELOG.md index 2527cdfd83..2cdb42440f 100644 --- a/plugins/org-react/CHANGELOG.md +++ b/plugins/org-react/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-org-react +## 0.1.33-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + ## 0.1.33-next.1 ### Patch Changes diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json index 2e2091aa6c..7317cdf019 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.33-next.1", + "version": "0.1.33-next.2", "backstage": { "role": "web-library", "pluginId": "org", diff --git a/plugins/org/CHANGELOG.md b/plugins/org/CHANGELOG.md index 0cf9b74c8f..090168e075 100644 --- a/plugins/org/CHANGELOG.md +++ b/plugins/org/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-org +## 0.6.34-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/plugin-catalog-common@1.1.2-next.0 + ## 0.6.34-next.1 ### Patch Changes diff --git a/plugins/org/package.json b/plugins/org/package.json index 605d766ab8..d5efb6d5d8 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-org", - "version": "0.6.34-next.1", + "version": "0.6.34-next.2", "description": "A Backstage plugin that helps you create entity pages for your organization", "backstage": { "role": "frontend-plugin", diff --git a/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md b/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md index 83b2218ee5..71f4a57fdc 100644 --- a/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md +++ b/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-permission-backend-module-allow-all-policy +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/permission-backend-module-policy-allow-all/package.json b/plugins/permission-backend-module-policy-allow-all/package.json index 0970bd05a1..8ec39d74c7 100644 --- a/plugins/permission-backend-module-policy-allow-all/package.json +++ b/plugins/permission-backend-module-policy-allow-all/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-backend-module-allow-all-policy", - "version": "0.2.3-next.1", + "version": "0.2.3-next.2", "description": "Allow all policy backend module for the permission plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/permission-backend/CHANGELOG.md b/plugins/permission-backend/CHANGELOG.md index 57d7750698..ba1968408a 100644 --- a/plugins/permission-backend/CHANGELOG.md +++ b/plugins/permission-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-permission-backend +## 0.5.52-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 0.5.52-next.1 ### Patch Changes diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json index 605cb35dfc..b358be1cb7 100644 --- a/plugins/permission-backend/package.json +++ b/plugins/permission-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-backend", - "version": "0.5.52-next.1", + "version": "0.5.52-next.2", "backstage": { "role": "backend-plugin", "pluginId": "permission", diff --git a/plugins/permission-common/CHANGELOG.md b/plugins/permission-common/CHANGELOG.md index 6314d92b02..7731cc583e 100644 --- a/plugins/permission-common/CHANGELOG.md +++ b/plugins/permission-common/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-permission-common +## 0.8.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + ## 0.8.2 ### Patch Changes diff --git a/plugins/permission-common/package.json b/plugins/permission-common/package.json index a384550bcd..5ed838a42f 100644 --- a/plugins/permission-common/package.json +++ b/plugins/permission-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-common", - "version": "0.8.2", + "version": "0.8.3-next.0", "description": "Isomorphic types and client for Backstage permissions and authorization", "backstage": { "role": "common-library", diff --git a/plugins/permission-node/CHANGELOG.md b/plugins/permission-node/CHANGELOG.md index 01cfa00d9a..a99a573ad1 100644 --- a/plugins/permission-node/CHANGELOG.md +++ b/plugins/permission-node/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-permission-node +## 0.8.6-next.2 + +### Patch Changes + +- b149e2a: The `createPermissionIntegrationRouter` function now detects and prevents the exposure of duplicate permissions. +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 0.8.6-next.1 ### Patch Changes diff --git a/plugins/permission-node/package.json b/plugins/permission-node/package.json index 94bf4e0ac5..631006daee 100644 --- a/plugins/permission-node/package.json +++ b/plugins/permission-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-node", - "version": "0.8.6-next.1", + "version": "0.8.6-next.2", "description": "Common permission and authorization utilities for backend plugins", "backstage": { "role": "node-library", diff --git a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.test.ts b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.test.ts index 24e1b91065..a38059e547 100644 --- a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.test.ts +++ b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.test.ts @@ -904,7 +904,7 @@ describe('createPermissionIntegrationRouter', () => { const response = await request( express().use( createPermissionIntegrationRouter({ - permissions: [aPermission], + permissions: [aPermission, testPermission], resources: [ { resourceType: 'test-resource', diff --git a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts index 40d215d515..5210e6fb1c 100644 --- a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts +++ b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts @@ -328,11 +328,16 @@ export function createPermissionIntegrationRouter< > ).rules || [], ); - const allPermissions = [ - ...((options as { permissions: Permission[] }).permissions || []), - ...(optionsWithResources.resources?.flatMap(o => o.permissions || []) || - []), - ]; + + const allPermissions = Array.from( + new Map( + [ + ...((options as { permissions: Permission[] }).permissions || []), + ...(optionsWithResources.resources?.flatMap(o => o.permissions || []) || + []), + ].map(i => [i.name, i]), + ).values(), + ); const allResourceTypes = allOptions.reduce((acc, option) => { if ( diff --git a/plugins/permission-react/CHANGELOG.md b/plugins/permission-react/CHANGELOG.md index fa87a388f8..fa68a10367 100644 --- a/plugins/permission-react/CHANGELOG.md +++ b/plugins/permission-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-permission-react +## 0.4.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1-next.0 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 0.4.28 ### Patch Changes diff --git a/plugins/permission-react/package.json b/plugins/permission-react/package.json index a6765949b2..6d7fe9af18 100644 --- a/plugins/permission-react/package.json +++ b/plugins/permission-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-react", - "version": "0.4.28", + "version": "0.4.29-next.0", "backstage": { "role": "web-library", "pluginId": "permission", diff --git a/plugins/proxy-backend/CHANGELOG.md b/plugins/proxy-backend/CHANGELOG.md index 9adc093541..2fe259d217 100644 --- a/plugins/proxy-backend/CHANGELOG.md +++ b/plugins/proxy-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-proxy-backend +## 0.5.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + ## 0.5.9-next.1 ### Patch Changes diff --git a/plugins/proxy-backend/package.json b/plugins/proxy-backend/package.json index 3c23b95c3e..90e52a1367 100644 --- a/plugins/proxy-backend/package.json +++ b/plugins/proxy-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-proxy-backend", - "version": "0.5.9-next.1", + "version": "0.5.9-next.2", "description": "A Backstage backend plugin that helps you set up proxy endpoints in the backend", "backstage": { "role": "backend-plugin", diff --git a/plugins/scaffolder-backend-module-azure/CHANGELOG.md b/plugins/scaffolder-backend-module-azure/CHANGELOG.md index e4e9315dc4..5fe7df4a13 100644 --- a/plugins/scaffolder-backend-module-azure/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-azure/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-azure +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + ## 0.2.4-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-azure/package.json b/plugins/scaffolder-backend-module-azure/package.json index 15d78a9102..4b3b42046f 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.4-next.1", + "version": "0.2.4-next.2", "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 092eb08124..0bfa509d93 100644 --- a/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket-cloud +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-bitbucket-cloud-common@0.2.26-next.1 + ## 0.2.4-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket-cloud/package.json b/plugins/scaffolder-backend-module-bitbucket-cloud/package.json index 970b0d6abd..349e6cc60a 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.4-next.1", + "version": "0.2.4-next.2", "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 d6ff8431a3..af3ec86cb8 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket-server +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + ## 0.2.4-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket-server/package.json b/plugins/scaffolder-backend-module-bitbucket-server/package.json index 0d0a89c521..ef35f60c72 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.4-next.1", + "version": "0.2.4-next.2", "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 dc440b7510..f56a30d4ed 100644 --- a/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket +## 0.3.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.4-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.4-next.2 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + ## 0.3.5-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket/package.json b/plugins/scaffolder-backend-module-bitbucket/package.json index b8d4d25cff..d89b8c660d 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.5-next.1", + "version": "0.3.5-next.2", "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 a593356ba2..abb3df3b1b 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-confluence-to-markdown +## 0.3.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + ## 0.3.4-next.1 ### 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 0a0f81610e..099f9e4bf9 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.4-next.1", + "version": "0.3.4-next.2", "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 352198452a..942a2b2684 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-scaffolder-backend-module-cookiecutter +## 0.3.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/types@1.2.0 + ## 0.3.5-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index 43c78111f8..c36132c064 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.5-next.1", + "version": "0.3.5-next.2", "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 fc9c71d097..cd7a705579 100644 --- a/plugins/scaffolder-backend-module-gcp/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gcp/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-gcp +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + ## 0.2.4-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gcp/package.json b/plugins/scaffolder-backend-module-gcp/package.json index 1bb792fe59..d3ab1865d2 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.4-next.1", + "version": "0.2.4-next.2", "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 1914c68fb1..0d393f9a93 100644 --- a/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-gerrit +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + ## 0.2.4-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gerrit/package.json b/plugins/scaffolder-backend-module-gerrit/package.json index 1f0385538f..1aacbdbaaf 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.4-next.1", + "version": "0.2.4-next.2", "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 9cca747af6..793f1ef556 100644 --- a/plugins/scaffolder-backend-module-gitea/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gitea/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-gitea +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + ## 0.2.4-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gitea/package.json b/plugins/scaffolder-backend-module-gitea/package.json index 7a7d959e47..db2104ac36 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.4-next.1", + "version": "0.2.4-next.2", "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 098cf48194..0cb2dd5d70 100644 --- a/plugins/scaffolder-backend-module-github/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-github/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-scaffolder-backend-module-github +## 0.5.4-next.2 + +### Patch Changes + +- e913fdf: Add github backend module to create-app and improve error messages +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + ## 0.5.4-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-github/package.json b/plugins/scaffolder-backend-module-github/package.json index 5ecdf0ceec..13d5af409a 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.5.4-next.1", + "version": "0.5.4-next.2", "description": "The github module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-github/report.api.md b/plugins/scaffolder-backend-module-github/report.api.md index 547c61768f..e954384444 100644 --- a/plugins/scaffolder-backend-module-github/report.api.md +++ b/plugins/scaffolder-backend-module-github/report.api.md @@ -3,6 +3,7 @@ > 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 { CatalogApi } from '@backstage/catalog-client'; import { Config } from '@backstage/config'; @@ -103,6 +104,7 @@ export function createGithubDeployKeyAction(options: { export function createGithubEnvironmentAction(options: { integrations: ScmIntegrationRegistry; catalogClient?: CatalogApi; + auth?: AuthService; }): TemplateAction< { repoUrl: string; diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.test.ts index 1397942a7c..898e1842f7 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.test.ts @@ -20,6 +20,7 @@ import { TemplateAction } from '@backstage/plugin-scaffolder-node'; import { ConfigReader } from '@backstage/config'; import { ScmIntegrations } from '@backstage/integration'; import { CatalogApi } from '@backstage/catalog-client'; +import { mockCredentials, mockServices } from '@backstage/backend-test-utils'; const mockOctokit = { rest: { @@ -71,6 +72,14 @@ describe('github:environment:create', () => { }); const integrations = ScmIntegrations.fromConfig(config); + + const credentials = mockCredentials.user(); + + const token = mockCredentials.service.token({ + onBehalfOf: credentials, + targetPluginId: 'catalog', + }); + let action: TemplateAction; const mockContext = createMockActionContext({ @@ -78,6 +87,7 @@ describe('github:environment:create', () => { repoUrl: 'github.com?repo=repository&owner=owner', name: 'envname', }, + secrets: { backstageToken: token }, }); beforeEach(() => { @@ -122,6 +132,7 @@ describe('github:environment:create', () => { action = createGithubEnvironmentAction({ integrations, catalogClient: mockCatalogClient as CatalogApi, + auth: mockServices.auth(), }); }); @@ -453,6 +464,13 @@ describe('github:environment:create', () => { }, }); + expect(mockCatalogClient.getEntitiesByRefs).toHaveBeenCalledWith( + { + entityRefs: ['group:default/team-a', 'user:default/johndoe'], + }, + { token }, + ); + expect( mockOctokit.rest.repos.createOrUpdateEnvironment, ).toHaveBeenCalledWith({ diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.ts b/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.ts index 29c0a3ce38..ef59b611fe 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.ts @@ -26,6 +26,7 @@ import Sodium from 'libsodium-wrappers'; import { examples } from './gitHubEnvironment.examples'; import { CatalogApi } from '@backstage/catalog-client'; import { Entity } from '@backstage/catalog-model'; +import { AuthService } from '@backstage/backend-plugin-api'; /** * Creates an `github:environment:create` Scaffolder action that creates a Github Environment. @@ -35,8 +36,9 @@ import { Entity } from '@backstage/catalog-model'; export function createGithubEnvironmentAction(options: { integrations: ScmIntegrationRegistry; catalogClient?: CatalogApi; + auth?: AuthService; }) { - const { integrations, catalogClient } = options; + const { integrations, catalogClient, auth } = options; // For more information on how to define custom actions, see // https://backstage.io/docs/features/software-templates/writing-custom-actions return createTemplateAction<{ @@ -140,7 +142,8 @@ export function createGithubEnvironmentAction(options: { reviewers: { title: 'Reviewers', type: 'array', - description: 'Reviewers for this environment', + description: + 'Reviewers for this environment. Must be a list of Backstage entity references.', items: { type: 'string', }, @@ -163,6 +166,11 @@ export function createGithubEnvironmentAction(options: { reviewers, } = ctx.input; + const { token } = (await auth?.getPluginRequestToken({ + onBehalfOf: await ctx.getInitiatorCredentials(), + targetPluginId: 'catalog', + })) ?? { token: ctx.secrets?.backstageToken }; + // When environment creation step is executed right after a repo publish step, the repository might not be available immediately. // Add a 2-second delay before initiating the steps in this action. await new Promise(resolve => setTimeout(resolve, 2000)); @@ -190,9 +198,14 @@ export function createGithubEnvironmentAction(options: { if (reviewers) { let reviewersEntityRefs: Array = []; // Fetch reviewers from Catalog - const catalogResponse = await catalogClient?.getEntitiesByRefs({ - entityRefs: reviewers, - }); + const catalogResponse = await catalogClient?.getEntitiesByRefs( + { + entityRefs: reviewers, + }, + { + token, + }, + ); if (catalogResponse?.items?.length) { reviewersEntityRefs = catalogResponse.items; } diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubPagesEnable.ts b/plugins/scaffolder-backend-module-github/src/actions/githubPagesEnable.ts index 044005961e..42b9c47030 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubPagesEnable.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubPagesEnable.ts @@ -67,14 +67,13 @@ export function createGithubPagesEnableAction(options: { sourceBranch: { title: 'Source Branch', type: 'string', - description: - 'The the GitHub Pages source branch. Default is "main"', + description: 'The GitHub Pages source branch. Default is "main"', }, sourcePath: { title: 'Source Path', type: 'string', description: - 'The the GitHub Pages source path - "/" or "/docs". Default is "/"', + 'The GitHub Pages source path - "/" or "/docs". Default is "/"', }, token: { title: 'Authorization Token', diff --git a/plugins/scaffolder-backend-module-github/src/actions/helpers.ts b/plugins/scaffolder-backend-module-github/src/actions/helpers.ts index 0ae1cad3fb..b28c35105c 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/helpers.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/helpers.ts @@ -93,7 +93,7 @@ export async function getOctokitOptions(options: { if (!credentialProviderToken) { throw new InputError( - `No token available for host: ${host}, with owner ${owner}, and repo ${repo}`, + `No token available for host: ${host}, with owner ${owner}, and repo ${repo}. Make sure GitHub auth is configured correctly. See https://backstage.io/docs/auth/github/provider for more details.`, ); } diff --git a/plugins/scaffolder-backend-module-github/src/module.ts b/plugins/scaffolder-backend-module-github/src/module.ts index f837ad0456..0387473fdb 100644 --- a/plugins/scaffolder-backend-module-github/src/module.ts +++ b/plugins/scaffolder-backend-module-github/src/module.ts @@ -51,8 +51,9 @@ export const githubModule = createBackendModule({ scaffolder: scaffolderActionsExtensionPoint, config: coreServices.rootConfig, discovery: coreServices.discovery, + auth: coreServices.auth, }, - async init({ scaffolder, config, discovery }) { + async init({ scaffolder, config, discovery, auth }) { const integrations = ScmIntegrations.fromConfig(config); const githubCredentialsProvider = DefaultGithubCredentialsProvider.fromIntegrations(integrations); @@ -75,6 +76,7 @@ export const githubModule = createBackendModule({ createGithubEnvironmentAction({ integrations, catalogClient, + auth, }), createGithubIssuesLabelAction({ integrations, diff --git a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md index bf7f88f11e..87ff348fc6 100644 --- a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-gitlab +## 0.7.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + ## 0.7.0-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gitlab/package.json b/plugins/scaffolder-backend-module-gitlab/package.json index ced90b0dfa..b3244783f9 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.7.0-next.1", + "version": "0.7.0-next.2", "backstage": { "role": "backend-plugin-module", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-backend-module-notifications/CHANGELOG.md b/plugins/scaffolder-backend-module-notifications/CHANGELOG.md index de06f2a966..5a9e37810d 100644 --- a/plugins/scaffolder-backend-module-notifications/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-notifications/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-notifications +## 0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-notifications-node@0.2.10-next.2 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/plugin-notifications-common@0.0.7-next.0 + ## 0.1.5-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-notifications/package.json b/plugins/scaffolder-backend-module-notifications/package.json index 678a77b561..c1ff7c6f0f 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.5-next.1", + "version": "0.1.5-next.2", "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 c92428f2f5..dd877ba2dd 100644 --- a/plugins/scaffolder-backend-module-rails/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-rails/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-scaffolder-backend-module-rails +## 0.5.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/types@1.2.0 + ## 0.5.4-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index e0c85ebdbf..fe0046f17f 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.4-next.1", + "version": "0.5.4-next.2", "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 39992498bf..9c30e449bb 100644 --- a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-sentry +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + ## 0.2.4-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-sentry/package.json b/plugins/scaffolder-backend-module-sentry/package.json index 54ba3f504a..27ace7cec6 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.4-next.1", + "version": "0.2.4-next.2", "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 94ba8564f3..d09b9c097c 100644 --- a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-yeoman +## 0.4.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/plugin-scaffolder-node-test-utils@0.1.17-next.2 + - @backstage/types@1.2.0 + ## 0.4.5-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-yeoman/package.json b/plugins/scaffolder-backend-module-yeoman/package.json index 5781e0bbcf..7afce254e3 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.5-next.1", + "version": "0.4.5-next.2", "backstage": { "role": "backend-plugin-module", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-backend/CHANGELOG.md b/plugins/scaffolder-backend/CHANGELOG.md index 964bfdcf5f..c4e642e793 100644 --- a/plugins/scaffolder-backend/CHANGELOG.md +++ b/plugins/scaffolder-backend/CHANGELOG.md @@ -1,5 +1,40 @@ # @backstage/plugin-scaffolder-backend +## 1.28.0-next.2 + +### Patch Changes + +- dfc8b41: Updated dependency `@opentelemetry/api` to `^1.9.0`. +- 6c326cf: The --no-node-snapshot check needs to be done against process.execArgv instead of process.argv +- e913fdf: Add github backend module to create-app and improve error messages +- 0851834: Resolved an issue where the `templateManagementPermission` was not being exposed through the `/permissions/metadata` endpoint. +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-scaffolder-backend-module-github@0.5.4-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/plugin-scaffolder-backend-module-azure@0.2.4-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.5-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.4-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.4-next.2 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.4-next.2 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.4-next.2 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.7.0-next.2 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/types@1.2.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.26-next.1 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-scaffolder-common@1.5.8-next.1 + ## 1.28.0-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index 98c5c61694..beabffd2b0 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend", - "version": "1.28.0-next.1", + "version": "1.28.0-next.2", "description": "The Backstage backend plugin that helps you create new things", "backstage": { "role": "backend-plugin", diff --git a/plugins/scaffolder-backend/scripts/Cookiecutter.dockerfile b/plugins/scaffolder-backend/scripts/Cookiecutter.dockerfile index 0c8b305de5..fb6f3a1f50 100644 --- a/plugins/scaffolder-backend/scripts/Cookiecutter.dockerfile +++ b/plugins/scaffolder-backend/scripts/Cookiecutter.dockerfile @@ -1,4 +1,4 @@ -FROM alpine:3.20 +FROM alpine:3.21 RUN apk add --update \ git \ diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/TemplateActionRegistry.ts b/plugins/scaffolder-backend/src/scaffolder/actions/TemplateActionRegistry.ts index 3868380919..f00d7afad1 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/TemplateActionRegistry.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/TemplateActionRegistry.ts @@ -37,7 +37,7 @@ export class TemplateActionRegistry { const action = this.actions.get(actionId); if (!action) { throw new NotFoundError( - `Template action with ID '${actionId}' is not registered.`, + `Template action with ID '${actionId}' is not registered. See https://backstage.io/docs/features/software-templates/builtin-actions/ on how to add a new action module.`, ); } return action; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts index 6ddd2e579e..7e204d35df 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts @@ -208,7 +208,7 @@ describe('NunjucksWorkflowRunner', () => { }); await expect(runner.execute(task)).rejects.toThrow( - "Template action with ID 'does-not-exist' is not registered.", + /Template action with ID 'does-not-exist' is not registered/, ); }); diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index d8888058e8..1758eb3fba 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -41,7 +41,7 @@ import { RESOURCE_TYPE_SCAFFOLDER_ACTION, RESOURCE_TYPE_SCAFFOLDER_TEMPLATE, scaffolderActionPermissions, - scaffolderTaskPermissions, + scaffolderPermissions, scaffolderTemplatePermissions, taskCancelPermission, taskCreatePermission, @@ -445,7 +445,7 @@ export async function createRouter( rules: actionRules, }, ], - permissions: scaffolderTaskPermissions, + permissions: scaffolderPermissions, }); router.use(permissionIntegrationRouter); diff --git a/plugins/scaffolder-common/CHANGELOG.md b/plugins/scaffolder-common/CHANGELOG.md index 7f763a710b..183d67cc8c 100644 --- a/plugins/scaffolder-common/CHANGELOG.md +++ b/plugins/scaffolder-common/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-scaffolder-common +## 1.5.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 1.5.8-next.0 ### Patch Changes diff --git a/plugins/scaffolder-common/package.json b/plugins/scaffolder-common/package.json index eecadc853f..34f8469776 100644 --- a/plugins/scaffolder-common/package.json +++ b/plugins/scaffolder-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-common", - "version": "1.5.8-next.0", + "version": "1.5.8-next.1", "description": "Common functionalities for the scaffolder, to be shared between scaffolder and scaffolder-backend plugin", "backstage": { "role": "common-library", diff --git a/plugins/scaffolder-node-test-utils/CHANGELOG.md b/plugins/scaffolder-node-test-utils/CHANGELOG.md index 4b567eaeaa..6ba7bffacd 100644 --- a/plugins/scaffolder-node-test-utils/CHANGELOG.md +++ b/plugins/scaffolder-node-test-utils/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-scaffolder-node-test-utils +## 0.1.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-test-utils@1.2.0-next.2 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/types@1.2.0 + ## 0.1.17-next.1 ### Patch Changes diff --git a/plugins/scaffolder-node-test-utils/package.json b/plugins/scaffolder-node-test-utils/package.json index e0348a5e68..362c69ccb0 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.1.17-next.1", + "version": "0.1.17-next.2", "backstage": { "role": "node-library", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-node/CHANGELOG.md b/plugins/scaffolder-node/CHANGELOG.md index f5ef6683ce..327dbf0741 100644 --- a/plugins/scaffolder-node/CHANGELOG.md +++ b/plugins/scaffolder-node/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-scaffolder-node +## 0.6.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/types@1.2.0 + - @backstage/plugin-scaffolder-common@1.5.8-next.1 + ## 0.6.2-next.1 ### Patch Changes diff --git a/plugins/scaffolder-node/package.json b/plugins/scaffolder-node/package.json index 83eeb51836..e8d52add6b 100644 --- a/plugins/scaffolder-node/package.json +++ b/plugins/scaffolder-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-node", - "version": "0.6.2-next.1", + "version": "0.6.2-next.2", "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 bed2f6d3e5..4efe1d95c8 100644 --- a/plugins/scaffolder-react/CHANGELOG.md +++ b/plugins/scaffolder-react/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-scaffolder-react +## 1.14.2-next.2 + +### Patch Changes + +- 184161f: Scaffolder field extensions registered with `FormFieldBlueprint` are now collected in the `useCustomFieldExtensions` hook, enabling them for use in the scaffolder. +- Updated dependencies + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/theme@0.6.3-next.0 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-permission-react@0.4.29-next.0 + - @backstage/plugin-scaffolder-common@1.5.8-next.1 + ## 1.14.2-next.1 ### Patch Changes diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index ecaea17fb5..208fa93633 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.2-next.1", + "version": "1.14.2-next.2", "description": "A frontend library that helps other Backstage plugins interact with the Scaffolder", "backstage": { "role": "web-library", diff --git a/plugins/scaffolder-react/report-alpha.api.md b/plugins/scaffolder-react/report-alpha.api.md index 2cc8416b3c..4f9f86d1ac 100644 --- a/plugins/scaffolder-react/report-alpha.api.md +++ b/plugins/scaffolder-react/report-alpha.api.md @@ -5,13 +5,17 @@ ```ts /// +import { AnyApiFactory } from '@backstage/frontend-plugin-api'; import { AnyApiRef } from '@backstage/core-plugin-api'; import { ApiHolder } from '@backstage/core-plugin-api'; +import { ApiRef } from '@backstage/frontend-plugin-api'; import { ComponentType } from 'react'; import { ConfigurableExtensionDataRef } from '@backstage/frontend-plugin-api'; import { CustomFieldValidator } from '@backstage/plugin-scaffolder-react'; import { Dispatch } from 'react'; import { ExtensionBlueprint } from '@backstage/frontend-plugin-api'; +import { ExtensionDefinition } from '@backstage/frontend-plugin-api'; +import { ExtensionInput } from '@backstage/frontend-plugin-api'; import { FieldExtensionComponentProps } from '@backstage/plugin-scaffolder-react'; import { FieldExtensionOptions } from '@backstage/plugin-scaffolder-react'; import { FieldSchema } from '@backstage/plugin-scaffolder-react'; @@ -171,6 +175,34 @@ export type FormFieldExtensionData< schema?: FieldSchema, z.output>; }; +// @alpha (undocumented) +export const formFieldsApi: ExtensionDefinition<{ + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef; + inputs: { + formFields: ExtensionInput< + ConfigurableExtensionDataRef< + () => Promise, + 'scaffolder.form-field-loader', + {} + >, + { + singleton: false; + optional: false; + } + >; + }; + kind: 'api'; + name: 'form-fields'; + params: { + factory: AnyApiFactory; + }; +}>; + +// @alpha (undocumented) +export const formFieldsApiRef: ApiRef; + // @alpha (undocumented) export type FormValidation = { [name: string]: FieldValidation | FormValidation; @@ -245,6 +277,12 @@ export type ScaffolderFormDecoratorContext< ) => void; }; +// @alpha (undocumented) +export interface ScaffolderFormFieldsApi { + // (undocumented) + getFormFields(): Promise; +} + // @alpha (undocumented) export function ScaffolderPageContextMenu( props: ScaffolderPageContextMenuProps, diff --git a/plugins/scaffolder-react/src/hooks/useCustomFieldExtensions.test.tsx b/plugins/scaffolder-react/src/hooks/useCustomFieldExtensions.test.tsx new file mode 100644 index 0000000000..c21d43d6ff --- /dev/null +++ b/plugins/scaffolder-react/src/hooks/useCustomFieldExtensions.test.tsx @@ -0,0 +1,129 @@ +/* + * 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 React, { PropsWithChildren } from 'react'; +import { createPlugin } from '@backstage/core-plugin-api'; +import { TestApiProvider, wrapInTestApp } from '@backstage/test-utils'; +import { renderHook, waitFor } from '@testing-library/react'; +import { ScaffolderFormFieldsApi, formFieldsApiRef } from '../alpha'; +import { useCustomFieldExtensions } from './useCustomFieldExtensions'; +import { + ScaffolderFieldExtensions, + createScaffolderFieldExtension, +} from '../extensions'; + +const plugin = createPlugin({ + id: 'scaffolder', + apis: [], + routes: {}, + externalRoutes: {}, +}); + +describe('useCustomFieldExtensions', () => { + const mockFormFieldsApi: jest.Mocked = { + getFormFields: jest.fn(), + }; + const wrapper = ({ children }: PropsWithChildren<{}>) => + wrapInTestApp( + + {children} + , + ); + + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('should return field extensions from the React tree', async () => { + mockFormFieldsApi.getFormFields.mockResolvedValue([]); + const CustomFieldExtension = plugin.provide( + createScaffolderFieldExtension({ + name: 'test', + component: () =>
Test
, + }), + ); + + const { result } = renderHook( + () => + useCustomFieldExtensions( + + + , + ), + { + wrapper, + }, + ); + + expect(result.current).toEqual([expect.objectContaining({ name: 'test' })]); + }); + + it('should return field extensions from formFieldsApi', async () => { + mockFormFieldsApi.getFormFields.mockResolvedValue([ + { + name: 'blueprint', + component: () =>
Test
, + }, + ]); + + const { result } = renderHook(() => useCustomFieldExtensions(
), { + wrapper, + }); + + await waitFor(() => { + expect(result.current.length).toBeGreaterThan(0); + }); + + expect(result.current).toEqual([ + expect.objectContaining({ name: 'blueprint' }), + ]); + }); + + it('should return field extensions from both sources', async () => { + mockFormFieldsApi.getFormFields.mockResolvedValue([ + { + name: 'blueprint', + component: () =>
Test
, + }, + ]); + + const CustomFieldExtension = plugin.provide( + createScaffolderFieldExtension({ + name: 'test', + component: () =>
Test
, + }), + ); + + const { result } = renderHook( + () => + useCustomFieldExtensions( + + + , + ), + { + wrapper, + }, + ); + + await waitFor(() => { + expect(result.current).toHaveLength(2); + }); + + const fieldNames = result.current.map(field => field.name); + expect(fieldNames).toEqual(expect.arrayContaining(['test', 'blueprint'])); + }); +}); diff --git a/plugins/scaffolder-react/src/hooks/useCustomFieldExtensions.ts b/plugins/scaffolder-react/src/hooks/useCustomFieldExtensions.ts index 7e0aafd53f..d1e670330e 100644 --- a/plugins/scaffolder-react/src/hooks/useCustomFieldExtensions.ts +++ b/plugins/scaffolder-react/src/hooks/useCustomFieldExtensions.ts @@ -13,7 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { useElementFilter } from '@backstage/core-plugin-api'; +import { useAsync, useMountEffect } from '@react-hookz/web'; +import { useApi, useElementFilter } from '@backstage/core-plugin-api'; +import { formFieldsApiRef } from '../next'; import { FieldExtensionOptions } from '../extensions'; import { FIELD_EXTENSION_KEY, @@ -25,11 +27,21 @@ import { * @public */ export const useCustomFieldExtensions = < + // todo(blam): this shouldn't be here, should remove this, but this is a breaking change to remove the generic. TComponentDataType = FieldExtensionOptions, >( outlet: React.ReactNode, ) => { - return useElementFilter(outlet, elements => + // Get custom fields created with FormFieldBlueprint + const formFieldsApi = useApi(formFieldsApiRef); + const [{ result: blueprintFields }, methods] = useAsync( + formFieldsApi.getFormFields, + [], + ); + useMountEffect(methods.execute); + + // Get custom fields created with ScaffolderFieldExtensions + const outletFields = useElementFilter(outlet, elements => elements .selectByComponentData({ key: FIELD_EXTENSION_WRAPPER_KEY, @@ -38,4 +50,18 @@ export const useCustomFieldExtensions = < key: FIELD_EXTENSION_KEY, }), ); + + // This should really be a different type moving foward, but we do this to keep type compatibility. + // should probably also move the defaults into the API eventually too, but that will come with the move + // to the new frontend system. + const blueprintsToLegacy: FieldExtensionOptions[] = blueprintFields?.map( + field => ({ + component: field.component, + name: field.name, + validation: field.validation, + schema: field.schema?.schema, + }), + ); + + return [...blueprintsToLegacy, ...outletFields] as TComponentDataType[]; }; diff --git a/plugins/scaffolder/src/alpha/api/FormFieldsApi.ts b/plugins/scaffolder-react/src/next/api/FormFieldsApi.ts similarity index 95% rename from plugins/scaffolder/src/alpha/api/FormFieldsApi.ts rename to plugins/scaffolder-react/src/next/api/FormFieldsApi.ts index 35141463d5..7712b91a18 100644 --- a/plugins/scaffolder/src/alpha/api/FormFieldsApi.ts +++ b/plugins/scaffolder-react/src/next/api/FormFieldsApi.ts @@ -21,7 +21,7 @@ import { } from '@backstage/frontend-plugin-api'; import { formFieldsApiRef } from './ref'; import { ScaffolderFormFieldsApi } from './types'; -import { FormFieldBlueprint } from '@backstage/plugin-scaffolder-react/alpha'; +import { FormFieldBlueprint } from '../blueprints'; import { FormField, OpaqueFormField } from '@internal/scaffolder'; class DefaultScaffolderFormFieldsApi implements ScaffolderFormFieldsApi { @@ -40,6 +40,7 @@ class DefaultScaffolderFormFieldsApi implements ScaffolderFormFieldsApi { } } +/** @alpha */ export const formFieldsApi = ApiBlueprint.makeWithOverrides({ name: 'form-fields', inputs: { diff --git a/plugins/scaffolder-react/src/next/api/index.ts b/plugins/scaffolder-react/src/next/api/index.ts new file mode 100644 index 0000000000..ecc62e5acf --- /dev/null +++ b/plugins/scaffolder-react/src/next/api/index.ts @@ -0,0 +1,19 @@ +/* + * 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. + */ + +export { formFieldsApi } from './FormFieldsApi'; +export { formFieldsApiRef } from './ref'; +export type { ScaffolderFormFieldsApi } from './types'; diff --git a/plugins/scaffolder-react/src/next/api/ref.ts b/plugins/scaffolder-react/src/next/api/ref.ts new file mode 100644 index 0000000000..eaa6f49c21 --- /dev/null +++ b/plugins/scaffolder-react/src/next/api/ref.ts @@ -0,0 +1,23 @@ +/* + * 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 { createApiRef } from '@backstage/frontend-plugin-api'; +import { ScaffolderFormFieldsApi } from './types'; + +/** @alpha */ +export const formFieldsApiRef = createApiRef({ + id: 'plugin.scaffolder.form-fields', +}); diff --git a/packages/canon/docs/components/Columns/columns.css.ts b/plugins/scaffolder-react/src/next/api/types.ts similarity index 77% rename from packages/canon/docs/components/Columns/columns.css.ts rename to plugins/scaffolder-react/src/next/api/types.ts index 0b5ec18aef..2c98111b1c 100644 --- a/packages/canon/docs/components/Columns/columns.css.ts +++ b/plugins/scaffolder-react/src/next/api/types.ts @@ -14,11 +14,9 @@ * limitations under the License. */ -import { style } from '@vanilla-extract/css'; +import { FormFieldExtensionData } from '../blueprints'; -export const styles = style({ - display: 'grid', - gridTemplateColumns: 'repeat(3, 1fr)', - rowGap: '20px', - columnGap: '80px', -}); +/** @alpha */ +export interface ScaffolderFormFieldsApi { + getFormFields(): Promise; +} diff --git a/plugins/scaffolder-react/src/next/index.ts b/plugins/scaffolder-react/src/next/index.ts index c4e94f36a3..9c967a5db9 100644 --- a/plugins/scaffolder-react/src/next/index.ts +++ b/plugins/scaffolder-react/src/next/index.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +export * from './api'; export * from './components'; export * from './lib'; export * from './hooks'; diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md index e4c99d833d..98f1eb2f0b 100644 --- a/plugins/scaffolder/CHANGELOG.md +++ b/plugins/scaffolder/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-scaffolder +## 1.27.2-next.2 + +### Patch Changes + +- 184161f: Scaffolder field extensions registered with `FormFieldBlueprint` are now collected in the `useCustomFieldExtensions` hook, enabling them for use in the scaffolder. +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/plugin-scaffolder-react@1.14.2-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + - @backstage/plugin-scaffolder-common@1.5.8-next.1 + ## 1.27.2-next.1 ### Patch Changes diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index 2f32b1ccd9..96f189506d 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder", - "version": "1.27.2-next.1", + "version": "1.27.2-next.2", "description": "The Backstage plugin that helps you create new things", "backstage": { "role": "frontend-plugin", diff --git a/plugins/scaffolder/report-alpha.api.md b/plugins/scaffolder/report-alpha.api.md index 15ec32fa49..e272b57655 100644 --- a/plugins/scaffolder/report-alpha.api.md +++ b/plugins/scaffolder/report-alpha.api.md @@ -14,7 +14,7 @@ import { ExtensionInput } from '@backstage/frontend-plugin-api'; import { ExternalRouteRef } from '@backstage/frontend-plugin-api'; import { FieldExtensionOptions } from '@backstage/plugin-scaffolder-react'; import { FormField } from '@internal/scaffolder'; -import { FormFieldExtensionData } from '@backstage/plugin-scaffolder-react/alpha'; +import { formFieldsApiRef } from '@backstage/plugin-scaffolder-react/alpha'; import type { FormProps as FormProps_2 } from '@rjsf/core'; import { FormProps as FormProps_3 } from '@backstage/plugin-scaffolder-react'; import { FrontendPlugin } from '@backstage/frontend-plugin-api'; @@ -26,6 +26,7 @@ import { default as React_2 } from 'react'; import { ReviewStepProps } from '@backstage/plugin-scaffolder-react'; import { RouteRef } from '@backstage/frontend-plugin-api'; import { ScaffolderFormDecorator } from '@backstage/plugin-scaffolder-react/alpha'; +import { ScaffolderFormFieldsApi } from '@backstage/plugin-scaffolder-react/alpha'; import { SubRouteRef } from '@backstage/frontend-plugin-api'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; import { TemplateGroupFilter } from '@backstage/plugin-scaffolder-react'; @@ -52,6 +53,33 @@ const _default: FrontendPlugin< }>; }, { + 'api:scaffolder/form-fields': ExtensionDefinition<{ + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; + inputs: { + formFields: ExtensionInput< + ConfigurableExtensionDataRef< + () => Promise, + 'scaffolder.form-field-loader', + {} + >, + { + singleton: false; + optional: false; + } + >; + }; + kind: 'api'; + name: 'form-fields'; + params: { + factory: AnyApiFactory; + }; + }>; 'page:scaffolder': ExtensionDefinition<{ kind: 'page'; name: undefined; @@ -129,33 +157,6 @@ const _default: FrontendPlugin< factory: AnyApiFactory; }; }>; - 'api:scaffolder/form-fields': ExtensionDefinition<{ - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - AnyApiFactory, - 'core.api.factory', - {} - >; - inputs: { - formFields: ExtensionInput< - ConfigurableExtensionDataRef< - () => Promise, - 'scaffolder.form-field-loader', - {} - >, - { - singleton: false; - optional: false; - } - >; - }; - kind: 'api'; - name: 'form-fields'; - params: { - factory: AnyApiFactory; - }; - }>; } >; export default _default; @@ -175,8 +176,7 @@ export class DefaultScaffolderFormDecoratorsApi // @alpha (undocumented) export const formDecoratorsApiRef: ApiRef; -// @alpha (undocumented) -export const formFieldsApiRef: ApiRef; +export { formFieldsApiRef }; // @alpha @deprecated export type FormProps = Pick< @@ -197,11 +197,7 @@ export interface ScaffolderFormDecoratorsApi { getFormDecorators(): Promise; } -// @alpha (undocumented) -export interface ScaffolderFormFieldsApi { - // (undocumented) - getFormFields(): Promise; -} +export { ScaffolderFormFieldsApi }; // @public (undocumented) export type ScaffolderTemplateEditorClassKey = diff --git a/plugins/scaffolder/src/alpha/api/index.ts b/plugins/scaffolder/src/alpha/api/index.ts index 0afefe17a5..07d4b65a3b 100644 --- a/plugins/scaffolder/src/alpha/api/index.ts +++ b/plugins/scaffolder/src/alpha/api/index.ts @@ -14,9 +14,6 @@ * limitations under the License. */ -export { formFieldsApiRef, formDecoratorsApiRef } from './ref'; -export type { - ScaffolderFormFieldsApi, - ScaffolderFormDecoratorsApi, -} from './types'; +export { formDecoratorsApiRef } from './ref'; +export type { ScaffolderFormDecoratorsApi } from './types'; export { DefaultScaffolderFormDecoratorsApi } from './FormDecoratorsApi'; diff --git a/plugins/scaffolder/src/alpha/api/ref.ts b/plugins/scaffolder/src/alpha/api/ref.ts index 9890a9a9b2..532669d0ad 100644 --- a/plugins/scaffolder/src/alpha/api/ref.ts +++ b/plugins/scaffolder/src/alpha/api/ref.ts @@ -15,12 +15,7 @@ */ import { createApiRef } from '@backstage/frontend-plugin-api'; -import { ScaffolderFormFieldsApi, ScaffolderFormDecoratorsApi } from './types'; - -/** @alpha */ -export const formFieldsApiRef = createApiRef({ - id: 'plugin.scaffolder.form-fields', -}); +import { ScaffolderFormDecoratorsApi } from './types'; /** @alpha */ export const formDecoratorsApiRef = createApiRef({ diff --git a/plugins/scaffolder/src/alpha/api/types.ts b/plugins/scaffolder/src/alpha/api/types.ts index 10f97a6a10..1d2d331adf 100644 --- a/plugins/scaffolder/src/alpha/api/types.ts +++ b/plugins/scaffolder/src/alpha/api/types.ts @@ -14,15 +14,7 @@ * limitations under the License. */ -import { - FormFieldExtensionData, - ScaffolderFormDecorator, -} from '@backstage/plugin-scaffolder-react/alpha'; - -/** @alpha */ -export interface ScaffolderFormFieldsApi { - getFormFields(): Promise; -} +import { ScaffolderFormDecorator } from '@backstage/plugin-scaffolder-react/alpha'; /** @alpha */ export interface ScaffolderFormDecoratorsApi { diff --git a/plugins/scaffolder/src/alpha/index.ts b/plugins/scaffolder/src/alpha/index.ts index 53e2b8f0bf..d239f44b4f 100644 --- a/plugins/scaffolder/src/alpha/index.ts +++ b/plugins/scaffolder/src/alpha/index.ts @@ -25,4 +25,9 @@ export { export { scaffolderTranslationRef } from '../translation'; export * from './api'; +export { + formFieldsApiRef, + type ScaffolderFormFieldsApi, +} from '@backstage/plugin-scaffolder-react/alpha'; + export { default } from './plugin'; diff --git a/plugins/scaffolder/src/alpha/plugin.tsx b/plugins/scaffolder/src/alpha/plugin.tsx index f3f0e9ed9e..44ec1f5d4c 100644 --- a/plugins/scaffolder/src/alpha/plugin.tsx +++ b/plugins/scaffolder/src/alpha/plugin.tsx @@ -32,7 +32,7 @@ import { scaffolderPage, scaffolderApi, } from './extensions'; -import { formFieldsApi } from './api/FormFieldsApi'; +import { formFieldsApi } from '@backstage/plugin-scaffolder-react/alpha'; /** @alpha */ export default createFrontendPlugin({ diff --git a/plugins/scaffolder/src/components/Router/Router.test.tsx b/plugins/scaffolder/src/components/Router/Router.test.tsx index c062c723cf..9c752ed3c1 100644 --- a/plugins/scaffolder/src/components/Router/Router.test.tsx +++ b/plugins/scaffolder/src/components/Router/Router.test.tsx @@ -15,7 +15,11 @@ */ import React from 'react'; import { Router } from './Router'; -import { renderInTestApp } from '@backstage/test-utils'; +import { + renderInTestApp, + TestApiProvider, + TestAppOptions, +} from '@backstage/test-utils'; import { createScaffolderFieldExtension, ScaffolderFieldExtensions, @@ -26,12 +30,26 @@ import { ScaffolderLayouts, } from '@backstage/plugin-scaffolder-react'; import { TemplateListPage, TemplateWizardPage } from '../../alpha/components'; +import { formFieldsApiRef } from '@backstage/plugin-scaffolder-react/alpha'; jest.mock('../../alpha/components', () => ({ TemplateWizardPage: jest.fn(() => null), TemplateListPage: jest.fn(() => null), })); +const wrapInApisAndRender = ( + element: React.ReactElement, + opts?: TestAppOptions, +) => + renderInTestApp( + [] }]]} + > + {element} + , + opts, + ); + describe('Router', () => { beforeEach(() => { (TemplateWizardPage as jest.Mock).mockClear(); @@ -39,13 +57,13 @@ describe('Router', () => { }); describe('/', () => { it('should render the TemplateListPage', async () => { - await renderInTestApp(); + await wrapInApisAndRender(); expect(TemplateListPage).toHaveBeenCalled(); }); it('should render user-provided TemplateListPage', async () => { - const { getByText } = await renderInTestApp( + const { getByText } = await wrapInApisAndRender( <>foobar, @@ -62,7 +80,7 @@ describe('Router', () => { describe('/templates/:templateName', () => { it('should render the TemplateWizard page', async () => { - await renderInTestApp(, { + await wrapInApisAndRender(, { routeEntries: ['/templates/default/foo'], }); @@ -70,7 +88,7 @@ describe('Router', () => { }); it('should render user-provided TemplateWizardPage', async () => { - const { getByText } = await renderInTestApp( + const { getByText } = await wrapInApisAndRender( <>foobar, @@ -87,13 +105,14 @@ describe('Router', () => { it('should pass through the FormProps property', async () => { const transformErrorsMock = jest.fn(); - await renderInTestApp( + await wrapInApisAndRender( , + { routeEntries: ['/templates/default/foo'], }, @@ -118,7 +137,7 @@ describe('Router', () => { }), ); - await renderInTestApp( + await wrapInApisAndRender( @@ -146,7 +165,7 @@ describe('Router', () => { }), ); - await renderInTestApp( + await wrapInApisAndRender( diff --git a/plugins/scaffolder/src/plugin.tsx b/plugins/scaffolder/src/plugin.tsx index a6ccdef32c..17592b5826 100644 --- a/plugins/scaffolder/src/plugin.tsx +++ b/plugins/scaffolder/src/plugin.tsx @@ -80,6 +80,7 @@ import { RepoBranchPicker } from './components/fields/RepoBranchPicker/RepoBranc import { RepoBranchPickerSchema } from './components/fields/RepoBranchPicker/schema'; import { formDecoratorsApiRef } from './alpha/api/ref'; import { DefaultScaffolderFormDecoratorsApi } from './alpha/api/FormDecoratorsApi'; +import { formFieldsApiRef } from '@backstage/plugin-scaffolder-react/alpha'; /** * The main plugin export for the scaffolder. @@ -109,6 +110,11 @@ export const scaffolderPlugin = createPlugin({ deps: {}, factory: () => DefaultScaffolderFormDecoratorsApi.create(), }), + createApiFactory({ + api: formFieldsApiRef, + deps: {}, + factory: () => ({ getFormFields: async () => [] }), + }), ], routes: { root: rootRouteRef, diff --git a/plugins/search-backend-module-catalog/CHANGELOG.md b/plugins/search-backend-module-catalog/CHANGELOG.md index 50426ca6d4..cc3e8edf26 100644 --- a/plugins/search-backend-module-catalog/CHANGELOG.md +++ b/plugins/search-backend-module-catalog/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-search-backend-module-catalog +## 0.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + ## 0.2.6-next.1 ### Patch Changes diff --git a/plugins/search-backend-module-catalog/package.json b/plugins/search-backend-module-catalog/package.json index 1f96cbbcdd..c25990cee0 100644 --- a/plugins/search-backend-module-catalog/package.json +++ b/plugins/search-backend-module-catalog/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-catalog", - "version": "0.2.6-next.1", + "version": "0.2.6-next.2", "description": "A module for the search backend that exports catalog modules", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-elasticsearch/CHANGELOG.md b/plugins/search-backend-module-elasticsearch/CHANGELOG.md index d8c78dcb85..4e6344382b 100644 --- a/plugins/search-backend-module-elasticsearch/CHANGELOG.md +++ b/plugins/search-backend-module-elasticsearch/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-search-backend-module-elasticsearch +## 1.6.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration-aws-node@0.1.14-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + ## 1.6.3-next.1 ### Patch Changes diff --git a/plugins/search-backend-module-elasticsearch/package.json b/plugins/search-backend-module-elasticsearch/package.json index 81edcc9a3f..b53dd1f095 100644 --- a/plugins/search-backend-module-elasticsearch/package.json +++ b/plugins/search-backend-module-elasticsearch/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-elasticsearch", - "version": "1.6.3-next.1", + "version": "1.6.3-next.2", "description": "A module for the search backend that implements search using ElasticSearch", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-explore/CHANGELOG.md b/plugins/search-backend-module-explore/CHANGELOG.md index e6fbe40fe0..ba73639260 100644 --- a/plugins/search-backend-module-explore/CHANGELOG.md +++ b/plugins/search-backend-module-explore/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-search-backend-module-explore +## 0.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + ## 0.2.6-next.1 ### Patch Changes diff --git a/plugins/search-backend-module-explore/package.json b/plugins/search-backend-module-explore/package.json index 481ba5326e..6adf7c2dd3 100644 --- a/plugins/search-backend-module-explore/package.json +++ b/plugins/search-backend-module-explore/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-explore", - "version": "0.2.6-next.1", + "version": "0.2.6-next.2", "description": "A module for the search backend that exports explore modules", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-pg/CHANGELOG.md b/plugins/search-backend-module-pg/CHANGELOG.md index fe223ee285..c922d8ac0e 100644 --- a/plugins/search-backend-module-pg/CHANGELOG.md +++ b/plugins/search-backend-module-pg/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-search-backend-module-pg +## 0.5.39-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + ## 0.5.39-next.1 ### Patch Changes diff --git a/plugins/search-backend-module-pg/package.json b/plugins/search-backend-module-pg/package.json index eb57d59afc..cc9ee21240 100644 --- a/plugins/search-backend-module-pg/package.json +++ b/plugins/search-backend-module-pg/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-pg", - "version": "0.5.39-next.1", + "version": "0.5.39-next.2", "description": "A module for the search backend that implements search using PostgreSQL", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md b/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md index f999456842..15d4ca465b 100644 --- a/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md +++ b/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-search-backend-module-stack-overflow-collator +## 0.3.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + ## 0.3.4-next.1 ### Patch Changes diff --git a/plugins/search-backend-module-stack-overflow-collator/package.json b/plugins/search-backend-module-stack-overflow-collator/package.json index 531c9d9e6b..6138afa68d 100644 --- a/plugins/search-backend-module-stack-overflow-collator/package.json +++ b/plugins/search-backend-module-stack-overflow-collator/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-stack-overflow-collator", - "version": "0.3.4-next.1", + "version": "0.3.4-next.2", "description": "A module for the search backend that exports stack overflow modules", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-techdocs/CHANGELOG.md b/plugins/search-backend-module-techdocs/CHANGELOG.md index 23b303dafb..6c95c3a9e0 100644 --- a/plugins/search-backend-module-techdocs/CHANGELOG.md +++ b/plugins/search-backend-module-techdocs/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-search-backend-module-techdocs +## 0.3.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-techdocs-node@1.12.15-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + ## 0.3.4-next.1 ### Patch Changes diff --git a/plugins/search-backend-module-techdocs/package.json b/plugins/search-backend-module-techdocs/package.json index b6c211dcfd..e519fbc483 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.3.4-next.1", + "version": "0.3.4-next.2", "description": "A module for the search backend that exports techdocs modules", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-node/CHANGELOG.md b/plugins/search-backend-node/CHANGELOG.md index cfda048db9..a1ad348d43 100644 --- a/plugins/search-backend-node/CHANGELOG.md +++ b/plugins/search-backend-node/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-search-backend-node +## 1.3.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + ## 1.3.6-next.1 ### Patch Changes diff --git a/plugins/search-backend-node/package.json b/plugins/search-backend-node/package.json index 3183045d78..be0dedcee6 100644 --- a/plugins/search-backend-node/package.json +++ b/plugins/search-backend-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-node", - "version": "1.3.6-next.1", + "version": "1.3.6-next.2", "description": "A library for Backstage backend plugins that want to interact with the search backend plugin", "backstage": { "role": "node-library", diff --git a/plugins/search-backend/CHANGELOG.md b/plugins/search-backend/CHANGELOG.md index 8942ebc723..4ff7f3d774 100644 --- a/plugins/search-backend/CHANGELOG.md +++ b/plugins/search-backend/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-search-backend +## 1.8.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/backend-openapi-utils@0.4.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + ## 1.8.0-next.1 ### Minor Changes diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index acd16f671f..b64ab4d306 100644 --- a/plugins/search-backend/package.json +++ b/plugins/search-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend", - "version": "1.8.0-next.1", + "version": "1.8.0-next.2", "description": "The Backstage backend plugin that provides your backstage app with search", "backstage": { "role": "backend-plugin", diff --git a/plugins/search-common/CHANGELOG.md b/plugins/search-common/CHANGELOG.md index 53a63b4c22..279d2450de 100644 --- a/plugins/search-common/CHANGELOG.md +++ b/plugins/search-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-search-common +## 1.2.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 1.2.15 ### Patch Changes diff --git a/plugins/search-common/package.json b/plugins/search-common/package.json index 652a48ba96..ece78fae8c 100644 --- a/plugins/search-common/package.json +++ b/plugins/search-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-common", - "version": "1.2.15", + "version": "1.2.16-next.0", "description": "Common functionalities for Search, to be shared between various search-enabled plugins", "backstage": { "role": "common-library", diff --git a/plugins/search-react/CHANGELOG.md b/plugins/search-react/CHANGELOG.md index 317923e258..b49d54c56b 100644 --- a/plugins/search-react/CHANGELOG.md +++ b/plugins/search-react/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-search-react +## 1.8.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/theme@0.6.3-next.0 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-search-common@1.2.16-next.0 + ## 1.8.4-next.1 ### Patch Changes diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json index 8729885428..163165fe37 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.4-next.1", + "version": "1.8.4-next.2", "backstage": { "role": "web-library", "pluginId": "search", diff --git a/plugins/search/CHANGELOG.md b/plugins/search/CHANGELOG.md index 31350a44d7..0ba1ed8577 100644 --- a/plugins/search/CHANGELOG.md +++ b/plugins/search/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-search +## 1.4.21-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-search-common@1.2.16-next.0 + - @backstage/plugin-search-react@1.8.4-next.2 + ## 1.4.21-next.1 ### Patch Changes diff --git a/plugins/search/package.json b/plugins/search/package.json index 7a223542fe..2437e82fb0 100644 --- a/plugins/search/package.json +++ b/plugins/search/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search", - "version": "1.4.21-next.1", + "version": "1.4.21-next.2", "description": "The Backstage plugin that provides your backstage app with search", "backstage": { "role": "frontend-plugin", diff --git a/plugins/signals-backend/CHANGELOG.md b/plugins/signals-backend/CHANGELOG.md index 8569df8056..1f150846bf 100644 --- a/plugins/signals-backend/CHANGELOG.md +++ b/plugins/signals-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-signals-backend +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/plugin-signals-node@0.1.15-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + ## 0.2.4-next.1 ### Patch Changes diff --git a/plugins/signals-backend/package.json b/plugins/signals-backend/package.json index 34eb99d79f..d02600143e 100644 --- a/plugins/signals-backend/package.json +++ b/plugins/signals-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-signals-backend", - "version": "0.2.4-next.1", + "version": "0.2.4-next.2", "backstage": { "role": "backend-plugin", "pluginId": "signals", diff --git a/plugins/signals-node/CHANGELOG.md b/plugins/signals-node/CHANGELOG.md index 0a3b28b3fa..942c47d4ef 100644 --- a/plugins/signals-node/CHANGELOG.md +++ b/plugins/signals-node/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-signals-node +## 0.1.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + ## 0.1.15-next.1 ### Patch Changes diff --git a/plugins/signals-node/package.json b/plugins/signals-node/package.json index 15dbad8e4e..4e0d5a2212 100644 --- a/plugins/signals-node/package.json +++ b/plugins/signals-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-signals-node", - "version": "0.1.15-next.1", + "version": "0.1.15-next.2", "description": "Node.js library for the signals plugin", "backstage": { "role": "node-library", diff --git a/plugins/signals-react/CHANGELOG.md b/plugins/signals-react/CHANGELOG.md index f417bf94a9..9d95a4c6b8 100644 --- a/plugins/signals-react/CHANGELOG.md +++ b/plugins/signals-react/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-signals-react +## 0.0.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/types@1.2.0 + ## 0.0.7 ### Patch Changes diff --git a/plugins/signals-react/package.json b/plugins/signals-react/package.json index 70368dc02c..e665f58814 100644 --- a/plugins/signals-react/package.json +++ b/plugins/signals-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-signals-react", - "version": "0.0.7", + "version": "0.0.8-next.0", "description": "Web library for the signals plugin", "backstage": { "role": "web-library", diff --git a/plugins/signals/CHANGELOG.md b/plugins/signals/CHANGELOG.md index b9dc92853a..daf237cbd1 100644 --- a/plugins/signals/CHANGELOG.md +++ b/plugins/signals/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-signals +## 0.0.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/theme@0.6.3-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-signals-react@0.0.8-next.0 + ## 0.0.14-next.1 ### Patch Changes diff --git a/plugins/signals/package.json b/plugins/signals/package.json index 7f07fcd116..46a061bce9 100644 --- a/plugins/signals/package.json +++ b/plugins/signals/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-signals", - "version": "0.0.14-next.1", + "version": "0.0.14-next.2", "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 4b0854cfd2..83b4e6aff5 100644 --- a/plugins/techdocs-addons-test-utils/CHANGELOG.md +++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-techdocs-addons-test-utils +## 1.0.43-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.26.0-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/test-utils@1.7.3-next.1 + - @backstage/plugin-search-react@1.8.4-next.2 + - @backstage/plugin-techdocs@1.11.3-next.2 + - @backstage/plugin-techdocs-react@1.2.12-next.2 + ## 1.0.43-next.1 ### Patch Changes diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index 5142b39abe..5e02da282f 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.43-next.1", + "version": "1.0.43-next.2", "backstage": { "role": "web-library", "pluginId": "techdocs-addons", diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md index a6aaa5833f..af73504d8d 100644 --- a/plugins/techdocs-backend/CHANGELOG.md +++ b/plugins/techdocs-backend/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-techdocs-backend +## 1.11.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.3.4-next.2 + - @backstage/plugin-techdocs-node@1.12.15-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-techdocs-common@0.1.0 + ## 1.11.4-next.1 ### Patch Changes diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index 2af1e6cd14..95d87a2d37 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-backend", - "version": "1.11.4-next.1", + "version": "1.11.4-next.2", "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 5db4ab9749..53dff26045 100644 --- a/plugins/techdocs-module-addons-contrib/CHANGELOG.md +++ b/plugins/techdocs-module-addons-contrib/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-techdocs-module-addons-contrib +## 1.1.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/plugin-techdocs-react@1.2.12-next.2 + ## 1.1.19-next.1 ### Patch Changes diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index 4e9c5e9bf5..38409d7da1 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.19-next.1", + "version": "1.1.19-next.2", "description": "Plugin module for contributed TechDocs Addons", "backstage": { "role": "frontend-plugin-module", diff --git a/plugins/techdocs-node/CHANGELOG.md b/plugins/techdocs-node/CHANGELOG.md index 929b8ae72a..aaa30561a0 100644 --- a/plugins/techdocs-node/CHANGELOG.md +++ b/plugins/techdocs-node/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-techdocs-node +## 1.12.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-aws-node@0.1.14-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + - @backstage/plugin-techdocs-common@0.1.0 + ## 1.12.15-next.1 ### Patch Changes diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index aef23deb5d..00af4b6925 100644 --- a/plugins/techdocs-node/package.json +++ b/plugins/techdocs-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-node", - "version": "1.12.15-next.1", + "version": "1.12.15-next.2", "description": "Common node.js functionalities for TechDocs, to be shared between techdocs-backend plugin and techdocs-cli", "backstage": { "role": "node-library", diff --git a/plugins/techdocs-react/CHANGELOG.md b/plugins/techdocs-react/CHANGELOG.md index 2bb1849def..f7718a56ae 100644 --- a/plugins/techdocs-react/CHANGELOG.md +++ b/plugins/techdocs-react/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-techdocs-react +## 1.2.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/version-bridge@1.0.10 + ## 1.2.12-next.1 ### Patch Changes diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json index 47104ec6b1..63975614ca 100644 --- a/plugins/techdocs-react/package.json +++ b/plugins/techdocs-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-react", - "version": "1.2.12-next.1", + "version": "1.2.12-next.2", "description": "Shared frontend utilities for TechDocs and Addons", "backstage": { "role": "web-library", diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md index 5453e7209e..4b26300756 100644 --- a/plugins/techdocs/CHANGELOG.md +++ b/plugins/techdocs/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-techdocs +## 1.11.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-auth-react@0.1.10-next.2 + - @backstage/plugin-search-common@1.2.16-next.0 + - @backstage/plugin-search-react@1.8.4-next.2 + - @backstage/plugin-techdocs-common@0.1.0 + - @backstage/plugin-techdocs-react@1.2.12-next.2 + ## 1.11.3-next.1 ### Patch Changes diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index 97f58f30aa..637fc42c35 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs", - "version": "1.11.3-next.1", + "version": "1.11.3-next.2", "description": "The Backstage plugin that renders technical documentation for your components", "backstage": { "role": "frontend-plugin", diff --git a/plugins/techdocs/report.api.md b/plugins/techdocs/report.api.md index 2cc3934f62..c577de5eac 100644 --- a/plugins/techdocs/report.api.md +++ b/plugins/techdocs/report.api.md @@ -12,6 +12,7 @@ import { Config } from '@backstage/config'; import { CSSProperties } from '@material-ui/styles/withStyles'; import { DiscoveryApi } from '@backstage/core-plugin-api'; import { Entity } from '@backstage/catalog-model'; +import { EntityListPagination } from '@backstage/plugin-catalog-react'; import { EntityOwnerPickerProps } from '@backstage/plugin-catalog-react'; import { FetchApi } from '@backstage/core-plugin-api'; import { IdentityApi } from '@backstage/core-plugin-api'; @@ -309,6 +310,7 @@ export type TechDocsIndexPageProps = { columns?: TableColumn[]; actions?: TableProps['actions']; ownerPickerMode?: EntityOwnerPickerProps['mode']; + pagination?: EntityListPagination; }; // @public @deprecated (undocumented) diff --git a/plugins/techdocs/src/home/components/DefaultTechDocsHome.tsx b/plugins/techdocs/src/home/components/DefaultTechDocsHome.tsx index 2fbd5bb50a..f9757f29cc 100644 --- a/plugins/techdocs/src/home/components/DefaultTechDocsHome.tsx +++ b/plugins/techdocs/src/home/components/DefaultTechDocsHome.tsx @@ -46,7 +46,13 @@ export type DefaultTechDocsHomeProps = TechDocsIndexPageProps; * @public */ export const DefaultTechDocsHome = (props: TechDocsIndexPageProps) => { - const { initialFilter = 'owned', columns, actions, ownerPickerMode } = props; + const { + initialFilter = 'owned', + columns, + actions, + ownerPickerMode, + pagination, + } = props; return ( @@ -55,7 +61,7 @@ export const DefaultTechDocsHome = (props: TechDocsIndexPageProps) => { Discover documentation in your ecosystem. - + diff --git a/plugins/techdocs/src/home/components/Tables/CursorPaginatedDocsTable.test.tsx b/plugins/techdocs/src/home/components/Tables/CursorPaginatedDocsTable.test.tsx new file mode 100644 index 0000000000..d7ab3827e1 --- /dev/null +++ b/plugins/techdocs/src/home/components/Tables/CursorPaginatedDocsTable.test.tsx @@ -0,0 +1,168 @@ +/* + * 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 React, { ReactNode } from 'react'; +import { fireEvent, screen, waitFor } from '@testing-library/react'; +import { CursorPaginatedDocsTable } from './CursorPaginatedDocsTable'; +import { DocsTableRow } from './types'; +import { renderInTestApp } from '@backstage/test-utils'; +import { + DefaultEntityFilters, + EntityKindFilter, + EntityListContextProps, +} from '@backstage/plugin-catalog-react'; +import { MockEntityListContextProvider } from '@backstage/plugin-catalog-react/testUtils'; + +describe('CursorPaginatedDocsTable', () => { + const data = new Array(100).fill(0).map((_, index) => { + const name = `techdocs-${index}`; + return { + entity: { + apiVersion: '1', + kind: 'TestKind', + metadata: { + name, + }, + }, + resolved: { + docsUrl: 'https://example.com', + ownedByRelationsTitle: 'owned', + ownedByRelations: [], + }, + } as DocsTableRow; + }); + + const columns = [ + { + title: 'Title', + field: 'entity.metadata.name', + searchable: true, + }, + ]; + + const wrapInContext = ( + node: ReactNode, + value?: Partial>, + ) => { + return ( + + {node} + + ); + }; + + it('should display all the items', async () => { + await renderInTestApp( + wrapInContext(), + ); + + for (const item of data) { + expect(screen.queryByText(item.entity.metadata.name)).toBeInTheDocument(); + } + }); + + it('should display and invoke the next button', async () => { + const { rerender } = await renderInTestApp( + wrapInContext( + , + ), + ); + + expect( + screen.queryAllByRole('button', { name: 'Next Page' })[0], + ).toBeDisabled(); + + const fn = jest.fn(); + + rerender( + wrapInContext( + , + ), + ); + + const nextButton = screen.queryAllByRole('button', { + name: 'Next Page', + })[0]; + expect(nextButton).toBeEnabled(); + + fireEvent.click(nextButton); + expect(fn).toHaveBeenCalled(); + }); + + it('should display and invoke the prev button', async () => { + const { rerender } = await renderInTestApp( + wrapInContext( + , + ), + ); + + expect( + screen.queryAllByRole('button', { name: 'Next Page' })[0], + ).toBeDisabled(); + + const fn = jest.fn(); + + rerender( + wrapInContext( + , + ), + ); + + const prevButton = screen.queryAllByRole('button', { + name: 'Previous Page', + })[0]; + expect(prevButton).toBeEnabled(); + + fireEvent.click(prevButton); + expect(fn).toHaveBeenCalled(); + }); + + it('should display entity names when loading has finished and no error occurred', async () => { + await renderInTestApp( + e.entity), + totalItems: data.length, + filters: { + kind: new EntityKindFilter('techdocs'), + }, + }} + > + + , + ); + + expect(screen.getByText(/techdocs-0/)).toBeInTheDocument(); + expect(screen.getByText(/techdocs-50/)).toBeInTheDocument(); + expect(screen.getByText(/techdocs-99/)).toBeInTheDocument(); + await waitFor(() => { + expect(screen.getByText(/My title/)).toBeInTheDocument(); + }); + }); +}); diff --git a/plugins/techdocs/src/home/components/Tables/CursorPaginatedDocsTable.tsx b/plugins/techdocs/src/home/components/Tables/CursorPaginatedDocsTable.tsx new file mode 100644 index 0000000000..48a1ecddce --- /dev/null +++ b/plugins/techdocs/src/home/components/Tables/CursorPaginatedDocsTable.tsx @@ -0,0 +1,75 @@ +/* + * 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 React from 'react'; + +import { Table, TableProps } from '@backstage/core-components'; +import { DocsTableRow } from './types'; + +type PaginatedDocsTableProps = { + prev?(): void; + next?(): void; +} & TableProps; + +/** + * @internal + */ + +export function CursorPaginatedDocsTable(props: PaginatedDocsTableProps) { + const { + actions, + columns, + data, + next, + prev, + title, + isLoading, + options, + ...restProps + } = props; + + return ( + { + if (page > 0) { + next?.(); + } else { + prev?.(); + } + }} + /* this will enable the prev button accordingly */ + page={prev ? 1 : 0} + /* this will enable the next button accordingly */ + totalCount={next ? Number.MAX_VALUE : Number.MAX_SAFE_INTEGER} + localization={{ pagination: { labelDisplayedRows: '' } }} + isLoading={isLoading} + {...restProps} + /> + ); +} diff --git a/plugins/techdocs/src/home/components/Tables/DocsTable.tsx b/plugins/techdocs/src/home/components/Tables/DocsTable.tsx index b1537affdb..29dbb3fd4f 100644 --- a/plugins/techdocs/src/home/components/Tables/DocsTable.tsx +++ b/plugins/techdocs/src/home/components/Tables/DocsTable.tsx @@ -18,11 +18,7 @@ import React from 'react'; import useCopyToClipboard from 'react-use/esm/useCopyToClipboard'; import { configApiRef, useApi, useRouteRef } from '@backstage/core-plugin-api'; -import { Entity, RELATION_OWNED_BY } from '@backstage/catalog-model'; -import { - getEntityRelations, - humanizeEntityRef, -} from '@backstage/plugin-catalog-react'; +import { Entity } from '@backstage/catalog-model'; import { rootDocsRouteRef } from '../../../routes'; import { EmptyState, @@ -33,9 +29,9 @@ import { TableProps, } from '@backstage/core-components'; import { actionFactories } from './actions'; -import { columnFactories } from './columns'; -import { toLowerMaybe } from '../../../helpers'; +import { columnFactories, defaultColumns } from './columns'; import { DocsTableRow } from './types'; +import { entitiesToDocsMapper } from './helpers'; /** * Props for {@link DocsTable}. @@ -51,14 +47,6 @@ export type DocsTableProps = { options?: TableOptions; }; -const defaultColumns: TableColumn[] = [ - columnFactories.createTitleColumn({ hidden: true }), - columnFactories.createNameColumn(), - columnFactories.createOwnerColumn(), - columnFactories.createKindColumn(), - columnFactories.createTypeColumn(), -]; - /** * Component which renders a table documents * @@ -71,26 +59,11 @@ export const DocsTable = (props: DocsTableProps) => { const config = useApi(configApiRef); if (!entities) return null; - const documents = entities.map(entity => { - const ownedByRelations = getEntityRelations(entity, RELATION_OWNED_BY); - return { - entity, - resolved: { - docsUrl: getRouteToReaderPageFor({ - namespace: toLowerMaybe( - entity.metadata.namespace ?? 'default', - config, - ), - kind: toLowerMaybe(entity.kind, config), - name: toLowerMaybe(entity.metadata.name, config), - }), - ownedByRelations, - ownedByRelationsTitle: ownedByRelations - .map(r => humanizeEntityRef(r, { defaultKind: 'group' })) - .join(', '), - }, - }; - }); + const documents = entitiesToDocsMapper( + entities, + getRouteToReaderPageFor, + config, + ); const defaultActions: TableProps['actions'] = [ actionFactories.createCopyDocsUrlAction(copyToClipboard), diff --git a/plugins/techdocs/src/home/components/Tables/EntityListDocsTable.tsx b/plugins/techdocs/src/home/components/Tables/EntityListDocsTable.tsx index 563bec4d22..08702d2fde 100644 --- a/plugins/techdocs/src/home/components/Tables/EntityListDocsTable.tsx +++ b/plugins/techdocs/src/home/components/Tables/EntityListDocsTable.tsx @@ -24,14 +24,19 @@ import { TableProps, WarningPanel, } from '@backstage/core-components'; +import { configApiRef, useApi, useRouteRef } from '@backstage/core-plugin-api'; import { useEntityList, useStarredEntities, } from '@backstage/plugin-catalog-react'; import { DocsTable } from './DocsTable'; +import { OffsetPaginatedDocsTable } from './OffsetPaginatedDocsTable'; +import { CursorPaginatedDocsTable } from './CursorPaginatedDocsTable'; import { actionFactories } from './actions'; -import { columnFactories } from './columns'; +import { columnFactories, defaultColumns } from './columns'; import { DocsTableRow } from './types'; +import { rootDocsRouteRef } from '../../../routes'; +import { entitiesToDocsMapper } from './helpers'; /** * Props for {@link EntityListDocsTable}. @@ -51,9 +56,12 @@ export type EntityListDocsTableProps = { */ export const EntityListDocsTable = (props: EntityListDocsTableProps) => { const { columns, actions, options } = props; - const { loading, error, entities, filters } = useEntityList(); + const { loading, error, entities, filters, paginationMode, pageInfo } = + useEntityList(); const { isStarredEntity, toggleStarredEntity } = useStarredEntities(); const [, copyToClipboard] = useCopyToClipboard(); + const getRouteToReaderPageFor = useRouteRef(rootDocsRouteRef); + const config = useApi(configApiRef); const title = capitalize(filters.user?.value ?? 'all'); @@ -65,6 +73,38 @@ export const EntityListDocsTable = (props: EntityListDocsTableProps) => { ), ]; + const documents = entitiesToDocsMapper( + entities, + getRouteToReaderPageFor, + config, + ); + + if (paginationMode === 'cursor') { + return ( + + ); + } else if (paginationMode === 'offset') { + return ( + + ); + } + if (error) { return ( { + const data = new Array(100).fill(0).map((_, index) => { + const name = `tectdocs-${index}`; + return { + entity: { + apiVersion: '1', + kind: 'TestKind', + metadata: { + name, + }, + }, + resolved: { + docsUrl: 'https://example.com', + ownedByRelationsTitle: 'owned', + ownedByRelations: [], + }, + } as DocsTableRow; + }); + + const columns = [ + { + title: 'Title', + field: 'entity.metadata.name', + searchable: true, + }, + ]; + + const wrapInContext = ( + node: ReactNode, + value?: Partial>, + ) => { + return ( + + {node} + + ); + }; + + it('should display all the items', async () => { + await renderInTestApp( + wrapInContext( + , + { + setOffset: jest.fn(), + limit: Number.MAX_SAFE_INTEGER, + offset: 0, + totalItems: data.length, + }, + ), + ); + + for (const item of data) { + expect(screen.queryByText(item.entity.metadata.name)).toBeInTheDocument(); + } + }); + + it('should display and invoke the next and previous buttons', async () => { + const offsetFn = jest.fn(); + + await renderInTestApp( + wrapInContext( + , + { setOffset: offsetFn, limit: 10, totalItems: data.length, offset: 0 }, + ), + ); + + expect(offsetFn).toHaveBeenNthCalledWith(1, 0); + const nextButton = screen.queryAllByRole('button', { + name: 'Next Page', + })[0]; + expect(nextButton).toBeEnabled(); + + fireEvent.click(nextButton); + expect(offsetFn).toHaveBeenNthCalledWith(2, 10); + + const prevButton = screen.queryAllByRole('button', { + name: 'Previous Page', + })[0]; + expect(prevButton).toBeEnabled(); + + fireEvent.click(prevButton); + expect(offsetFn).toHaveBeenNthCalledWith(3, 0); + }); +}); diff --git a/plugins/techdocs/src/home/components/Tables/OffsetPaginatedDocsTable.tsx b/plugins/techdocs/src/home/components/Tables/OffsetPaginatedDocsTable.tsx new file mode 100644 index 0000000000..9f4572117d --- /dev/null +++ b/plugins/techdocs/src/home/components/Tables/OffsetPaginatedDocsTable.tsx @@ -0,0 +1,75 @@ +/* + * 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 React, { useEffect } from 'react'; + +import { Table, TableProps } from '@backstage/core-components'; +import { DocsTableRow } from './types'; +import { + EntityTextFilter, + useEntityList, +} from '@backstage/plugin-catalog-react'; + +/** + * @internal + */ +export function OffsetPaginatedDocsTable(props: TableProps) { + const { actions, columns, data, isLoading, options } = props; + const { updateFilters, setLimit, setOffset, limit, totalItems, offset } = + useEntityList(); + const [page, setPage] = React.useState( + offset && limit ? Math.floor(offset / limit) : 0, + ); + + useEffect(() => { + if (totalItems && page * limit >= totalItems) { + setOffset!(Math.max(0, totalItems - limit)); + } else { + setOffset!(Math.max(0, page * limit)); + } + }, [setOffset, page, limit, totalItems]); + + return ( + + columns={columns} + data={data} + options={{ + paginationPosition: 'both', + pageSizeOptions: [5, 10, 20, 50, 100], + pageSize: limit, + emptyRowsWhenPaging: false, + actionsColumnIndex: -1, + ...options, + }} + actions={actions} + onSearchChange={(searchText: string) => + updateFilters({ + text: searchText ? new EntityTextFilter(searchText) : undefined, + }) + } + page={page} + onPageChange={newPage => { + setPage(newPage); + }} + onRowsPerPageChange={pageSize => { + setLimit(pageSize); + }} + totalCount={totalItems} + localization={{ pagination: { labelDisplayedRows: '' } }} + isLoading={isLoading} + /> + ); +} diff --git a/plugins/techdocs/src/home/components/Tables/columns.tsx b/plugins/techdocs/src/home/components/Tables/columns.tsx index ef22f6d288..9947e1de9e 100644 --- a/plugins/techdocs/src/home/components/Tables/columns.tsx +++ b/plugins/techdocs/src/home/components/Tables/columns.tsx @@ -85,3 +85,11 @@ export const columnFactories = { }; }, }; + +export const defaultColumns: TableColumn[] = [ + columnFactories.createTitleColumn({ hidden: true }), + columnFactories.createNameColumn(), + columnFactories.createOwnerColumn(), + columnFactories.createKindColumn(), + columnFactories.createTypeColumn(), +]; diff --git a/plugins/techdocs/src/home/components/Tables/helpers.ts b/plugins/techdocs/src/home/components/Tables/helpers.ts new file mode 100644 index 0000000000..4c6383c35e --- /dev/null +++ b/plugins/techdocs/src/home/components/Tables/helpers.ts @@ -0,0 +1,56 @@ +/* + * 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 { RELATION_OWNED_BY, Entity } from '@backstage/catalog-model'; +import { + getEntityRelations, + humanizeEntityRef, +} from '@backstage/plugin-catalog-react'; +import { toLowerMaybe } from '../../../helpers'; +import { ConfigApi, RouteFunc } from '@backstage/core-plugin-api'; + +type getRouteFunc = RouteFunc<{ + namespace: string; + kind: string; + name: string; +}>; + +export function entitiesToDocsMapper( + entities: Entity[], + getRouteToReaderPageFor: getRouteFunc, + config: ConfigApi, +) { + return entities.map(entity => { + const ownedByRelations = getEntityRelations(entity, RELATION_OWNED_BY); + return { + entity, + resolved: { + docsUrl: getRouteToReaderPageFor({ + namespace: toLowerMaybe( + entity.metadata.namespace ?? 'default', + config, + ), + kind: toLowerMaybe(entity.kind, config), + name: toLowerMaybe(entity.metadata.name, config), + }), + ownedByRelations, + ownedByRelationsTitle: ownedByRelations + .map(r => humanizeEntityRef(r, { defaultKind: 'group' })) + .join(', '), + }, + }; + }); +} diff --git a/plugins/techdocs/src/home/components/TechDocsCustomHome.test.tsx b/plugins/techdocs/src/home/components/TechDocsCustomHome.test.tsx index 409d68a593..585248c6c9 100644 --- a/plugins/techdocs/src/home/components/TechDocsCustomHome.test.tsx +++ b/plugins/techdocs/src/home/components/TechDocsCustomHome.test.tsx @@ -14,7 +14,11 @@ * limitations under the License. */ -import { catalogApiRef } from '@backstage/plugin-catalog-react'; +import { + catalogApiRef, + starredEntitiesApiRef, + MockStarredEntitiesApi, +} from '@backstage/plugin-catalog-react'; import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { renderInTestApp, TestApiRegistry } from '@backstage/test-utils'; import { screen } from '@testing-library/react'; @@ -37,7 +41,10 @@ const mockCatalogApi = catalogApiMock({ }); describe('TechDocsCustomHome', () => { - const apiRegistry = TestApiRegistry.from([catalogApiRef, mockCatalogApi]); + const apiRegistry = TestApiRegistry.from( + [catalogApiRef, mockCatalogApi], + [starredEntitiesApiRef, new MockStarredEntitiesApi()], + ); it('should render a TechDocs home page', async () => { const tabsConfig = [ diff --git a/plugins/techdocs/src/home/components/TechDocsCustomHome.tsx b/plugins/techdocs/src/home/components/TechDocsCustomHome.tsx index 56d086acfc..d89bc5ee1b 100644 --- a/plugins/techdocs/src/home/components/TechDocsCustomHome.tsx +++ b/plugins/techdocs/src/home/components/TechDocsCustomHome.tsx @@ -23,6 +23,7 @@ import { catalogApiRef, CatalogApi, useEntityOwnership, + EntityListProvider, } from '@backstage/plugin-catalog-react'; import { Entity } from '@backstage/catalog-model'; import { DocsTable } from './Tables'; @@ -127,7 +128,9 @@ const CustomPanel = ({ ) : null}
- + + +
); diff --git a/plugins/techdocs/src/home/components/TechDocsIndexPage.tsx b/plugins/techdocs/src/home/components/TechDocsIndexPage.tsx index adbb68d3e9..cc89d22c08 100644 --- a/plugins/techdocs/src/home/components/TechDocsIndexPage.tsx +++ b/plugins/techdocs/src/home/components/TechDocsIndexPage.tsx @@ -18,6 +18,7 @@ import React from 'react'; import { useOutlet } from 'react-router-dom'; import { TableColumn, TableProps } from '@backstage/core-components'; import { + EntityListPagination, EntityOwnerPickerProps, UserListFilterKind, } from '@backstage/plugin-catalog-react'; @@ -34,6 +35,7 @@ export type TechDocsIndexPageProps = { columns?: TableColumn[]; actions?: TableProps['actions']; ownerPickerMode?: EntityOwnerPickerProps['mode']; + pagination?: EntityListPagination; }; export const TechDocsIndexPage = (props: TechDocsIndexPageProps) => { diff --git a/plugins/user-settings-backend/CHANGELOG.md b/plugins/user-settings-backend/CHANGELOG.md index f757f72741..43a06fba57 100644 --- a/plugins/user-settings-backend/CHANGELOG.md +++ b/plugins/user-settings-backend/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-user-settings-backend +## 0.2.28-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-signals-node@0.1.15-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-user-settings-common@0.0.1 + ## 0.2.28-next.1 ### Patch Changes diff --git a/plugins/user-settings-backend/package.json b/plugins/user-settings-backend/package.json index 6a8d4a4a0c..93942be61f 100644 --- a/plugins/user-settings-backend/package.json +++ b/plugins/user-settings-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-user-settings-backend", - "version": "0.2.28-next.1", + "version": "0.2.28-next.2", "description": "The Backstage backend plugin to manage user settings", "backstage": { "role": "backend-plugin", diff --git a/plugins/user-settings/CHANGELOG.md b/plugins/user-settings/CHANGELOG.md index c14cae5ee4..90a75362e3 100644 --- a/plugins/user-settings/CHANGELOG.md +++ b/plugins/user-settings/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-user-settings +## 0.8.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/theme@0.6.3-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-signals-react@0.0.8-next.0 + - @backstage/plugin-user-settings-common@0.0.1 + ## 0.8.17-next.1 ### Patch Changes diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index 79b21a2f51..6aaadd9161 100644 --- a/plugins/user-settings/package.json +++ b/plugins/user-settings/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-user-settings", - "version": "0.8.17-next.1", + "version": "0.8.17-next.2", "description": "A Backstage plugin that provides a settings page", "backstage": { "role": "frontend-plugin", diff --git a/yarn.lock b/yarn.lock index 2f2dcea0d2..1baea64682 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3646,13 +3646,13 @@ __metadata: node-forge: ^1.3.1 node-mocks-http: ^1.0.0 p-limit: ^3.1.0 + p-throttle: ^4.1.1 path-to-regexp: ^8.0.0 pg: ^8.11.3 pg-connection-string: ^2.3.0 pg-format: ^1.0.4 raw-body: ^2.4.1 selfsigned: ^2.0.0 - stoppable: ^1.1.0 supertest: ^7.0.0 tar: ^6.1.12 triple-beam: ^1.4.1 @@ -3842,9 +3842,6 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@types/react": ^18.0.0 "@types/react-dom": ^18.0.0 - "@vanilla-extract/css": ^1.16.0 - "@vanilla-extract/dynamic": ^2.1.2 - "@vanilla-extract/recipes": ^0.5.5 "@vanilla-extract/rollup-plugin": ^1.3.10 "@vanilla-extract/sprinkles": ^1.6.3 "@vanilla-extract/webpack-plugin": ^2.3.14 @@ -3892,7 +3889,19 @@ __metadata: languageName: unknown linkType: soft -"@backstage/catalog-model@^1.4.3, @backstage/catalog-model@^1.7.0, @backstage/catalog-model@^1.7.1, @backstage/catalog-model@workspace:^, @backstage/catalog-model@workspace:packages/catalog-model": +"@backstage/catalog-model@npm:^1.4.3, @backstage/catalog-model@npm:^1.7.0, @backstage/catalog-model@npm:^1.7.1": + version: 1.7.1 + resolution: "@backstage/catalog-model@npm:1.7.1" + dependencies: + "@backstage/errors": ^1.2.5 + "@backstage/types": ^1.2.0 + ajv: ^8.10.0 + lodash: ^4.17.21 + checksum: 05e2b386aac897f8ac87c1e479101f8da90d96c517c837b99796a4118cce63932ffbb29fbb1f8ec156258370ff5bab65555bbe2fd7091be438f8c554f0a5bdff + languageName: node + linkType: hard + +"@backstage/catalog-model@workspace:^, @backstage/catalog-model@workspace:packages/catalog-model": version: 0.0.0-use.local resolution: "@backstage/catalog-model@workspace:packages/catalog-model" dependencies: @@ -3963,7 +3972,7 @@ __metadata: "@backstage/theme": "workspace:^" "@backstage/types": "workspace:^" "@manypkg/get-packages": ^1.1.3 - "@module-federation/enhanced": ^0.7.0 + "@module-federation/enhanced": ^0.8.0 "@octokit/graphql": ^5.0.0 "@octokit/graphql-schema": ^13.7.0 "@octokit/oauth-app": ^4.2.0 @@ -4018,7 +4027,7 @@ __metadata: commander: ^12.0.0 cross-fetch: ^4.0.0 cross-spawn: ^7.0.3 - css-loader: ^7.0.0 + css-loader: ^6.5.1 ctrlc-windows: ^2.1.0 del: ^8.0.0 esbuild: ^0.24.0 @@ -4190,7 +4199,18 @@ __metadata: languageName: unknown linkType: soft -"@backstage/config@^1.1.1, @backstage/config@^1.2.0, @backstage/config@^1.3.0, @backstage/config@workspace:^, @backstage/config@workspace:packages/config": +"@backstage/config@npm:^1.1.1, @backstage/config@npm:^1.2.0, @backstage/config@npm:^1.3.0": + version: 1.3.0 + resolution: "@backstage/config@npm:1.3.0" + dependencies: + "@backstage/errors": ^1.2.5 + "@backstage/types": ^1.2.0 + ms: ^2.1.3 + checksum: 8e117d677889a5170c62f4b867830cded1cddc2f3f52c86fef7df60a974e7f9e38f428d12e30b6dcc038971e736162d52469f6d98917a401f825e544443e0e4e + languageName: node + linkType: hard + +"@backstage/config@workspace:^, @backstage/config@workspace:packages/config": version: 0.0.0-use.local resolution: "@backstage/config@workspace:packages/config" dependencies: @@ -4310,7 +4330,7 @@ __metadata: "@backstage/test-utils": "workspace:^" "@backstage/types": "workspace:^" "@backstage/version-bridge": "workspace:^" - "@oriflame/backstage-plugin-score-card": ^0.8.0 + "@oriflame/backstage-plugin-score-card": ^0.9.0 "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@types/react": ^18.0.0 @@ -4564,7 +4584,28 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-plugin-api@^1.10.0, @backstage/core-plugin-api@^1.10.1, @backstage/core-plugin-api@^1.8.2, @backstage/core-plugin-api@workspace:^, @backstage/core-plugin-api@workspace:packages/core-plugin-api": +"@backstage/core-plugin-api@npm:^1.10.0, @backstage/core-plugin-api@npm:^1.10.1, @backstage/core-plugin-api@npm:^1.8.2": + version: 1.10.1 + resolution: "@backstage/core-plugin-api@npm:1.10.1" + dependencies: + "@backstage/config": ^1.3.0 + "@backstage/errors": ^1.2.5 + "@backstage/types": ^1.2.0 + "@backstage/version-bridge": ^1.0.10 + history: ^5.0.0 + peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: b9897e92cc595463c11b5719f3d6305debf00dccead6befe04548e7b08c9c03a54c610f64515f443e980c43a6f28e1302ab590d1351bc536d90826f934f336ea + languageName: node + linkType: hard + +"@backstage/core-plugin-api@workspace:^, @backstage/core-plugin-api@workspace:packages/core-plugin-api": version: 0.0.0-use.local resolution: "@backstage/core-plugin-api@workspace:packages/core-plugin-api" dependencies: @@ -4675,7 +4716,17 @@ __metadata: languageName: unknown linkType: soft -"@backstage/errors@^1.2.3, @backstage/errors@^1.2.4, @backstage/errors@^1.2.5, @backstage/errors@workspace:^, @backstage/errors@workspace:packages/errors": +"@backstage/errors@npm:^1.2.3, @backstage/errors@npm:^1.2.4, @backstage/errors@npm:^1.2.5": + version: 1.2.5 + resolution: "@backstage/errors@npm:1.2.5" + dependencies: + "@backstage/types": ^1.2.0 + serialize-error: ^8.0.1 + checksum: 8b4411cca1a9038b136ffa766d3ec284d0dac730ef27b1f565dc7f471249ce87a3d6599fe5c21c7643363ee13f0b0457d5c4fa29d20da64ca3a09fecec3ccd31 + languageName: node + linkType: hard + +"@backstage/errors@workspace:^, @backstage/errors@workspace:packages/errors": version: 0.0.0-use.local resolution: "@backstage/errors@workspace:packages/errors" dependencies: @@ -4922,7 +4973,22 @@ __metadata: languageName: unknown linkType: soft -"@backstage/integration-aws-node@^0.1.12, @backstage/integration-aws-node@workspace:^, @backstage/integration-aws-node@workspace:packages/integration-aws-node": +"@backstage/integration-aws-node@npm:^0.1.12": + version: 0.1.13 + resolution: "@backstage/integration-aws-node@npm:0.1.13" + dependencies: + "@aws-sdk/client-sts": ^3.350.0 + "@aws-sdk/credential-provider-node": ^3.350.0 + "@aws-sdk/credential-providers": ^3.350.0 + "@aws-sdk/types": ^3.347.0 + "@aws-sdk/util-arn-parser": ^3.310.0 + "@backstage/config": ^1.3.0 + "@backstage/errors": ^1.2.5 + checksum: 042617852482685c2452549ad1e16ca319f09e9dc366ad90d7307da6e6763c23ada7bce78e415da9ffef3da7a1287c2ce8c4eddabd1deeaf3f0e7249fdc6e3ee + languageName: node + linkType: hard + +"@backstage/integration-aws-node@workspace:^, @backstage/integration-aws-node@workspace:packages/integration-aws-node": version: 0.0.0-use.local resolution: "@backstage/integration-aws-node@workspace:packages/integration-aws-node" dependencies: @@ -4941,7 +5007,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/integration-react@npm:^1.2.1": +"@backstage/integration-react@npm:^1.1.24, @backstage/integration-react@npm:^1.2.1": version: 1.2.1 resolution: "@backstage/integration-react@npm:1.2.1" dependencies: @@ -4993,7 +5059,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/integration@npm:^1.15.0, @backstage/integration@npm:^1.15.2": +"@backstage/integration@npm:^1.15.0, @backstage/integration@npm:^1.15.2, @backstage/integration@npm:^1.9.0": version: 1.15.2 resolution: "@backstage/integration@npm:1.15.2" dependencies: @@ -5876,6 +5942,7 @@ __metadata: "@backstage/plugin-catalog-node": "workspace:^" luxon: ^3.0.0 msw: ^1.0.0 + p-throttle: ^4.1.1 uuid: ^11.0.0 languageName: unknown linkType: soft @@ -6210,7 +6277,18 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-common@^1.0.20, @backstage/plugin-catalog-common@^1.1.1, @backstage/plugin-catalog-common@workspace:^, @backstage/plugin-catalog-common@workspace:plugins/catalog-common": +"@backstage/plugin-catalog-common@npm:^1.0.20, @backstage/plugin-catalog-common@npm:^1.1.1": + version: 1.1.1 + resolution: "@backstage/plugin-catalog-common@npm:1.1.1" + dependencies: + "@backstage/catalog-model": ^1.7.1 + "@backstage/plugin-permission-common": ^0.8.2 + "@backstage/plugin-search-common": ^1.2.15 + checksum: de2205ef4ab6ce43dd46d20daed31b9fd5d395b0d78d0e579c7269a5be0741f65ccc690c2346b5945fdb1c5a11a384b9745cdaa495997a179bea9ed55fc5df86 + languageName: node + linkType: hard + +"@backstage/plugin-catalog-common@workspace:^, @backstage/plugin-catalog-common@workspace:plugins/catalog-common": version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-common@workspace:plugins/catalog-common" dependencies: @@ -7327,7 +7405,22 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-permission-common@^0.8.2, @backstage/plugin-permission-common@workspace:^, @backstage/plugin-permission-common@workspace:plugins/permission-common": +"@backstage/plugin-permission-common@npm:^0.8.2": + version: 0.8.2 + resolution: "@backstage/plugin-permission-common@npm:0.8.2" + dependencies: + "@backstage/config": ^1.3.0 + "@backstage/errors": ^1.2.5 + "@backstage/types": ^1.2.0 + cross-fetch: ^4.0.0 + uuid: ^11.0.0 + zod: ^3.22.4 + zod-to-json-schema: ^3.20.4 + checksum: f58f205d255c41e39ed331ccb64e807a1ec7728bb7f32c406e52c4d1e4b5e9e2195aa73a1fccbe427c191b0db263f8aa64310dbf5862b4e3834f68a4591de8c3 + languageName: node + linkType: hard + +"@backstage/plugin-permission-common@workspace:^, @backstage/plugin-permission-common@workspace:plugins/permission-common": version: 0.0.0-use.local resolution: "@backstage/plugin-permission-common@workspace:plugins/permission-common" dependencies: @@ -7366,7 +7459,27 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-permission-react@^0.4.28, @backstage/plugin-permission-react@workspace:^, @backstage/plugin-permission-react@workspace:plugins/permission-react": +"@backstage/plugin-permission-react@npm:^0.4.28": + version: 0.4.28 + resolution: "@backstage/plugin-permission-react@npm:0.4.28" + dependencies: + "@backstage/config": ^1.3.0 + "@backstage/core-plugin-api": ^1.10.1 + "@backstage/plugin-permission-common": ^0.8.2 + swr: ^2.0.0 + peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: ad070512472315556cc456c1edb7bcd70be20e352583f4eca7cc1c21d0b75c6d28eb28a47b07cee18594ff554bf4f78f48e034f56c0bbd6fbd1a28b5efe46763 + languageName: node + linkType: hard + +"@backstage/plugin-permission-react@workspace:^, @backstage/plugin-permission-react@workspace:plugins/permission-react": version: 0.0.0-use.local resolution: "@backstage/plugin-permission-react@workspace:plugins/permission-react" dependencies: @@ -8157,6 +8270,16 @@ __metadata: languageName: unknown linkType: soft +"@backstage/plugin-search-common@npm:^1.2.15": + version: 1.2.15 + resolution: "@backstage/plugin-search-common@npm:1.2.15" + dependencies: + "@backstage/plugin-permission-common": ^0.8.2 + "@backstage/types": ^1.2.0 + checksum: 9ea3aafef93074a59127a3e775f82fca1358d330524312c64baaca921baa85e5d80a4042ede050e492ef43c9b6ff9f6eb0a4ea81cb40e09f38834dfc1b57cd57 + languageName: node + linkType: hard + "@backstage/plugin-search-common@workspace:^, @backstage/plugin-search-common@workspace:plugins/search-common": version: 0.0.0-use.local resolution: "@backstage/plugin-search-common@workspace:plugins/search-common" @@ -9320,10 +9443,12 @@ __metadata: languageName: node linkType: hard -"@codemirror/state@npm:^6.0.0, @codemirror/state@npm:^6.1.1, @codemirror/state@npm:^6.4.0": - version: 6.4.0 - resolution: "@codemirror/state@npm:6.4.0" - checksum: c5236fe5786f1b85d17273a5c17fa8aeb063658c1404ab18caeb6e7591663ec96b65d453ab8162f75839c3801b04cd55ba4bc48f44cb61ebfeeee383f89553c7 +"@codemirror/state@npm:^6.0.0, @codemirror/state@npm:^6.1.1, @codemirror/state@npm:^6.5.0": + version: 6.5.0 + resolution: "@codemirror/state@npm:6.5.0" + dependencies: + "@marijn/find-cluster-break": ^1.0.0 + checksum: f7fbed072cc67bf250f7d231668a00b988748cacaaa2ce3ea74ff13c7c392db76000e7d517933521cc6ad9dc3651c7b6d33accab3e3d4b9816cd3c5714661a84 languageName: node linkType: hard @@ -9340,13 +9465,13 @@ __metadata: linkType: hard "@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.23.0": - version: 6.35.2 - resolution: "@codemirror/view@npm:6.35.2" + version: 6.35.3 + resolution: "@codemirror/view@npm:6.35.3" dependencies: - "@codemirror/state": ^6.4.0 + "@codemirror/state": ^6.5.0 style-mod: ^4.1.0 w3c-keyname: ^2.2.4 - checksum: 18cc95a38fe451758fda93927873334584714ab9e2f1f8a823c5be00b90576f3f755ce01c399bf861c24449c0cb735b2bb0c6ea8ebda7030f93d7b8fe414e88b + checksum: 09c2685c9345b23ea69d28f323f29d6e73a269e9ffa29ffbf6443c139b2c97fd1a87eced1c59553a3416a08aed3246e30dd5eb70d516159ac352ae422ff4394d languageName: node linkType: hard @@ -10351,15 +10476,15 @@ __metadata: linkType: hard "@google-cloud/firestore@npm:^7.0.0": - version: 7.10.0 - resolution: "@google-cloud/firestore@npm:7.10.0" + version: 7.11.0 + resolution: "@google-cloud/firestore@npm:7.11.0" dependencies: "@opentelemetry/api": ^1.3.0 fast-deep-equal: ^3.1.1 functional-red-black-tree: ^1.0.1 google-gax: ^4.3.3 protobufjs: ^7.2.6 - checksum: c534e49c6b52b7b46366eba009e3f56e8ee10ca0501896a7794470cab32513c6a314f364ff5a3fe5a44b832ba39d1afc86d38b42be3826a615c0a59108185c7d + checksum: b926123db5e3f37704c0aa51baee1726b72910a37c7fe99bbfe048afb1fba7fa40d7e5f7c017c7284ebd9273c0237da5c00fac81772ba0de1bed97dc9b71e709 languageName: node linkType: hard @@ -11667,6 +11792,13 @@ __metadata: languageName: node linkType: hard +"@marijn/find-cluster-break@npm:^1.0.0": + version: 1.0.2 + resolution: "@marijn/find-cluster-break@npm:1.0.2" + checksum: 0d836de25e04d58325813401ef3c2d34caf040da985a5935fcbc9d84e7b47a21bdb15f57d70c2bf0960bd29ed3dbbb1afd00cdd0fc4fafbee7fd0ffe7d508ae1 + languageName: node + linkType: hard + "@material-table/core@npm:^3.1.0": version: 3.2.5 resolution: "@material-table/core@npm:3.2.5" @@ -11981,39 +12113,39 @@ __metadata: languageName: node linkType: hard -"@module-federation/bridge-react-webpack-plugin@npm:0.7.7": - version: 0.7.7 - resolution: "@module-federation/bridge-react-webpack-plugin@npm:0.7.7" +"@module-federation/bridge-react-webpack-plugin@npm:0.8.1": + version: 0.8.1 + resolution: "@module-federation/bridge-react-webpack-plugin@npm:0.8.1" dependencies: - "@module-federation/sdk": 0.7.7 + "@module-federation/sdk": 0.8.1 "@types/semver": 7.5.8 semver: 7.6.3 - checksum: 4f023e718e02195fb1555fd43e2ddbe88b71a1df29903d1f76297fe0a388421a6819a8d0375d8f4459e259388ee8fd6f00f7701d02d11b1fc6a6300a846b8d31 + checksum: d8c68cd1ddd387e9ef6fba688aec68ef0fe59ec5138f3fc897d033227c0ddd04c4307b52c352a42e85c4b9ad5bc759cd811280960166f752f217df7aeb27a55b languageName: node linkType: hard -"@module-federation/data-prefetch@npm:0.7.7": - version: 0.7.7 - resolution: "@module-federation/data-prefetch@npm:0.7.7" +"@module-federation/data-prefetch@npm:0.8.1": + version: 0.8.1 + resolution: "@module-federation/data-prefetch@npm:0.8.1" dependencies: - "@module-federation/runtime": 0.7.7 - "@module-federation/sdk": 0.7.7 + "@module-federation/runtime": 0.8.1 + "@module-federation/sdk": 0.8.1 fs-extra: 9.1.0 peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: 9701f1ba3d50b4e5739c9ef76c55ca0ed7c7d66060fd79fed599612673fafd766681987fedfb8e7e0f0c435e86db79bfbc56d4aeadc461a400d845a7a7b61e78 + checksum: 25a67256c1900d3989c2f393aca50a0f38faeb9aa1023327ce0716585fb4e19593efb147f20eac883d4eeae619400a95ec41e64f8b10a780b2e3a6e22495440c languageName: node linkType: hard -"@module-federation/dts-plugin@npm:0.7.7": - version: 0.7.7 - resolution: "@module-federation/dts-plugin@npm:0.7.7" +"@module-federation/dts-plugin@npm:0.8.1": + version: 0.8.1 + resolution: "@module-federation/dts-plugin@npm:0.8.1" dependencies: - "@module-federation/error-codes": 0.7.7 - "@module-federation/managers": 0.7.7 - "@module-federation/sdk": 0.7.7 - "@module-federation/third-party-dts-extractor": 0.7.7 + "@module-federation/error-codes": 0.8.1 + "@module-federation/managers": 0.8.1 + "@module-federation/sdk": 0.8.1 + "@module-federation/third-party-dts-extractor": 0.8.1 adm-zip: ^0.5.10 ansi-colors: ^4.1.3 axios: ^1.7.4 @@ -12032,22 +12164,22 @@ __metadata: peerDependenciesMeta: vue-tsc: optional: true - checksum: d5cbd4c552673e0b561cba0ffbc92086c8e6102a0cf18df0131f16c8c7f63371e90dba6b3a65c765cf515af61cf31611d6773f9bbada436f1fa74e5ed0c8e95f + checksum: 7f3f6b000f2427b3ba06c14a3cf7332bec1a4f843d46d11fd267d041f0916ebe4458187284d640524187bae3c871714df29c817d136a45f0a59ae915cc8d77f2 languageName: node linkType: hard -"@module-federation/enhanced@npm:^0.7.0": - version: 0.7.7 - resolution: "@module-federation/enhanced@npm:0.7.7" +"@module-federation/enhanced@npm:^0.8.0": + version: 0.8.1 + resolution: "@module-federation/enhanced@npm:0.8.1" dependencies: - "@module-federation/bridge-react-webpack-plugin": 0.7.7 - "@module-federation/data-prefetch": 0.7.7 - "@module-federation/dts-plugin": 0.7.7 - "@module-federation/managers": 0.7.7 - "@module-federation/manifest": 0.7.7 - "@module-federation/rspack": 0.7.7 - "@module-federation/runtime-tools": 0.7.7 - "@module-federation/sdk": 0.7.7 + "@module-federation/bridge-react-webpack-plugin": 0.8.1 + "@module-federation/data-prefetch": 0.8.1 + "@module-federation/dts-plugin": 0.8.1 + "@module-federation/managers": 0.8.1 + "@module-federation/manifest": 0.8.1 + "@module-federation/rspack": 0.8.1 + "@module-federation/runtime-tools": 0.8.1 + "@module-federation/sdk": 0.8.1 btoa: ^1.2.1 upath: 2.0.1 peerDependencies: @@ -12061,52 +12193,53 @@ __metadata: optional: true webpack: optional: true - checksum: 3b22c92072265cfd63d1f8a3ef2f3b8cdf1bfe6379eb893d7f6a771da2d56102aac0e4acb80b6dc08708ba33a6db95f0e14fb1fba24727d9ee79996aef54d6a8 + checksum: a4902eff5e6379c70638efd1cd80daa156dee8e3eded0bdf431535dd89abc1fbf14c0bd858905595ea9963639f2b72a404f4c8ddc2c8b45d7bc760fc3b2a361b languageName: node linkType: hard -"@module-federation/error-codes@npm:0.7.7": - version: 0.7.7 - resolution: "@module-federation/error-codes@npm:0.7.7" - checksum: 05762cafcc7346d9693bd8f815023325e46d35e8a5fbedcca4365bc9c1e0867d1020fe662f24a3681a09e992089194cd7a7fe49dae2f2fe3c64315609daba24d +"@module-federation/error-codes@npm:0.8.1": + version: 0.8.1 + resolution: "@module-federation/error-codes@npm:0.8.1" + checksum: 36d899d2d3e00904c8aa74f1611edfceb88937ee56cc5cf2302f30e010752c68c0486cf5251ee83c1f3c2471bcea1e1ea0e8047173e92e4f10bad83125b1721d languageName: node linkType: hard -"@module-federation/managers@npm:0.7.7": - version: 0.7.7 - resolution: "@module-federation/managers@npm:0.7.7" +"@module-federation/managers@npm:0.8.1": + version: 0.8.1 + resolution: "@module-federation/managers@npm:0.8.1" dependencies: - "@module-federation/sdk": 0.7.7 + "@module-federation/sdk": 0.8.1 find-pkg: 2.0.0 fs-extra: 9.1.0 - checksum: 5e4a310530368a164e8b8a4d41f11d49d1b83f9e8fbafac3b09d1287d54e90708a00449d0ce6d961fe4634279ce132623b32d8a489e59807ed6ff520f020596d + checksum: 9f608960e5353934d85c99d68e41a156d79ca592ec52bb81ce869084cb7428d821165b17600ffd440b4640205d11fdd463165df35d6b9163250b64815c20e48b languageName: node linkType: hard -"@module-federation/manifest@npm:0.7.7": - version: 0.7.7 - resolution: "@module-federation/manifest@npm:0.7.7" +"@module-federation/manifest@npm:0.8.1": + version: 0.8.1 + resolution: "@module-federation/manifest@npm:0.8.1" dependencies: - "@module-federation/dts-plugin": 0.7.7 - "@module-federation/managers": 0.7.7 - "@module-federation/sdk": 0.7.7 + "@module-federation/dts-plugin": 0.8.1 + "@module-federation/managers": 0.8.1 + "@module-federation/sdk": 0.8.1 chalk: 3.0.0 find-pkg: 2.0.0 - checksum: 95b7789bc7990aabdf0b57f685d6664233f6637019194bad28cebfe27494001cbfa345e8435aa967936c87105a4b6589e1c555dee6d4d9a316b92c2a691a4c58 + checksum: 570eeb5fb36ecaac45ff150475cf09b69cf7fd2f7544527510732be65238957ef8f71faeebbeaf4d5fdfc2df2b3c88617982dcdbc93110a6766424306b8744cc languageName: node linkType: hard -"@module-federation/rspack@npm:0.7.7": - version: 0.7.7 - resolution: "@module-federation/rspack@npm:0.7.7" +"@module-federation/rspack@npm:0.8.1": + version: 0.8.1 + resolution: "@module-federation/rspack@npm:0.8.1" dependencies: - "@module-federation/bridge-react-webpack-plugin": 0.7.7 - "@module-federation/dts-plugin": 0.7.7 - "@module-federation/managers": 0.7.7 - "@module-federation/manifest": 0.7.7 - "@module-federation/runtime-tools": 0.7.7 - "@module-federation/sdk": 0.7.7 + "@module-federation/bridge-react-webpack-plugin": 0.8.1 + "@module-federation/dts-plugin": 0.8.1 + "@module-federation/managers": 0.8.1 + "@module-federation/manifest": 0.8.1 + "@module-federation/runtime-tools": 0.8.1 + "@module-federation/sdk": 0.8.1 peerDependencies: + "@rspack/core": ">=0.7" typescript: ^4.9.0 || ^5.0.0 vue-tsc: ">=1.0.24" peerDependenciesMeta: @@ -12114,7 +12247,7 @@ __metadata: optional: true vue-tsc: optional: true - checksum: b974e6082c7a2b56b5ea3a3bc2ccc6dfc44d8bd65b7ff87601154c340ff808e70933ae5a240aa0d39208879ec2a426f12284b86ca73bba7cd6b9daeeef4b142c + checksum: a03ef54111d16fcf388acac7e1a8b4c6f2cb0af7a907d6e8d14aca2e321864997fa343902170f455e456aea978e6330a9050f070ff0a3503047c0bbed4ef08bb languageName: node linkType: hard @@ -12128,13 +12261,13 @@ __metadata: languageName: node linkType: hard -"@module-federation/runtime-tools@npm:0.7.7": - version: 0.7.7 - resolution: "@module-federation/runtime-tools@npm:0.7.7" +"@module-federation/runtime-tools@npm:0.8.1": + version: 0.8.1 + resolution: "@module-federation/runtime-tools@npm:0.8.1" dependencies: - "@module-federation/runtime": 0.7.7 - "@module-federation/webpack-bundler-runtime": 0.7.7 - checksum: dab2e0e9a49ca2e00c34991d4af59ca07cf212c3f7c670d4577b9825e2cd516c2487d6199e6fa09f9fa47966649f3afce21eba9ec4f0a887112e965950d1930b + "@module-federation/runtime": 0.8.1 + "@module-federation/webpack-bundler-runtime": 0.8.1 + checksum: b10eca911e0a8611a7337f653c0efbd308805b561c22b27a3695092f674a95b349bbf7048659f53bddc558de82b3ffd3bda1757934edfcc298c60a779bfea319 languageName: node linkType: hard @@ -12147,13 +12280,13 @@ __metadata: languageName: node linkType: hard -"@module-federation/runtime@npm:0.7.7": - version: 0.7.7 - resolution: "@module-federation/runtime@npm:0.7.7" +"@module-federation/runtime@npm:0.8.1": + version: 0.8.1 + resolution: "@module-federation/runtime@npm:0.8.1" dependencies: - "@module-federation/error-codes": 0.7.7 - "@module-federation/sdk": 0.7.7 - checksum: 1b8c95e57496a40d056762434d9946a550300ae3bd5f2e9229d3a1ad0f808ce707932bf7aec458c76f0eacd61581f01a8c8d75133a622e0498741e75f00be52b + "@module-federation/error-codes": 0.8.1 + "@module-federation/sdk": 0.8.1 + checksum: 31b4b23237ea105f85d316036819df1cab8d79e845e70b7a0365640f5cfb02850876c3b9fe1eb680aea8ae56454e58e6dfaa49a58c473d82c929307d6000c1f6 languageName: node linkType: hard @@ -12164,23 +12297,23 @@ __metadata: languageName: node linkType: hard -"@module-federation/sdk@npm:0.7.7": - version: 0.7.7 - resolution: "@module-federation/sdk@npm:0.7.7" +"@module-federation/sdk@npm:0.8.1": + version: 0.8.1 + resolution: "@module-federation/sdk@npm:0.8.1" dependencies: isomorphic-rslog: 0.0.6 - checksum: dc156ff0cf6dcc5f85eca80eeb3d0d576000803de158ef1c63887f662b46005a32ea21bdeef115a59f12533929cd0367827d8ec0d6d364ec0514c989faeb1311 + checksum: 41858b512cba814ea4a483a03043c3fda7c50796be5ef9b360b73fc1a2903f1edc58194663efbbcb36cb8035d088db8fe94369f08735761c88fa342bf4d569d8 languageName: node linkType: hard -"@module-federation/third-party-dts-extractor@npm:0.7.7": - version: 0.7.7 - resolution: "@module-federation/third-party-dts-extractor@npm:0.7.7" +"@module-federation/third-party-dts-extractor@npm:0.8.1": + version: 0.8.1 + resolution: "@module-federation/third-party-dts-extractor@npm:0.8.1" dependencies: find-pkg: 2.0.0 fs-extra: 9.1.0 resolve: 1.22.8 - checksum: c1fa64a740469fa7ca0bfbc280359e22768c8e01df8325b9eb36346e06b60061432fd1ebe5d38335480e1fce3b8308daf8f0cf9a82d91b78270db2c21b92980c + checksum: fcf0eb87296f8a393db77adb74423af174bc5f0018201471af129d831e4c1c6cf9ab9ea4ae66b91785964a4b421fcfc2dc2079aeb687ad2c6ce891022c8d3adf languageName: node linkType: hard @@ -12194,13 +12327,13 @@ __metadata: languageName: node linkType: hard -"@module-federation/webpack-bundler-runtime@npm:0.7.7": - version: 0.7.7 - resolution: "@module-federation/webpack-bundler-runtime@npm:0.7.7" +"@module-federation/webpack-bundler-runtime@npm:0.8.1": + version: 0.8.1 + resolution: "@module-federation/webpack-bundler-runtime@npm:0.8.1" dependencies: - "@module-federation/runtime": 0.7.7 - "@module-federation/sdk": 0.7.7 - checksum: c0caeb9a5a7d5fbb360813ee880760ed2f72ea3ae4e39b37ba20accdfd8c60cfb625ead09455c68808e8461b744315cbfe89a1203824e33d9dc8f1c14c60dbd6 + "@module-federation/runtime": 0.8.1 + "@module-federation/sdk": 0.8.1 + checksum: 512ce759214bb82abaf51a2bcdb1eb6db524a819890822689f3be31d189b169827894195f6a5ad53e5afaacb1f08772123f37bce0b7b1dcc72545344e2c4fa31 languageName: node linkType: hard @@ -12401,8 +12534,8 @@ __metadata: linkType: hard "@mui/styles@npm:^5.14.18": - version: 5.16.9 - resolution: "@mui/styles@npm:5.16.9" + version: 5.16.10 + resolution: "@mui/styles@npm:5.16.10" dependencies: "@babel/runtime": ^7.23.9 "@emotion/hash": ^0.9.1 @@ -12427,7 +12560,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 8167e70518b7328a4f9d0ae51f46fc9ea5b023cf934e3007b307a0e871ac818771a7634d4a57b4486d456b067fd9aba967eb119f1e803d7c2cf241a3c167cdc9 + checksum: 7e85e030993f9e2d93f2f32c4c6f65febd882c8f8d324a1d9476845c8bf8e26fce588fb1336caeb7eea19453454eead92ee8493caa36fed5ce51089899c8ca1b languageName: node linkType: hard @@ -12652,6 +12785,19 @@ __metadata: languageName: node linkType: hard +"@npmcli/agent@npm:^3.0.0": + version: 3.0.0 + resolution: "@npmcli/agent@npm:3.0.0" + dependencies: + agent-base: ^7.1.0 + http-proxy-agent: ^7.0.0 + https-proxy-agent: ^7.0.1 + lru-cache: ^10.0.1 + socks-proxy-agent: ^8.0.3 + checksum: e8fc25d536250ed3e669813b36e8c6d805628b472353c57afd8c4fde0fcfcf3dda4ffe22f7af8c9070812ec2e7a03fb41d7151547cef3508efe661a5a3add20f + languageName: node + linkType: hard + "@npmcli/arborist@npm:^4.0.4": version: 4.3.1 resolution: "@npmcli/arborist@npm:4.3.1" @@ -12723,6 +12869,15 @@ __metadata: languageName: node linkType: hard +"@npmcli/fs@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/fs@npm:4.0.0" + dependencies: + semver: ^7.3.5 + checksum: 68951c589e9a4328698a35fd82fe71909a257d6f2ede0434d236fa55634f0fbcad9bb8755553ce5849bd25ee6f019f4d435921ac715c853582c4a7f5983c8d4a + languageName: node + linkType: hard + "@npmcli/git@npm:^2.1.0": version: 2.1.0 resolution: "@npmcli/git@npm:2.1.0" @@ -13640,16 +13795,7 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/api-logs@npm:0.54.1": - version: 0.54.1 - resolution: "@opentelemetry/api-logs@npm:0.54.1" - dependencies: - "@opentelemetry/api": ^1.3.0 - checksum: da3d2bd36f138ec1a56ea34b1601c6bf30be22f443b3a24f5df2cf293ed3f2601fb01ff00cb34a4ef08bd955b78f8259243dc757195f9ace7af4196896d32291 - languageName: node - linkType: hard - -"@opentelemetry/api-logs@npm:0.54.2, @opentelemetry/api-logs@npm:^0.54.0": +"@opentelemetry/api-logs@npm:0.54.2": version: 0.54.2 resolution: "@opentelemetry/api-logs@npm:0.54.2" dependencies: @@ -13658,6 +13804,15 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/api-logs@npm:0.56.0, @opentelemetry/api-logs@npm:^0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/api-logs@npm:0.56.0" + dependencies: + "@opentelemetry/api": ^1.3.0 + checksum: a6bbad94e638316ef3a6e4835124e6a53c3675f0e9a29bb1a37e7905d38ecb72cba20b4289d0e740d6a7a4b16136ee1b393e55d8c14ade9808b44cfb2533eeea + languageName: node + linkType: hard + "@opentelemetry/api@npm:^1.3.0, @opentelemetry/api@npm:^1.4.0, @opentelemetry/api@npm:^1.9.0": version: 1.9.0 resolution: "@opentelemetry/api@npm:1.9.0" @@ -13665,60 +13820,60 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/auto-instrumentations-node@npm:^0.52.0": - version: 0.52.1 - resolution: "@opentelemetry/auto-instrumentations-node@npm:0.52.1" +"@opentelemetry/auto-instrumentations-node@npm:^0.54.0": + version: 0.54.0 + resolution: "@opentelemetry/auto-instrumentations-node@npm:0.54.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 - "@opentelemetry/instrumentation-amqplib": ^0.43.0 - "@opentelemetry/instrumentation-aws-lambda": ^0.47.0 - "@opentelemetry/instrumentation-aws-sdk": ^0.46.0 - "@opentelemetry/instrumentation-bunyan": ^0.42.0 - "@opentelemetry/instrumentation-cassandra-driver": ^0.42.0 - "@opentelemetry/instrumentation-connect": ^0.40.0 - "@opentelemetry/instrumentation-cucumber": ^0.10.0 - "@opentelemetry/instrumentation-dataloader": ^0.13.0 - "@opentelemetry/instrumentation-dns": ^0.40.0 - "@opentelemetry/instrumentation-express": ^0.44.0 - "@opentelemetry/instrumentation-fastify": ^0.41.0 - "@opentelemetry/instrumentation-fs": ^0.16.0 - "@opentelemetry/instrumentation-generic-pool": ^0.40.0 - "@opentelemetry/instrumentation-graphql": ^0.44.0 - "@opentelemetry/instrumentation-grpc": ^0.54.0 - "@opentelemetry/instrumentation-hapi": ^0.42.0 - "@opentelemetry/instrumentation-http": ^0.54.0 - "@opentelemetry/instrumentation-ioredis": ^0.44.0 - "@opentelemetry/instrumentation-kafkajs": ^0.4.0 - "@opentelemetry/instrumentation-knex": ^0.41.0 - "@opentelemetry/instrumentation-koa": ^0.44.0 - "@opentelemetry/instrumentation-lru-memoizer": ^0.41.0 - "@opentelemetry/instrumentation-memcached": ^0.40.0 - "@opentelemetry/instrumentation-mongodb": ^0.48.0 - "@opentelemetry/instrumentation-mongoose": ^0.43.0 - "@opentelemetry/instrumentation-mysql": ^0.42.0 - "@opentelemetry/instrumentation-mysql2": ^0.42.1 - "@opentelemetry/instrumentation-nestjs-core": ^0.41.0 - "@opentelemetry/instrumentation-net": ^0.40.0 - "@opentelemetry/instrumentation-pg": ^0.47.1 - "@opentelemetry/instrumentation-pino": ^0.43.0 - "@opentelemetry/instrumentation-redis": ^0.43.0 - "@opentelemetry/instrumentation-redis-4": ^0.43.0 - "@opentelemetry/instrumentation-restify": ^0.42.0 - "@opentelemetry/instrumentation-router": ^0.41.0 - "@opentelemetry/instrumentation-socket.io": ^0.43.0 - "@opentelemetry/instrumentation-tedious": ^0.15.0 - "@opentelemetry/instrumentation-undici": ^0.7.1 - "@opentelemetry/instrumentation-winston": ^0.41.0 - "@opentelemetry/resource-detector-alibaba-cloud": ^0.29.4 - "@opentelemetry/resource-detector-aws": ^1.7.0 - "@opentelemetry/resource-detector-azure": ^0.2.12 - "@opentelemetry/resource-detector-container": ^0.5.0 - "@opentelemetry/resource-detector-gcp": ^0.29.13 + "@opentelemetry/instrumentation": ^0.56.0 + "@opentelemetry/instrumentation-amqplib": ^0.45.0 + "@opentelemetry/instrumentation-aws-lambda": ^0.49.0 + "@opentelemetry/instrumentation-aws-sdk": ^0.48.0 + "@opentelemetry/instrumentation-bunyan": ^0.44.0 + "@opentelemetry/instrumentation-cassandra-driver": ^0.44.0 + "@opentelemetry/instrumentation-connect": ^0.42.0 + "@opentelemetry/instrumentation-cucumber": ^0.12.0 + "@opentelemetry/instrumentation-dataloader": ^0.15.0 + "@opentelemetry/instrumentation-dns": ^0.42.0 + "@opentelemetry/instrumentation-express": ^0.46.0 + "@opentelemetry/instrumentation-fastify": ^0.43.0 + "@opentelemetry/instrumentation-fs": ^0.18.0 + "@opentelemetry/instrumentation-generic-pool": ^0.42.0 + "@opentelemetry/instrumentation-graphql": ^0.46.0 + "@opentelemetry/instrumentation-grpc": ^0.56.0 + "@opentelemetry/instrumentation-hapi": ^0.44.0 + "@opentelemetry/instrumentation-http": ^0.56.0 + "@opentelemetry/instrumentation-ioredis": ^0.46.0 + "@opentelemetry/instrumentation-kafkajs": ^0.6.0 + "@opentelemetry/instrumentation-knex": ^0.43.0 + "@opentelemetry/instrumentation-koa": ^0.46.0 + "@opentelemetry/instrumentation-lru-memoizer": ^0.43.0 + "@opentelemetry/instrumentation-memcached": ^0.42.0 + "@opentelemetry/instrumentation-mongodb": ^0.50.0 + "@opentelemetry/instrumentation-mongoose": ^0.45.0 + "@opentelemetry/instrumentation-mysql": ^0.44.0 + "@opentelemetry/instrumentation-mysql2": ^0.44.0 + "@opentelemetry/instrumentation-nestjs-core": ^0.43.0 + "@opentelemetry/instrumentation-net": ^0.42.0 + "@opentelemetry/instrumentation-pg": ^0.49.0 + "@opentelemetry/instrumentation-pino": ^0.45.0 + "@opentelemetry/instrumentation-redis": ^0.45.0 + "@opentelemetry/instrumentation-redis-4": ^0.45.0 + "@opentelemetry/instrumentation-restify": ^0.44.0 + "@opentelemetry/instrumentation-router": ^0.43.0 + "@opentelemetry/instrumentation-socket.io": ^0.45.0 + "@opentelemetry/instrumentation-tedious": ^0.17.0 + "@opentelemetry/instrumentation-undici": ^0.9.0 + "@opentelemetry/instrumentation-winston": ^0.43.0 + "@opentelemetry/resource-detector-alibaba-cloud": ^0.29.6 + "@opentelemetry/resource-detector-aws": ^1.9.0 + "@opentelemetry/resource-detector-azure": ^0.4.0 + "@opentelemetry/resource-detector-container": ^0.5.2 + "@opentelemetry/resource-detector-gcp": ^0.31.0 "@opentelemetry/resources": ^1.24.0 - "@opentelemetry/sdk-node": ^0.54.0 + "@opentelemetry/sdk-node": ^0.56.0 peerDependencies: "@opentelemetry/api": ^1.4.1 - checksum: bcff9f9f9c2d118c4cb18b5bb671257a5ec2c445dd8663f4184919488203b672c18085bf7121541c01a29dcbf2f96cbac7248d986d779f694f59abd06c7158ab + checksum: a8f5fe11d4b5090de584b9780dd8358834db8e4ea9dfa12b21c3fe021471b198354f3416a1cf7c6621cae95199d1d1553b7ae7d5f69044d44f767942a90492dc languageName: node linkType: hard @@ -13731,7 +13886,16 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/core@npm:1.27.0, @opentelemetry/core@npm:^1.0.0, @opentelemetry/core@npm:^1.1.0, @opentelemetry/core@npm:^1.25.0, @opentelemetry/core@npm:^1.25.1, @opentelemetry/core@npm:^1.26.0, @opentelemetry/core@npm:^1.8.0": +"@opentelemetry/context-async-hooks@npm:1.29.0": + version: 1.29.0 + resolution: "@opentelemetry/context-async-hooks@npm:1.29.0" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: edbd8d20cee2adaec276e4ec723dca023036c004eccc8bfbfff59e9a8a25a196b05540ed33813f30f9b6e51bc8e51b3de95c927157e874cfaa6510af00d9cf0e + languageName: node + linkType: hard + +"@opentelemetry/core@npm:1.27.0": version: 1.27.0 resolution: "@opentelemetry/core@npm:1.27.0" dependencies: @@ -13742,6 +13906,17 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/core@npm:1.29.0, @opentelemetry/core@npm:^1.0.0, @opentelemetry/core@npm:^1.1.0, @opentelemetry/core@npm:^1.25.0, @opentelemetry/core@npm:^1.25.1, @opentelemetry/core@npm:^1.26.0, @opentelemetry/core@npm:^1.8.0": + version: 1.29.0 + resolution: "@opentelemetry/core@npm:1.29.0" + dependencies: + "@opentelemetry/semantic-conventions": 1.28.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: bf025473175ceee9a64c6d31f01f7d9924b54ebcb603b38dae56d2ef664acb5fe43f393ae9b0aff41deb3a80b7222b74b9fd2764712db30ee2547280aecff509 + languageName: node + linkType: hard + "@opentelemetry/exporter-logs-otlp-grpc@npm:0.54.2": version: 0.54.2 resolution: "@opentelemetry/exporter-logs-otlp-grpc@npm:0.54.2" @@ -13757,6 +13932,21 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/exporter-logs-otlp-grpc@npm:0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/exporter-logs-otlp-grpc@npm:0.56.0" + dependencies: + "@grpc/grpc-js": ^1.7.1 + "@opentelemetry/core": 1.29.0 + "@opentelemetry/otlp-grpc-exporter-base": 0.56.0 + "@opentelemetry/otlp-transformer": 0.56.0 + "@opentelemetry/sdk-logs": 0.56.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 107336fd62fc917bc75b745b219bff7ea5410e4688f2621c1f8bf05af57275113e64ecc3af23ff843afb1cc44fb4112f96c79b135b5246a6bad2a01c93c7938d + languageName: node + linkType: hard + "@opentelemetry/exporter-logs-otlp-http@npm:0.54.2": version: 0.54.2 resolution: "@opentelemetry/exporter-logs-otlp-http@npm:0.54.2" @@ -13772,6 +13962,21 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/exporter-logs-otlp-http@npm:0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/exporter-logs-otlp-http@npm:0.56.0" + dependencies: + "@opentelemetry/api-logs": 0.56.0 + "@opentelemetry/core": 1.29.0 + "@opentelemetry/otlp-exporter-base": 0.56.0 + "@opentelemetry/otlp-transformer": 0.56.0 + "@opentelemetry/sdk-logs": 0.56.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 538c05f27821c447fe0463e159ee526baae6978393fe630943d415c115e6db8132c028ed82eaa0f4001e7418697870919b641696b89e355f2567b16323eff732 + languageName: node + linkType: hard + "@opentelemetry/exporter-logs-otlp-proto@npm:0.54.2": version: 0.54.2 resolution: "@opentelemetry/exporter-logs-otlp-proto@npm:0.54.2" @@ -13789,6 +13994,23 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/exporter-logs-otlp-proto@npm:0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/exporter-logs-otlp-proto@npm:0.56.0" + dependencies: + "@opentelemetry/api-logs": 0.56.0 + "@opentelemetry/core": 1.29.0 + "@opentelemetry/otlp-exporter-base": 0.56.0 + "@opentelemetry/otlp-transformer": 0.56.0 + "@opentelemetry/resources": 1.29.0 + "@opentelemetry/sdk-logs": 0.56.0 + "@opentelemetry/sdk-trace-base": 1.29.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 77737c7007ee6f062f854b267044bca6d2fd8a19128771834fe943a3e1597aba5931f83ceb6c9ff2375ddc8a6b94ed67a92132396ef3ddd9e7e4db2c1f2864f3 + languageName: node + linkType: hard + "@opentelemetry/exporter-prometheus@npm:^0.54.0": version: 0.54.2 resolution: "@opentelemetry/exporter-prometheus@npm:0.54.2" @@ -13818,6 +14040,22 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/exporter-trace-otlp-grpc@npm:0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/exporter-trace-otlp-grpc@npm:0.56.0" + dependencies: + "@grpc/grpc-js": ^1.7.1 + "@opentelemetry/core": 1.29.0 + "@opentelemetry/otlp-grpc-exporter-base": 0.56.0 + "@opentelemetry/otlp-transformer": 0.56.0 + "@opentelemetry/resources": 1.29.0 + "@opentelemetry/sdk-trace-base": 1.29.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 90501836c2c300ef47fcbe3fa5af46f6868de658f0f64a72f2fd115639c6673bf8fd7a24a537ba7a402313727136deeeefe8f97ff93453370f0f1ee7d80ef1e5 + languageName: node + linkType: hard + "@opentelemetry/exporter-trace-otlp-http@npm:0.54.2": version: 0.54.2 resolution: "@opentelemetry/exporter-trace-otlp-http@npm:0.54.2" @@ -13833,6 +14071,21 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/exporter-trace-otlp-http@npm:0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/exporter-trace-otlp-http@npm:0.56.0" + dependencies: + "@opentelemetry/core": 1.29.0 + "@opentelemetry/otlp-exporter-base": 0.56.0 + "@opentelemetry/otlp-transformer": 0.56.0 + "@opentelemetry/resources": 1.29.0 + "@opentelemetry/sdk-trace-base": 1.29.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 4d436ab37c0c5a35e602fa418d69d8830bf4d8e99487206b178e1351a2db7f2a83fd31407e1517ed6dba8c7589d336604d7f44f5f3d30394a13956188d15fee5 + languageName: node + linkType: hard + "@opentelemetry/exporter-trace-otlp-proto@npm:0.54.2": version: 0.54.2 resolution: "@opentelemetry/exporter-trace-otlp-proto@npm:0.54.2" @@ -13848,6 +14101,21 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/exporter-trace-otlp-proto@npm:0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/exporter-trace-otlp-proto@npm:0.56.0" + dependencies: + "@opentelemetry/core": 1.29.0 + "@opentelemetry/otlp-exporter-base": 0.56.0 + "@opentelemetry/otlp-transformer": 0.56.0 + "@opentelemetry/resources": 1.29.0 + "@opentelemetry/sdk-trace-base": 1.29.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: e0e94aa50326fa78fd6fa1b8f2c05ad15b6a3a920fd61a13895a9cef935359221b87af233a053cbc3bbc7296ca96aa5dc242dda0aa93b70d291db7fe5580fc8a + languageName: node + linkType: hard + "@opentelemetry/exporter-zipkin@npm:1.27.0": version: 1.27.0 resolution: "@opentelemetry/exporter-zipkin@npm:1.27.0" @@ -13862,514 +14130,512 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/instrumentation-amqplib@npm:^0.43.0": - version: 0.43.0 - resolution: "@opentelemetry/instrumentation-amqplib@npm:0.43.0" +"@opentelemetry/exporter-zipkin@npm:1.29.0": + version: 1.29.0 + resolution: "@opentelemetry/exporter-zipkin@npm:1.29.0" dependencies: - "@opentelemetry/core": ^1.8.0 - "@opentelemetry/instrumentation": ^0.54.0 - "@opentelemetry/semantic-conventions": ^1.27.0 + "@opentelemetry/core": 1.29.0 + "@opentelemetry/resources": 1.29.0 + "@opentelemetry/sdk-trace-base": 1.29.0 + "@opentelemetry/semantic-conventions": 1.28.0 peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 5eb17469d5c3ce2e8495d7e97684cd3b85d1e6aed4081ec1e4103f90bb5ef64633a6913844c5f0afecc2485f77c5b1adfe34c80ed5b7ea48873d9f92b9d04ef2 + "@opentelemetry/api": ^1.0.0 + checksum: 6455c96f28a1f6275459c513fab905c602cc60921cccd4b506050a242145bff5ce2a81268cc1c5531eb238de565cfa54c320231cdfa4bc1a6be6eb31517780a5 languageName: node linkType: hard -"@opentelemetry/instrumentation-aws-lambda@npm:^0.47.0": - version: 0.47.0 - resolution: "@opentelemetry/instrumentation-aws-lambda@npm:0.47.0" +"@opentelemetry/instrumentation-amqplib@npm:^0.45.0": + version: 0.45.0 + resolution: "@opentelemetry/instrumentation-amqplib@npm:0.45.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/core": ^1.8.0 + "@opentelemetry/instrumentation": ^0.56.0 + "@opentelemetry/semantic-conventions": ^1.27.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 3b009e67974f25c37265cbff30ab39e66b46852778e038197c228178f3ac5e6dfab647a24621f5f8aa9f4f1633ad6257c9f7a3638d957d9d81503c1f43179023 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-aws-lambda@npm:^0.49.0": + version: 0.49.0 + resolution: "@opentelemetry/instrumentation-aws-lambda@npm:0.49.0" + dependencies: + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 "@types/aws-lambda": 8.10.143 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 72925ac1c5d5de107342bf859e0aa5c43b4cda7191b2b0489a7a17ddb3fd7e831a53ee2d20c9d4331918ecf290563d6e4927fa445091b2828d27c2254de05ba3 + checksum: 8f18748d606bd6d6a32fadcee5e127e939a48e8aac49de0edbe1dac61094c4dcabce6457f306c81c527c5c014abdbeb736b95be43c6312e77dffff5c90a68592 languageName: node linkType: hard -"@opentelemetry/instrumentation-aws-sdk@npm:^0.46.0": - version: 0.46.0 - resolution: "@opentelemetry/instrumentation-aws-sdk@npm:0.46.0" +"@opentelemetry/instrumentation-aws-sdk@npm:^0.48.0": + version: 0.48.0 + resolution: "@opentelemetry/instrumentation-aws-sdk@npm:0.48.0" dependencies: "@opentelemetry/core": ^1.8.0 - "@opentelemetry/instrumentation": ^0.54.0 - "@opentelemetry/propagation-utils": ^0.30.12 + "@opentelemetry/instrumentation": ^0.56.0 + "@opentelemetry/propagation-utils": ^0.30.14 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 8e797ab8e8e976c7a87f7ac44c8e132079bbd0e0822b2a1a9596ca62ddfccffb2feb18b0cb63c52a3eeca83fcf0c03fc6cd3210d1bbf07138e6aee2ac273d2c3 + checksum: 0538f38b42a6cd7279ab6f9c85af19525b463a9873fd429163c30ddf817ed17916ab6a53ea05c034d8e6861d10bb031c7ebcbf607b49e3e3c4b89e589a381576 languageName: node linkType: hard -"@opentelemetry/instrumentation-bunyan@npm:^0.42.0": - version: 0.42.0 - resolution: "@opentelemetry/instrumentation-bunyan@npm:0.42.0" +"@opentelemetry/instrumentation-bunyan@npm:^0.44.0": + version: 0.44.0 + resolution: "@opentelemetry/instrumentation-bunyan@npm:0.44.0" dependencies: - "@opentelemetry/api-logs": ^0.54.0 - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/api-logs": ^0.56.0 + "@opentelemetry/instrumentation": ^0.56.0 "@types/bunyan": 1.8.9 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 476850eff4e5c2864b0512c014db71a01372e5cce97e870b915450193f5eaee2cec294cdd32340cf5394cf40de3209ccfb47298630d8e3131572e6f0f568a964 + checksum: 4d176289ffbc26e268c24995c385349d4a817abdc1104eea8bc97d5abd7d6e105cc3dd9f69ac568d1094ec33992597a2b8666b94dbfc1e3d9d3e8f103dafb007 languageName: node linkType: hard -"@opentelemetry/instrumentation-cassandra-driver@npm:^0.42.0": - version: 0.42.0 - resolution: "@opentelemetry/instrumentation-cassandra-driver@npm:0.42.0" +"@opentelemetry/instrumentation-cassandra-driver@npm:^0.44.0": + version: 0.44.0 + resolution: "@opentelemetry/instrumentation-cassandra-driver@npm:0.44.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: fa9139efc7cb10702cc71aba388d8efdd8a08bbab37864c28f61fb20c1cfa47dd79131a02571231ae14245b2d37bd53877fd359ffe61f86db99117532910f213 + checksum: b4c809a3abd7ddefe14345da1a287958cc80de1470e72232363cf03467e1dbd4a99dc081361fea1472040e5e9ca9c377f997af3782c1ba32121bdb76a5966b60 languageName: node linkType: hard -"@opentelemetry/instrumentation-connect@npm:^0.40.0": - version: 0.40.0 - resolution: "@opentelemetry/instrumentation-connect@npm:0.40.0" +"@opentelemetry/instrumentation-connect@npm:^0.42.0": + version: 0.42.0 + resolution: "@opentelemetry/instrumentation-connect@npm:0.42.0" dependencies: "@opentelemetry/core": ^1.8.0 - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 "@types/connect": 3.4.36 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 3fe2f82105abc740c813765594f0cce37cbcced2610ac2d48d97311e2bc853695c4953cedb88ed620c163e39492f4549476b3fa1b2b65034abd0fd5b2a1bb1b2 + checksum: 45c749871feedf8af72de48968027005ab560d73054e55da3426f3091a422b9646fd0170ea5b597d4abd4efc585e2e2a6f9e91253d7fb38dccd42f486cb3ea30 languageName: node linkType: hard -"@opentelemetry/instrumentation-cucumber@npm:^0.10.0": - version: 0.10.0 - resolution: "@opentelemetry/instrumentation-cucumber@npm:0.10.0" +"@opentelemetry/instrumentation-cucumber@npm:^0.12.0": + version: 0.12.0 + resolution: "@opentelemetry/instrumentation-cucumber@npm:0.12.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.0.0 - checksum: a6c516b7a301141741a1e74d1e674434bdc99fa381217889dbcf2a03a2d8269a92cdb8517f25bda80b73019d30970980a98f859eb23e5ba10fbb5c899cdc7bf1 + checksum: 2976f1b5ac2b6d218db4b64c173c25ccc4f2230ecfdc934223f1e27ba0cab2aeee8a0ed344646b001610898bf60aa0cd94ada3e1a05a688b6a4980db2d94b11b languageName: node linkType: hard -"@opentelemetry/instrumentation-dataloader@npm:^0.13.0": - version: 0.13.0 - resolution: "@opentelemetry/instrumentation-dataloader@npm:0.13.0" +"@opentelemetry/instrumentation-dataloader@npm:^0.15.0": + version: 0.15.0 + resolution: "@opentelemetry/instrumentation-dataloader@npm:0.15.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: f423888d71c9b15c02dce863cccb5fa677c625bd3b864ba545be368275e3f88b03284073a24f7f3cb4c0c1f3544c92580b53abdf15dd098fd33c60c6d8326c24 + checksum: a1f217be8064be3cbd116c0fb58feef46b6e05fe9ac3c0333d5cc43ac9df182550bb8f5b084e9557f73e0af7fe917a81d79d69f640009ef64624b97e17f1bb85 languageName: node linkType: hard -"@opentelemetry/instrumentation-dns@npm:^0.40.0": - version: 0.40.0 - resolution: "@opentelemetry/instrumentation-dns@npm:0.40.0" - dependencies: - "@opentelemetry/instrumentation": ^0.54.0 - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: dbc1a4b31b3fe78c46cd19c76162dedec175d07d09d6a553d9b31560ceab4ee6781ca88e5246fd9b371260bfa48c8ab26640d3e5ac914d4d6e8284214a7f86de - languageName: node - linkType: hard - -"@opentelemetry/instrumentation-express@npm:^0.44.0": - version: 0.44.0 - resolution: "@opentelemetry/instrumentation-express@npm:0.44.0" - dependencies: - "@opentelemetry/core": ^1.8.0 - "@opentelemetry/instrumentation": ^0.54.0 - "@opentelemetry/semantic-conventions": ^1.27.0 - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 0ab8be80c817021b7a96fa94bf55c635fa664d2c03058e1485311f4f4bf964e5cf7756185c9003a4d59ac6fc766eff52a7b390a91ca3946ce3d371f3135ea4d5 - languageName: node - linkType: hard - -"@opentelemetry/instrumentation-fastify@npm:^0.41.0": - version: 0.41.0 - resolution: "@opentelemetry/instrumentation-fastify@npm:0.41.0" - dependencies: - "@opentelemetry/core": ^1.8.0 - "@opentelemetry/instrumentation": ^0.54.0 - "@opentelemetry/semantic-conventions": ^1.27.0 - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: dc790cd6ee7ea2322be2e35ce259e10a1f42827970b0b83a6ca7a5a934a986dea7239fe1a29cc772529c1504f24d3afe91c0923a87efc12e8ea1b1321df18514 - languageName: node - linkType: hard - -"@opentelemetry/instrumentation-fs@npm:^0.16.0": - version: 0.16.0 - resolution: "@opentelemetry/instrumentation-fs@npm:0.16.0" - dependencies: - "@opentelemetry/core": ^1.8.0 - "@opentelemetry/instrumentation": ^0.54.0 - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: d74b3ab430c909b7840322540ab51664c29e8ff43fd4eaa77edf11828e5b2234b519771f8d64d051d6a508c1c20c377e606f032fa758ef08eb23e0336e3746bc - languageName: node - linkType: hard - -"@opentelemetry/instrumentation-generic-pool@npm:^0.40.0": - version: 0.40.0 - resolution: "@opentelemetry/instrumentation-generic-pool@npm:0.40.0" - dependencies: - "@opentelemetry/instrumentation": ^0.54.0 - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 665d687191983bd756db1e510b604e244100c42fa6667d7512d42d58a2d319d114d41c96ada15cfa3344763022774138acaee1bec43fdbbfae5aa5bc65a72e0a - languageName: node - linkType: hard - -"@opentelemetry/instrumentation-graphql@npm:^0.44.0": - version: 0.44.0 - resolution: "@opentelemetry/instrumentation-graphql@npm:0.44.0" - dependencies: - "@opentelemetry/instrumentation": ^0.54.0 - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: c4f0f771e1d939de844a97b0e5c0416d5c0d12d2d94e369566b61ec3819193c7eb113c9b3101581c83bb44bdb2b289a33623488ab7446be370e3577ebe37a198 - languageName: node - linkType: hard - -"@opentelemetry/instrumentation-grpc@npm:^0.54.0": - version: 0.54.1 - resolution: "@opentelemetry/instrumentation-grpc@npm:0.54.1" - dependencies: - "@opentelemetry/instrumentation": 0.54.1 - "@opentelemetry/semantic-conventions": 1.27.0 - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: fc85c6d1f93f4e0a9368c458b4569c0e60f86976f22c9e9a9d903f79079f93b5a280f3ab14b548149984241e5efd6d04f9b5018709e1377159c3cd41d3a08495 - languageName: node - linkType: hard - -"@opentelemetry/instrumentation-hapi@npm:^0.42.0": +"@opentelemetry/instrumentation-dns@npm:^0.42.0": version: 0.42.0 - resolution: "@opentelemetry/instrumentation-hapi@npm:0.42.0" + resolution: "@opentelemetry/instrumentation-dns@npm:0.42.0" dependencies: - "@opentelemetry/core": ^1.8.0 - "@opentelemetry/instrumentation": ^0.54.0 - "@opentelemetry/semantic-conventions": ^1.27.0 + "@opentelemetry/instrumentation": ^0.56.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 4e755b3ad4426820d6172f01cd603f14ac75a4521292d912cd31eeaef3e5aa0b9caad5a617b2543a07824b5e385c9bbf256a45acc8a66127096cae03fc48a20d + checksum: 4717331b7429c5a427eb48d7ebd210584806bf672b71dde0bacf677488e39a201a593f3ac16ef7a7ce1ed75cc37e6ea5daff9dccfcd2ec79f09808b77ad55352 languageName: node linkType: hard -"@opentelemetry/instrumentation-http@npm:^0.54.0": - version: 0.54.1 - resolution: "@opentelemetry/instrumentation-http@npm:0.54.1" +"@opentelemetry/instrumentation-express@npm:^0.46.0": + version: 0.46.0 + resolution: "@opentelemetry/instrumentation-express@npm:0.46.0" dependencies: - "@opentelemetry/core": 1.27.0 - "@opentelemetry/instrumentation": 0.54.1 - "@opentelemetry/semantic-conventions": 1.27.0 + "@opentelemetry/core": ^1.8.0 + "@opentelemetry/instrumentation": ^0.56.0 + "@opentelemetry/semantic-conventions": ^1.27.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 799938a06ded695d9e5f32f902d5f6d960e6756ec2d09f34b2373d74a441ea0b9dfeed6f0c1668cf97c9b33991a724fe5be8dec328f0c8cacc0ac8507df10687 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-fastify@npm:^0.43.0": + version: 0.43.0 + resolution: "@opentelemetry/instrumentation-fastify@npm:0.43.0" + dependencies: + "@opentelemetry/core": ^1.8.0 + "@opentelemetry/instrumentation": ^0.56.0 + "@opentelemetry/semantic-conventions": ^1.27.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 008c6f2567ecabe69552f78f8fbcefdf2492d85b0e3e0ac36bd47e6f13a8d02680e7cee1748cd4a70ca9f27213abd30c28bf14d7791ead8a06bf1c85986ef7f9 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-fs@npm:^0.18.0": + version: 0.18.0 + resolution: "@opentelemetry/instrumentation-fs@npm:0.18.0" + dependencies: + "@opentelemetry/core": ^1.8.0 + "@opentelemetry/instrumentation": ^0.56.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 2fe2694f5dd4ef9bfe7b75e66655cbde93afe2bb4f55731841b8ec5ac5af18912d4428edfe6901806452442060262edef14e46719f1faf85e5f11bb0274a054b + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-generic-pool@npm:^0.42.0": + version: 0.42.0 + resolution: "@opentelemetry/instrumentation-generic-pool@npm:0.42.0" + dependencies: + "@opentelemetry/instrumentation": ^0.56.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 5f35a30b76705f4527f0ab8ec83d83014615612f40a7bd16a87a75f922a7aeff113042ae99d30f7ab809853841d2769ddee2e03ce304de80251f1d8370ec2d89 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-graphql@npm:^0.46.0": + version: 0.46.0 + resolution: "@opentelemetry/instrumentation-graphql@npm:0.46.0" + dependencies: + "@opentelemetry/instrumentation": ^0.56.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: b8c9faa2c002846bf85a4ccf4e9aba343d8f38a08e85d8c4e77a016da2d0b84291d6b8505aec7de70088761d4a341192a26163aafc23a2fc04a918c94c1686b6 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-grpc@npm:^0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/instrumentation-grpc@npm:0.56.0" + dependencies: + "@opentelemetry/instrumentation": 0.56.0 + "@opentelemetry/semantic-conventions": 1.28.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 8bb00759e74d05bc7ca3ba7c46fe6ab01ff16adcb5c658a3e1679c5ea6d10b0f381ffae970a694b014881cbaa707ec24076967fa47643187365b765f34f4094e + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-hapi@npm:^0.44.0": + version: 0.44.0 + resolution: "@opentelemetry/instrumentation-hapi@npm:0.44.0" + dependencies: + "@opentelemetry/core": ^1.8.0 + "@opentelemetry/instrumentation": ^0.56.0 + "@opentelemetry/semantic-conventions": ^1.27.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 0ee7610e9a1149d087dc8883f6d20ed7d0a15c7b1da273fc170220daec5e68a1240e0624743b000c8d263bb8b21615ecf84b8a179508763523108de88fedadb4 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-http@npm:^0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/instrumentation-http@npm:0.56.0" + dependencies: + "@opentelemetry/core": 1.29.0 + "@opentelemetry/instrumentation": 0.56.0 + "@opentelemetry/semantic-conventions": 1.28.0 forwarded-parse: 2.1.2 semver: ^7.5.2 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 49a1bda0417ef5866398b89114a7f61d9eb040faa338603746af074dab315eca791443b35b9a1fa00d3b176f807b4a88f9003323570d50ee174f8c86cd3614d6 + checksum: f8033d8410d8b06bb222090959479fe4f24c8d52281ce3e240458a449eab8009cb889d09240f67135699b7a543a4708c2f401060cbf1bfa0663ee8687c451a15 languageName: node linkType: hard -"@opentelemetry/instrumentation-ioredis@npm:^0.44.0": - version: 0.44.0 - resolution: "@opentelemetry/instrumentation-ioredis@npm:0.44.0" +"@opentelemetry/instrumentation-ioredis@npm:^0.46.0": + version: 0.46.0 + resolution: "@opentelemetry/instrumentation-ioredis@npm:0.46.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/redis-common": ^0.36.2 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 774e7cfdf6cd96e6f88a671fdd2d43fdf4591b5e821820971d91cc2b3a83b01c8cf56297fbd5d4578c2b2b8e404c4426222de09198da9915eb6cc9e4b3489636 + checksum: 02a816026d950726562104be37a434b13174fea5120639462a43d70dc011a4c334f402ff5d763a986aa3795d0c9ee9fc200d41ae77b57ea55a4eca14068216f4 languageName: node linkType: hard -"@opentelemetry/instrumentation-kafkajs@npm:^0.4.0": - version: 0.4.0 - resolution: "@opentelemetry/instrumentation-kafkajs@npm:0.4.0" +"@opentelemetry/instrumentation-kafkajs@npm:^0.6.0": + version: 0.6.0 + resolution: "@opentelemetry/instrumentation-kafkajs@npm:0.6.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 23d8d8aa2945f372aaab8ab9a583821339c523d8203090e29652eb90c9600fc273e131d5a0b9464fe09cacde6b35f44e3046effa1b20f936a064872ba18352ec + checksum: 169877945296fa042b5468e25759a67dc81d169a7a4f22ee142e8e9bf0a9d82219397500596060554324f1a9a89c9843ac68633830cec11c99e838fd37d997f5 languageName: node linkType: hard -"@opentelemetry/instrumentation-knex@npm:^0.41.0": - version: 0.41.0 - resolution: "@opentelemetry/instrumentation-knex@npm:0.41.0" +"@opentelemetry/instrumentation-knex@npm:^0.43.0": + version: 0.43.0 + resolution: "@opentelemetry/instrumentation-knex@npm:0.43.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: c3b463e2b909a1d82a789f7cb5477efd60857f18ffb088903bf4bc06cd237f249e16b29338bebd7c16f72dd49ed61251f57cf81af2cc7708ebf37e628f27eafd + checksum: e31af57cb7f3f24ec5ac0748eba0e785e3bb2bb7ad5cdaec2af1f37a077a73ea4b545521450fb5ddfceff3dd8388abbe660959a43222bb2252a155354c346c0b languageName: node linkType: hard -"@opentelemetry/instrumentation-koa@npm:^0.44.0": - version: 0.44.0 - resolution: "@opentelemetry/instrumentation-koa@npm:0.44.0" +"@opentelemetry/instrumentation-koa@npm:^0.46.0": + version: 0.46.0 + resolution: "@opentelemetry/instrumentation-koa@npm:0.46.0" dependencies: "@opentelemetry/core": ^1.8.0 - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 09d8a87e874d9d5050a5f866fbd9ac90bc432c3934f99f68acc11a3936dc594097c31ba9622afeb4b5fc379a255f6e331b978935b360f918e784b27e1de70234 + checksum: b22a6cc9036b0766b5ea2fd8078944877d22cac916d310123af12f317a78b898039dd3ca788cccfce018ec2f6e6220850573ea006cdce1205dc858526fb6a6f9 languageName: node linkType: hard -"@opentelemetry/instrumentation-lru-memoizer@npm:^0.41.0": - version: 0.41.0 - resolution: "@opentelemetry/instrumentation-lru-memoizer@npm:0.41.0" +"@opentelemetry/instrumentation-lru-memoizer@npm:^0.43.0": + version: 0.43.0 + resolution: "@opentelemetry/instrumentation-lru-memoizer@npm:0.43.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 409c13e0e095fbbfdef0d001b4b881fc1cf470eab97e9c391e51b0f0e185ecfebf2b03487b30aed3aab77ad600944525375fdd276e5b763be7bb1b1903e8a553 + checksum: a7c52fe37c25acab54d64d9d8944477925bce311d08794eb5fbe5e75e7d66ee00585f37c331a489f62947b511b3089b8848ff2de2954a49cc7a1c3cb58dd7ede languageName: node linkType: hard -"@opentelemetry/instrumentation-memcached@npm:^0.40.0": - version: 0.40.0 - resolution: "@opentelemetry/instrumentation-memcached@npm:0.40.0" +"@opentelemetry/instrumentation-memcached@npm:^0.42.0": + version: 0.42.0 + resolution: "@opentelemetry/instrumentation-memcached@npm:0.42.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 "@types/memcached": ^2.2.6 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: e33438c31ea6482382013603c0a81b2247757fe46fc433dbf7ca9c9577ef61175a7ff7d9a2d1560c0a4b6382616fa3a6bce3c21f82a7072cc5d27b4bb2a14efc + checksum: 80bd1c3d5d14fb738b061dd61ff41950e146797ad18775da862d8e35401335e7506b33d3f9682235e5dcfed2371e4b2fe7cddad3b22aa1db588f47b6356325f9 languageName: node linkType: hard -"@opentelemetry/instrumentation-mongodb@npm:^0.48.0": - version: 0.48.0 - resolution: "@opentelemetry/instrumentation-mongodb@npm:0.48.0" +"@opentelemetry/instrumentation-mongodb@npm:^0.50.0": + version: 0.50.0 + resolution: "@opentelemetry/instrumentation-mongodb@npm:0.50.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 910925d26cf7af63001c483c790deb75365bdeb314ecbf8d84b908eea4d3ecb1025a53b0f86a903c367a538a47756e423d6f697418782dc84d06dff49b483494 + checksum: 4d7c1823a3de297f8c68e1669792fa007028346eeb005103dc66d70a7f0cdb5bce323b97e4e247b7aa50e2a830b1c645ab718da432b319c31f3d714f85f1e629 languageName: node linkType: hard -"@opentelemetry/instrumentation-mongoose@npm:^0.43.0": - version: 0.43.0 - resolution: "@opentelemetry/instrumentation-mongoose@npm:0.43.0" +"@opentelemetry/instrumentation-mongoose@npm:^0.45.0": + version: 0.45.0 + resolution: "@opentelemetry/instrumentation-mongoose@npm:0.45.0" dependencies: "@opentelemetry/core": ^1.8.0 - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 2eced33f6262e7eb47113cdbe2d518e719bcfb5f570a195d70f0cdf916baf87165bb527487c9bef8c2d67ae6f963bfb50c98f706b3724d0ebae6c27ec576e965 + checksum: 3288fdaa0bc141609f54fad75275d8e1bfaf55dafdce63dd54db76cf0eb955fdcf1788d475c577156138880120fcc179f55f55b7849636b228d8f482b2aa024c languageName: node linkType: hard -"@opentelemetry/instrumentation-mysql2@npm:^0.42.1": - version: 0.42.1 - resolution: "@opentelemetry/instrumentation-mysql2@npm:0.42.1" +"@opentelemetry/instrumentation-mysql2@npm:^0.44.0": + version: 0.44.0 + resolution: "@opentelemetry/instrumentation-mysql2@npm:0.44.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 "@opentelemetry/sql-common": ^0.40.1 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 421f5c44102f74e3439c72bb58a341a69956e8f8f9ea04eb1d5f951003119d4124a23a75509ea2264380bc8c9321579fc24a8424a313c961b5b16365305c0644 + checksum: 72d5b5658d39d5f92ff5b8c1771d8d6ed28979b4d7fb16121dd5a6d76fd231cae364d162bf04a83de3682e149f829766a61c2715eb9959b34ee8ac303cb724c2 languageName: node linkType: hard -"@opentelemetry/instrumentation-mysql@npm:^0.42.0": - version: 0.42.0 - resolution: "@opentelemetry/instrumentation-mysql@npm:0.42.0" +"@opentelemetry/instrumentation-mysql@npm:^0.44.0": + version: 0.44.0 + resolution: "@opentelemetry/instrumentation-mysql@npm:0.44.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 "@types/mysql": 2.15.26 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 27ed48852ede4380499c6fde38103c9e9775b59e3f7f08ff48757eea93308c9305fb5d441bb17ddcd8003bbc35179a4da9a5fd8e6dfcfc855a0dbb83c5e38929 + checksum: a1c55777fef8b8aa349f16a0c5f511bc06f553e6ac1d316a0cd768f49d92d1f75cdabce73d5a2e5590588773bae93521953eb27bf04444105a3727dfd8e10788 languageName: node linkType: hard -"@opentelemetry/instrumentation-nestjs-core@npm:^0.41.0": - version: 0.41.0 - resolution: "@opentelemetry/instrumentation-nestjs-core@npm:0.41.0" +"@opentelemetry/instrumentation-nestjs-core@npm:^0.43.0": + version: 0.43.0 + resolution: "@opentelemetry/instrumentation-nestjs-core@npm:0.43.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 2fb0365dbc6c6aa83953039698e2df339517bcf797d376e6a0bde2b857dccb1dd5799559cf7f2532f8d794227069663f7fbe0cab2f2e0cddaccc5ad99e74148c + checksum: f967f3f96ce6bf402f5acd9cedefca6f0548bbc786fc849e07a6229c3a7b16ce7b05cd864657ec1af2a8285ea9ea58c4199e8ec2610d115b85db7e4c50a5c1e6 languageName: node linkType: hard -"@opentelemetry/instrumentation-net@npm:^0.40.0": - version: 0.40.0 - resolution: "@opentelemetry/instrumentation-net@npm:0.40.0" +"@opentelemetry/instrumentation-net@npm:^0.42.0": + version: 0.42.0 + resolution: "@opentelemetry/instrumentation-net@npm:0.42.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 88821c24332532f1100fe2b2dd80a5ac5246595a4e5b8d51a8d2909918f8c4cab52a7bba2f9db616ffac268ff44e30a111bc20ac7cc94dd8f55b918b81723383 + checksum: ebad2b908081f1c69a07b14ee273958216845e197d7059bee51eb1a12701c2c1406d6a0ad989c27300b7563166808bb1557a54419850f7c40fecf602ee1132ac languageName: node linkType: hard -"@opentelemetry/instrumentation-pg@npm:^0.47.1": - version: 0.47.1 - resolution: "@opentelemetry/instrumentation-pg@npm:0.47.1" +"@opentelemetry/instrumentation-pg@npm:^0.49.0": + version: 0.49.0 + resolution: "@opentelemetry/instrumentation-pg@npm:0.49.0" dependencies: "@opentelemetry/core": ^1.26.0 - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": 1.27.0 "@opentelemetry/sql-common": ^0.40.1 "@types/pg": 8.6.1 "@types/pg-pool": 2.0.6 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: eec188f1c41456e044842d7aa89f9bb4ba7755906292666949ccb4add37ecad3b28abb17f4f736f72be78ec99b68ad797ba4a57dbfb4c1e07eb18ce5283b8e1d + checksum: a91ab43d5cc3e1ead331125207b1447edcfb9cfc13a7b3eced2b9965236b3b76bdbe43dc91a634c0253afdfc7996f6286b7e1748c63d82848b64a4d060df19d8 languageName: node linkType: hard -"@opentelemetry/instrumentation-pino@npm:^0.43.0": - version: 0.43.0 - resolution: "@opentelemetry/instrumentation-pino@npm:0.43.0" +"@opentelemetry/instrumentation-pino@npm:^0.45.0": + version: 0.45.0 + resolution: "@opentelemetry/instrumentation-pino@npm:0.45.0" dependencies: - "@opentelemetry/api-logs": ^0.54.0 + "@opentelemetry/api-logs": ^0.56.0 "@opentelemetry/core": ^1.25.0 - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 76efd25275edb0159057ac90fc3152dd9e76640a4e4986bbd6065c0d3dd2ece043817260e4230e203dffcf9f962f11f379bb4e35aed95c537679d6c0b026f4d3 + checksum: 4c3393b9bfd60b04baf9640763aa5f2873926384ec243d075fcd5f4000025453aa310cc523f946bc12a464c7aa084f6b8f88dd4bd257450486bd8603b0d2c6d6 languageName: node linkType: hard -"@opentelemetry/instrumentation-redis-4@npm:^0.43.0": - version: 0.43.0 - resolution: "@opentelemetry/instrumentation-redis-4@npm:0.43.0" +"@opentelemetry/instrumentation-redis-4@npm:^0.45.0": + version: 0.45.0 + resolution: "@opentelemetry/instrumentation-redis-4@npm:0.45.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/redis-common": ^0.36.2 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: eb0dbedcccaca2a98cdefe741f14613a2de89c53dfd4393bbbfd97b341a2754c7c88d868429754bb9bf3dbcf17c2610d0070898bfe14b4dd9e5830d0f0c2e5f7 + checksum: d6a3f657d4c81c80b83b3c7f95d4d59fcb65dfd56ccc4da12bbe32d67837b6a91aa87d49373302a82dccc9c62a6090fefbcb1bc650e2858a70f3667df7a8ded7 languageName: node linkType: hard -"@opentelemetry/instrumentation-redis@npm:^0.43.0": - version: 0.43.0 - resolution: "@opentelemetry/instrumentation-redis@npm:0.43.0" +"@opentelemetry/instrumentation-redis@npm:^0.45.0": + version: 0.45.0 + resolution: "@opentelemetry/instrumentation-redis@npm:0.45.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/redis-common": ^0.36.2 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: ce0032edec122cd4feb0cfa5c365098c66858dc462dbb3cf95f36a24321460a1eddbe93552249bc9f43ce1b0692f88e971a2a432c26843d40776340debae48db + checksum: 7e0c9de80bc785c5e8bf83cb21a5647d24b512cd50d82f6b6e7b64267e49cfa02557dddb40eba13ca722dcb634a49ce82e1c9898d17f5fffe7bc3dd768cbb507 languageName: node linkType: hard -"@opentelemetry/instrumentation-restify@npm:^0.42.0": - version: 0.42.0 - resolution: "@opentelemetry/instrumentation-restify@npm:0.42.0" +"@opentelemetry/instrumentation-restify@npm:^0.44.0": + version: 0.44.0 + resolution: "@opentelemetry/instrumentation-restify@npm:0.44.0" dependencies: "@opentelemetry/core": ^1.8.0 - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 19ae0540538b1150b802c03ea4e4cf65c66230518b4396d75e4abf570350ca69b591eb45bc30a3282df4a157057ac5eb85614715d49c7b225f3ae90b6c43e740 + checksum: 98ef2da10c5faa03db17032399565343dd2fbfbb70788cb7112653ed8ebe2a7920ec50416c9a7b406f239b9363e5ec49e8e56519f224ece6e63f4aaa193fc5ed languageName: node linkType: hard -"@opentelemetry/instrumentation-router@npm:^0.41.0": - version: 0.41.0 - resolution: "@opentelemetry/instrumentation-router@npm:0.41.0" - dependencies: - "@opentelemetry/instrumentation": ^0.54.0 - "@opentelemetry/semantic-conventions": ^1.27.0 - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 2291f8f7ab314e0e12d5dcc1ec6efcade2ce662a5e9214390a89689513b6742a4be71227c7076ff49061049a622ba924cb0905198bdd3343a7bb1c02ed3c1a46 - languageName: node - linkType: hard - -"@opentelemetry/instrumentation-socket.io@npm:^0.43.0": +"@opentelemetry/instrumentation-router@npm:^0.43.0": version: 0.43.0 - resolution: "@opentelemetry/instrumentation-socket.io@npm:0.43.0" + resolution: "@opentelemetry/instrumentation-router@npm:0.43.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 1805d39201cb2f00e9765017c4e037faf1fa54d6f6cef2dcbbb5f07e90dc94d694736bbddb8c41b3bc8db0411b7e43b2d1d008342aaaa27302620617622b0ff5 + checksum: c1045bd51631a5d1c4654a0b7c3c4a2ab2c2bca331e840bf16ab31ecf2a34effd3366db44e679c534b51232120f1ae0ea7bf4d04cbdfd3e6ea736a9133d4f348 languageName: node linkType: hard -"@opentelemetry/instrumentation-tedious@npm:^0.15.0": - version: 0.15.0 - resolution: "@opentelemetry/instrumentation-tedious@npm:0.15.0" +"@opentelemetry/instrumentation-socket.io@npm:^0.45.0": + version: 0.45.0 + resolution: "@opentelemetry/instrumentation-socket.io@npm:0.45.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 + "@opentelemetry/semantic-conventions": ^1.27.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 0849eb3118ba223aaff324eda86d5b519e85ba24d66c1027dbd2e669fe94ee05d7f292f10e9ef8aa85b96e7e4bcb6934d796a3380c3e2835240d772df69806ce + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-tedious@npm:^0.17.0": + version: 0.17.0 + resolution: "@opentelemetry/instrumentation-tedious@npm:0.17.0" + dependencies: + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 "@types/tedious": ^4.0.14 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 75ece9a359c81cdf31eb3e16be570418775817ff2b7b315e49fcc5d2365f635e0fb2af734de029f4d2faa720c3d977325d5e636d69008fb64b53afb6544bb67f + checksum: d4179b6d2010455cb00abf4a64d2276b10db8d572bf15454d62d458a9ca4b54a9df29d16fb455b3936868f5f64b2f69c8112d467efcf02e447172c0d2caa6f22 languageName: node linkType: hard -"@opentelemetry/instrumentation-undici@npm:^0.7.1": - version: 0.7.1 - resolution: "@opentelemetry/instrumentation-undici@npm:0.7.1" +"@opentelemetry/instrumentation-undici@npm:^0.9.0": + version: 0.9.0 + resolution: "@opentelemetry/instrumentation-undici@npm:0.9.0" dependencies: "@opentelemetry/core": ^1.8.0 - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 peerDependencies: "@opentelemetry/api": ^1.7.0 - checksum: a086224407d814c3a7476a09be8ec5b46ea743d21583821381a8efc4e12a05091c5bab4a6738b8019a01df71026afdd4243830615ec21ba261d3b1df07444cf8 + checksum: f64615394a511e1aeb88a2095940832b9f6bfa1244c8736234b9a4108da81d227cf8a7218216df30333918cc07b336fe8559fb127de6afc2cbfaa5ed7a49ee86 languageName: node linkType: hard -"@opentelemetry/instrumentation-winston@npm:^0.41.0": - version: 0.41.0 - resolution: "@opentelemetry/instrumentation-winston@npm:0.41.0" +"@opentelemetry/instrumentation-winston@npm:^0.43.0": + version: 0.43.0 + resolution: "@opentelemetry/instrumentation-winston@npm:0.43.0" dependencies: - "@opentelemetry/api-logs": ^0.54.0 - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/api-logs": ^0.56.0 + "@opentelemetry/instrumentation": ^0.56.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10d2769925ae9a9982c8da9bb81c6e121f9c1c3437ac99216eb8c68fddea8a3527b5f9acfb09275646e3bc05183bf5bd2b719576756fa40ea3b98a6950a7533f + checksum: f8eafb7d943956f8daf0b432fce421fd85ac910f499f9bb6ec6fe048caafa33705d793c6fe8c6c969ba22951f888553f8862bef13f1cae78ef43d8f402173785 languageName: node linkType: hard -"@opentelemetry/instrumentation@npm:0.54.1": - version: 0.54.1 - resolution: "@opentelemetry/instrumentation@npm:0.54.1" - dependencies: - "@opentelemetry/api-logs": 0.54.1 - "@types/shimmer": ^1.2.0 - import-in-the-middle: ^1.8.1 - require-in-the-middle: ^7.1.1 - semver: ^7.5.2 - shimmer: ^1.2.1 - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 3109540b953aa8d06c8e57882c9af240be475a28d7a3245de8d93667997e70c2a528b72f75af8faaa82436690068aa8a6caaa65ca0aa329429d0b3c9ae6e703e - languageName: node - linkType: hard - -"@opentelemetry/instrumentation@npm:0.54.2, @opentelemetry/instrumentation@npm:^0.54.0": +"@opentelemetry/instrumentation@npm:0.54.2": version: 0.54.2 resolution: "@opentelemetry/instrumentation@npm:0.54.2" dependencies: @@ -14385,6 +14651,22 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/instrumentation@npm:0.56.0, @opentelemetry/instrumentation@npm:^0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/instrumentation@npm:0.56.0" + dependencies: + "@opentelemetry/api-logs": 0.56.0 + "@types/shimmer": ^1.2.0 + import-in-the-middle: ^1.8.1 + require-in-the-middle: ^7.1.1 + semver: ^7.5.2 + shimmer: ^1.2.1 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 2c0cf2c91a5ac36a9e95978bfcc92ed9e770d93346fb87cc6e62ca7e028b219695e921142eef3ff5541bdfb9045996817bd7cefdb668e0419a27abde4854d2e0 + languageName: node + linkType: hard + "@opentelemetry/otlp-exporter-base@npm:0.54.2": version: 0.54.2 resolution: "@opentelemetry/otlp-exporter-base@npm:0.54.2" @@ -14397,6 +14679,18 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/otlp-exporter-base@npm:0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/otlp-exporter-base@npm:0.56.0" + dependencies: + "@opentelemetry/core": 1.29.0 + "@opentelemetry/otlp-transformer": 0.56.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 19537be39eed2969003f244de9f0616af5fae4dbfceaf24918b9f051ab906817f1c32a657d9b548c4c24742eb45c48a21b75cd2bee0b33068cedb0b592a002ae + languageName: node + linkType: hard + "@opentelemetry/otlp-grpc-exporter-base@npm:0.54.2": version: 0.54.2 resolution: "@opentelemetry/otlp-grpc-exporter-base@npm:0.54.2" @@ -14411,6 +14705,20 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/otlp-grpc-exporter-base@npm:0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/otlp-grpc-exporter-base@npm:0.56.0" + dependencies: + "@grpc/grpc-js": ^1.7.1 + "@opentelemetry/core": 1.29.0 + "@opentelemetry/otlp-exporter-base": 0.56.0 + "@opentelemetry/otlp-transformer": 0.56.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: d2188bd77c192df2a72cdf2bc3e219da26b599e03eb4ca32ab76eac83419ddb0729efe472e756a0c00500a071e10940d0f06e63ff879ced5204cce4213ba2598 + languageName: node + linkType: hard + "@opentelemetry/otlp-transformer@npm:0.54.2": version: 0.54.2 resolution: "@opentelemetry/otlp-transformer@npm:0.54.2" @@ -14428,12 +14736,29 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/propagation-utils@npm:^0.30.12": - version: 0.30.12 - resolution: "@opentelemetry/propagation-utils@npm:0.30.12" +"@opentelemetry/otlp-transformer@npm:0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/otlp-transformer@npm:0.56.0" + dependencies: + "@opentelemetry/api-logs": 0.56.0 + "@opentelemetry/core": 1.29.0 + "@opentelemetry/resources": 1.29.0 + "@opentelemetry/sdk-logs": 0.56.0 + "@opentelemetry/sdk-metrics": 1.29.0 + "@opentelemetry/sdk-trace-base": 1.29.0 + protobufjs: ^7.3.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 3b95605194f126be450fd7b5a7522a08bb563f716a43c863e21f7c5e4175101833a94d8f0955e1181ce75211e2b2acfe8691efd0302afa7b41d8b26ddaba3a10 + languageName: node + linkType: hard + +"@opentelemetry/propagation-utils@npm:^0.30.14": + version: 0.30.14 + resolution: "@opentelemetry/propagation-utils@npm:0.30.14" peerDependencies: "@opentelemetry/api": ^1.0.0 - checksum: 1bf6b1a9d00ab0950768f4acb2ccf888592aecfcffde1554b55ffd28c50025920de2725c20f07307b8f4c189c95c413f74b84edb088df3e1d8ce182e83b5cf36 + checksum: 2f7ddc71d39b4d095973087b437191d276fea341750d8e1843da230f83bef9779ca61fe70515bb7a8b8e45671d069ce910ad0d578110860cf08b211fc514801a languageName: node linkType: hard @@ -14448,6 +14773,17 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/propagator-b3@npm:1.29.0": + version: 1.29.0 + resolution: "@opentelemetry/propagator-b3@npm:1.29.0" + dependencies: + "@opentelemetry/core": 1.29.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: 36720d2f4572c45d80149dda1cf1000cd6da8baf7bf1679fa4a58b000668837133b9ab9d8fad93af4752bcc14946364a41ad5e71c0262e4dcdcb43926132df6d + languageName: node + linkType: hard + "@opentelemetry/propagator-jaeger@npm:1.27.0": version: 1.27.0 resolution: "@opentelemetry/propagator-jaeger@npm:1.27.0" @@ -14459,6 +14795,17 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/propagator-jaeger@npm:1.29.0": + version: 1.29.0 + resolution: "@opentelemetry/propagator-jaeger@npm:1.29.0" + dependencies: + "@opentelemetry/core": 1.29.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: eb19ad74c16ef2bd7805f06cf3c6e5ab654889c49221678be75933c45f47d6b496343947b364ec57860d8d9432ce5542d6ac43f8bd0d153b9b47f251abff6653 + languageName: node + linkType: hard + "@opentelemetry/redis-common@npm:^0.36.2": version: 0.36.2 resolution: "@opentelemetry/redis-common@npm:0.36.2" @@ -14466,61 +14813,61 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/resource-detector-alibaba-cloud@npm:^0.29.4": - version: 0.29.4 - resolution: "@opentelemetry/resource-detector-alibaba-cloud@npm:0.29.4" +"@opentelemetry/resource-detector-alibaba-cloud@npm:^0.29.6": + version: 0.29.6 + resolution: "@opentelemetry/resource-detector-alibaba-cloud@npm:0.29.6" dependencies: "@opentelemetry/core": ^1.26.0 "@opentelemetry/resources": ^1.10.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.0.0 - checksum: 78d4100e8dfb814a6ea35c2b9ef12fd93d402ffab93d7a592f3c2d486392e281cd751c2312482e75440eab3a6cd235866c5b14993bf6f6a12a9f3ade91ed3539 + checksum: d8cef13063b0e674fb581312c4fdeab41c95829d72f8a0971e49a8ea667fcd0bd235fb6e44f248412205bf9dfb8c307aeb3af11ade482f19864e0b4eb16d863d languageName: node linkType: hard -"@opentelemetry/resource-detector-aws@npm:^1.7.0": - version: 1.7.0 - resolution: "@opentelemetry/resource-detector-aws@npm:1.7.0" +"@opentelemetry/resource-detector-aws@npm:^1.9.0": + version: 1.9.0 + resolution: "@opentelemetry/resource-detector-aws@npm:1.9.0" dependencies: "@opentelemetry/core": ^1.0.0 "@opentelemetry/resources": ^1.10.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.0.0 - checksum: cbe754b5ea525064478e572a73d05979f6bc8d9bf5b063d3ea104545f0e50e04fbc0ae1376bb2543262d20ef2aad9388b1ff0e485d96ac1446efbc542ab8d818 + checksum: 11d8a3a4ffb66124f420f800488dfb1e46eed3ff9328693ee47b5ba65638c4f2ac16ac2b6e9edcd271d1a35bcc9044766daa17754d9f95f1ebbba10ec63507e4 languageName: node linkType: hard -"@opentelemetry/resource-detector-azure@npm:^0.2.12": - version: 0.2.12 - resolution: "@opentelemetry/resource-detector-azure@npm:0.2.12" +"@opentelemetry/resource-detector-azure@npm:^0.4.0": + version: 0.4.0 + resolution: "@opentelemetry/resource-detector-azure@npm:0.4.0" dependencies: "@opentelemetry/core": ^1.25.1 "@opentelemetry/resources": ^1.10.1 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.0.0 - checksum: b0a170ac928248021ea6b63bea1f25d670bb3c2a0260eae115097d84461732ff602a65f56ef84651ae1e70be3e9729ae5068c3038732a009ec2e3a2d1eccce40 + checksum: 1dce98349bc0bcaaf933f8e243026bb7d93f872ce08f3bd214ecc0125dad27afd84b607f0aae50c18316d10efa755c7e8c0b71a5a728408dacee71df2c8f02f6 languageName: node linkType: hard -"@opentelemetry/resource-detector-container@npm:^0.5.0": - version: 0.5.0 - resolution: "@opentelemetry/resource-detector-container@npm:0.5.0" +"@opentelemetry/resource-detector-container@npm:^0.5.2": + version: 0.5.2 + resolution: "@opentelemetry/resource-detector-container@npm:0.5.2" dependencies: "@opentelemetry/core": ^1.26.0 "@opentelemetry/resources": ^1.10.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.0.0 - checksum: 912762621d55ddffe69b6ba3f5c470cbb9bf3a465303d9f3ab542d9fd2dbe660927cb173783397b47f11588f60c66ec06ff1572d7bcf72ff6da10bc4f1fdd4d0 + checksum: 7d09a68f0e6f3f455f075e499eb5229f8f561124813b55a727e17d7de7c430470906634d97265a365971ffec67c70f0a3271b4e6c25ade8a65a48f9668c67c68 languageName: node linkType: hard -"@opentelemetry/resource-detector-gcp@npm:^0.29.13": - version: 0.29.13 - resolution: "@opentelemetry/resource-detector-gcp@npm:0.29.13" +"@opentelemetry/resource-detector-gcp@npm:^0.31.0": + version: 0.31.0 + resolution: "@opentelemetry/resource-detector-gcp@npm:0.31.0" dependencies: "@opentelemetry/core": ^1.0.0 "@opentelemetry/resources": ^1.10.0 @@ -14528,11 +14875,11 @@ __metadata: gcp-metadata: ^6.0.0 peerDependencies: "@opentelemetry/api": ^1.0.0 - checksum: 64d6995f3775a599985e5787276d81f1aeefa3352017965a797c3b33196f155eb3886633d1b22974aa1cae7425eff9229b4b8c0eb9ed7a454e50e1f94f1fed31 + checksum: d62de94728ca67f03d9aa75a8a291285061cb058a8f245c2ca7b4a8e92e8c480e9958cc9dfd4550ba39475c5f06e0a692e19f6c0762f02005b617622082e3cc1 languageName: node linkType: hard -"@opentelemetry/resources@npm:1.27.0, @opentelemetry/resources@npm:^1.10.0, @opentelemetry/resources@npm:^1.10.1, @opentelemetry/resources@npm:^1.24.0": +"@opentelemetry/resources@npm:1.27.0": version: 1.27.0 resolution: "@opentelemetry/resources@npm:1.27.0" dependencies: @@ -14544,6 +14891,18 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/resources@npm:1.29.0, @opentelemetry/resources@npm:^1.10.0, @opentelemetry/resources@npm:^1.10.1, @opentelemetry/resources@npm:^1.24.0": + version: 1.29.0 + resolution: "@opentelemetry/resources@npm:1.29.0" + dependencies: + "@opentelemetry/core": 1.29.0 + "@opentelemetry/semantic-conventions": 1.28.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: dfa68245089fe4eb8983503539e2109753fd232d769f8bba675c3277ababde88b4e7d60af7ed34a7529a021af0f0df457e3782563597a58ba0599f0161b502b2 + languageName: node + linkType: hard + "@opentelemetry/sdk-logs@npm:0.54.2": version: 0.54.2 resolution: "@opentelemetry/sdk-logs@npm:0.54.2" @@ -14557,6 +14916,19 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/sdk-logs@npm:0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/sdk-logs@npm:0.56.0" + dependencies: + "@opentelemetry/api-logs": 0.56.0 + "@opentelemetry/core": 1.29.0 + "@opentelemetry/resources": 1.29.0 + peerDependencies: + "@opentelemetry/api": ">=1.4.0 <1.10.0" + checksum: f0aed974f93a1b4e21a8d8a4fdc1ae87defe1f7b45dc58f56bb5d7bd41d0dc400ca9bb28af72b193baa4ddef4a1ec1168aee17aa4bf62c58caf1070e521ddfe2 + languageName: node + linkType: hard + "@opentelemetry/sdk-metrics@npm:1.27.0": version: 1.27.0 resolution: "@opentelemetry/sdk-metrics@npm:1.27.0" @@ -14569,6 +14941,18 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/sdk-metrics@npm:1.29.0": + version: 1.29.0 + resolution: "@opentelemetry/sdk-metrics@npm:1.29.0" + dependencies: + "@opentelemetry/core": 1.29.0 + "@opentelemetry/resources": 1.29.0 + peerDependencies: + "@opentelemetry/api": ">=1.3.0 <1.10.0" + checksum: 036f2da0adff7ffd69cd2b7892b81ef4dcd0caa0c3d176dbfec9282a004f56af46956b66949f8e3ce27db589c99fa56a996e3854599979fa35dab876109f533a + languageName: node + linkType: hard + "@opentelemetry/sdk-node@npm:^0.54.0": version: 0.54.2 resolution: "@opentelemetry/sdk-node@npm:0.54.2" @@ -14595,6 +14979,32 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/sdk-node@npm:^0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/sdk-node@npm:0.56.0" + dependencies: + "@opentelemetry/api-logs": 0.56.0 + "@opentelemetry/core": 1.29.0 + "@opentelemetry/exporter-logs-otlp-grpc": 0.56.0 + "@opentelemetry/exporter-logs-otlp-http": 0.56.0 + "@opentelemetry/exporter-logs-otlp-proto": 0.56.0 + "@opentelemetry/exporter-trace-otlp-grpc": 0.56.0 + "@opentelemetry/exporter-trace-otlp-http": 0.56.0 + "@opentelemetry/exporter-trace-otlp-proto": 0.56.0 + "@opentelemetry/exporter-zipkin": 1.29.0 + "@opentelemetry/instrumentation": 0.56.0 + "@opentelemetry/resources": 1.29.0 + "@opentelemetry/sdk-logs": 0.56.0 + "@opentelemetry/sdk-metrics": 1.29.0 + "@opentelemetry/sdk-trace-base": 1.29.0 + "@opentelemetry/sdk-trace-node": 1.29.0 + "@opentelemetry/semantic-conventions": 1.28.0 + peerDependencies: + "@opentelemetry/api": ">=1.3.0 <1.10.0" + checksum: f3261c1bf8a43f4a45bdc08fc80abf2abc9e0f59fbe557f7b6109078cfbd4bebfdd7c4289a907d02d0d2ef944efb72647718a68a3feb6c9676345ffbfe4e90bb + languageName: node + linkType: hard + "@opentelemetry/sdk-trace-base@npm:1.27.0": version: 1.27.0 resolution: "@opentelemetry/sdk-trace-base@npm:1.27.0" @@ -14608,6 +15018,19 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/sdk-trace-base@npm:1.29.0": + version: 1.29.0 + resolution: "@opentelemetry/sdk-trace-base@npm:1.29.0" + dependencies: + "@opentelemetry/core": 1.29.0 + "@opentelemetry/resources": 1.29.0 + "@opentelemetry/semantic-conventions": 1.28.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: 750aa58f5323bda8391213d5bdabadbf2dfb28462198b87f7f41586fa7825cccfd04bdb1c199d3fd368f9837ba7d5f890cae1f7f5d29ec2aeb9e2b7f6a88ba37 + languageName: node + linkType: hard + "@opentelemetry/sdk-trace-node@npm:1.27.0": version: 1.27.0 resolution: "@opentelemetry/sdk-trace-node@npm:1.27.0" @@ -14624,13 +15047,36 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/semantic-conventions@npm:1.27.0, @opentelemetry/semantic-conventions@npm:^1.27.0": +"@opentelemetry/sdk-trace-node@npm:1.29.0": + version: 1.29.0 + resolution: "@opentelemetry/sdk-trace-node@npm:1.29.0" + dependencies: + "@opentelemetry/context-async-hooks": 1.29.0 + "@opentelemetry/core": 1.29.0 + "@opentelemetry/propagator-b3": 1.29.0 + "@opentelemetry/propagator-jaeger": 1.29.0 + "@opentelemetry/sdk-trace-base": 1.29.0 + semver: ^7.5.2 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: f55a0ca916482d97227529783aa8506ab569a8835c0d39baadf93451e06b5eb44dbe8399be78ff080a89b24ab9a582d0fc1c5163bba641cbc4383a0f3da5f8b3 + languageName: node + linkType: hard + +"@opentelemetry/semantic-conventions@npm:1.27.0": version: 1.27.0 resolution: "@opentelemetry/semantic-conventions@npm:1.27.0" checksum: 26d85f8d13c8c64024f7a84528cff41d56afc9829e7ff8a654576404f8b2c1a9c264adcc6fa5a9551bacdd938a4a464041fa9493e0a722e5605f2c2ae6752398 languageName: node linkType: hard +"@opentelemetry/semantic-conventions@npm:1.28.0, @opentelemetry/semantic-conventions@npm:^1.27.0": + version: 1.28.0 + resolution: "@opentelemetry/semantic-conventions@npm:1.28.0" + checksum: 1d708afa654990236cdb6b5da84f7ab899b70bff9f753bc49d93616a5c7f7f339ba1eba6a9fbb57dee596995334f4e7effa57a4624741882ab5b3c419c3511e2 + languageName: node + linkType: hard + "@opentelemetry/sql-common@npm:^0.40.1": version: 0.40.1 resolution: "@opentelemetry/sql-common@npm:0.40.1" @@ -14642,14 +15088,16 @@ __metadata: languageName: node linkType: hard -"@oriflame/backstage-plugin-score-card@npm:^0.8.0": - version: 0.8.0 - resolution: "@oriflame/backstage-plugin-score-card@npm:0.8.0" +"@oriflame/backstage-plugin-score-card@npm:^0.9.0": + version: 0.9.1 + resolution: "@oriflame/backstage-plugin-score-card@npm:0.9.1" dependencies: "@backstage/catalog-model": ^1.4.3 "@backstage/config": ^1.1.1 "@backstage/core-components": ^0.13.10 "@backstage/core-plugin-api": ^1.8.2 + "@backstage/integration": ^1.9.0 + "@backstage/integration-react": ^1.1.24 "@backstage/plugin-catalog-common": ^1.0.20 "@backstage/plugin-catalog-react": ^1.9.3 "@backstage/theme": ^0.5.0 @@ -14658,13 +15106,13 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.11.2 "@material-ui/lab": ^4.0.0-alpha.57 - "@types/react": ^18.0.0 + "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 react-use: ^17.2.4 peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - react-router-dom: ^6.4.3 - checksum: 4d1bf78b3fc6cce80b3cbc1abef5613bb609d2262e0d410aa57cc7e175eaf5cb727796ab61b44507f5c826b1f059f4ec03c280ce6cdbf7291d4461d745a9b5b6 + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 + checksum: cebd9fd9f7d31e1b96765a02eefa2c817e401654bc28a40fe40236e0d79589760188e460797dbaf23ab56478120a60604403339267fb9ae9a9d23fcdfdb674a1 languageName: node linkType: hard @@ -14676,13 +15124,13 @@ __metadata: linkType: hard "@playwright/test@npm:^1.32.3": - version: 1.49.0 - resolution: "@playwright/test@npm:1.49.0" + version: 1.49.1 + resolution: "@playwright/test@npm:1.49.1" dependencies: - playwright: 1.49.0 + playwright: 1.49.1 bin: playwright: cli.js - checksum: f8477aa61d59fd22c6161c48221ab246340dc37bbe2804e1a7d1be8cbd0fd861747fcb7ca559f4bc7328226ff2c90ccb7efa588a7d7d7829f3e57902b28fe39a + checksum: cdbd16df3d773dc8e522d79b4b961e25c2e1b1d4f3ec45eb711078ab5d11bca47caafe833e2be2f923328fbd012405a9ee31d9b449d184077598546a36847e69 languageName: node linkType: hard @@ -15896,8 +16344,8 @@ __metadata: linkType: hard "@rspack/dev-server@npm:^1.0.9": - version: 1.0.9 - resolution: "@rspack/dev-server@npm:1.0.9" + version: 1.0.10 + resolution: "@rspack/dev-server@npm:1.0.10" dependencies: chokidar: ^3.6.0 connect-history-api-fallback: ^2.0.0 @@ -15910,7 +16358,7 @@ __metadata: ws: ^8.16.0 peerDependencies: "@rspack/core": "*" - checksum: 46b6ad1e8f52a44c178042b6b9306fe54ad28ab24b86015f118d03a69628b04bf9563201686e0738b8c06ee8c5dedbc0bb4d6705c7f2d7d3959f2a449ff95cd6 + checksum: 0df53d1a655e5eb95c3a84b8ef34bcab6d32f8c7b23ba080f9691aa15edeee6dd79236c3942c1d55834ff9ae9f427b6e5f58cbf5e10aae015979f3d171bd65ef languageName: node linkType: hard @@ -15922,17 +16370,17 @@ __metadata: linkType: hard "@rspack/plugin-react-refresh@npm:^1.0.0": - version: 1.0.0 - resolution: "@rspack/plugin-react-refresh@npm:1.0.0" + version: 1.0.1 + resolution: "@rspack/plugin-react-refresh@npm:1.0.1" dependencies: - error-stack-parser: ^2.0.6 - html-entities: ^2.1.0 + error-stack-parser: ^2.1.4 + html-entities: ^2.5.2 peerDependencies: react-refresh: ">=0.10.0 <1.0.0" peerDependenciesMeta: react-refresh: optional: true - checksum: 88212e66da7e51d99228c7d77b683ef020ba2f70ea7ed546158167eaa4d6e3fa228da2f7d660c3f7a74ad69a47bc98c67a2d11e4a403f3e1ff8523cded67c6c0 + checksum: 876e75b28cbafa0b405cc68768cb9fd4e394531e5c8e1515dc20fb4bd72e1bef23cb055475fc286f5d215f16ab38e4c571731c38398a85e5066b8fbee86449b0 languageName: node linkType: hard @@ -19981,11 +20429,11 @@ __metadata: linkType: hard "@types/react-dom@npm:^18": - version: 18.3.2 - resolution: "@types/react-dom@npm:18.3.2" - dependencies: - "@types/react": ^18 - checksum: 7fd2bb31152c302febc8e18451f8351d6e48ee57dcf74f9b974a71f4f462945b9f1d8d96bed998c9e6aafa2b314fe64fdc210131c707539d3fdc9279ab73eb0e + version: 18.3.5 + resolution: "@types/react-dom@npm:18.3.5" + peerDependencies: + "@types/react": ^18.0.0 + checksum: 95c757684f71e761515c5a11299e5feec550c72bb52975487f360e6f0d359b26454c26eaf2ce45dd22748205aa9b2c2fe0abe7005ebcbd233a7615283ac39a7d languageName: node linkType: hard @@ -20083,12 +20531,12 @@ __metadata: linkType: hard "@types/react@npm:^18": - version: 18.3.14 - resolution: "@types/react@npm:18.3.14" + version: 18.3.16 + resolution: "@types/react@npm:18.3.16" dependencies: "@types/prop-types": "*" csstype: ^3.0.2 - checksum: 40e2112301d784106bdc713e3eb925c8c710e676a3a31ef65c76ca7df8529cdde3dda2db6e0f6f1878253a79bc6cf87a461aa114bd8364f453bdd2be52c175e5 + checksum: 467c2a325870580b88b4e3bf439749b51b27cb13f52408653cb8c3e7e1b7eff86ada87e384b1aa4d34aa6027c187ca27df00bea77140fda524d726992f5b93ef languageName: node linkType: hard @@ -21128,7 +21576,7 @@ __metadata: languageName: node linkType: hard -"@vanilla-extract/css@npm:^1.16.0, @vanilla-extract/css@npm:^1.16.1": +"@vanilla-extract/css@npm:^1.16.1": version: 1.16.1 resolution: "@vanilla-extract/css@npm:1.16.1" dependencies: @@ -21148,15 +21596,6 @@ __metadata: languageName: node linkType: hard -"@vanilla-extract/dynamic@npm:^2.1.2": - version: 2.1.2 - resolution: "@vanilla-extract/dynamic@npm:2.1.2" - dependencies: - "@vanilla-extract/private": ^1.0.6 - checksum: ec6ec9b02c7ec8a9d60aebf63225fd3f930c06ad824321f03f683f1948eb6d4e554d934303da140b3230b4af2fa15bab494c6da2a3b9a172e4118c245b4f942a - languageName: node - linkType: hard - "@vanilla-extract/integration@npm:^7.1.11": version: 7.1.11 resolution: "@vanilla-extract/integration@npm:7.1.11" @@ -21184,15 +21623,6 @@ __metadata: languageName: node linkType: hard -"@vanilla-extract/recipes@npm:^0.5.5": - version: 0.5.5 - resolution: "@vanilla-extract/recipes@npm:0.5.5" - peerDependencies: - "@vanilla-extract/css": ^1.0.0 - checksum: 8d2b4f8163369424226ec9a47e754002b8a095bcf86c1a60a91b2183f59508519bd31ed41baefc950ad7ca225d75b3184c3b84d3c741c5c60d91618dd70452aa - languageName: node - linkType: hard - "@vanilla-extract/rollup-plugin@npm:^1.3.10": version: 1.3.11 resolution: "@vanilla-extract/rollup-plugin@npm:1.3.11" @@ -22289,12 +22719,10 @@ __metadata: languageName: node linkType: hard -"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": - version: 7.1.1 - resolution: "agent-base@npm:7.1.1" - dependencies: - debug: ^4.3.4 - checksum: 51c158769c5c051482f9ca2e6e1ec085ac72b5a418a9b31b4e82fe6c0a6699adb94c1c42d246699a587b3335215037091c79e0de512c516f73b6ea844202f037 +"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.3 + resolution: "agent-base@npm:7.1.3" + checksum: 87bb7ee54f5ecf0ccbfcba0b07473885c43ecd76cb29a8db17d6137a19d9f9cd443a2a7c5fd8a3f24d58ad8145f9eb49116344a66b107e1aeab82cf2383f4753 languageName: node linkType: hard @@ -24187,6 +24615,26 @@ __metadata: languageName: node linkType: hard +"cacache@npm:^19.0.1": + version: 19.0.1 + resolution: "cacache@npm:19.0.1" + dependencies: + "@npmcli/fs": ^4.0.0 + fs-minipass: ^3.0.0 + glob: ^10.2.2 + lru-cache: ^10.0.1 + minipass: ^7.0.3 + minipass-collect: ^2.0.1 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + p-map: ^7.0.2 + ssri: ^12.0.0 + tar: ^7.4.3 + unique-filename: ^4.0.0 + checksum: e95684717de6881b4cdaa949fa7574e3171946421cd8291769dd3d2417dbf7abf4aa557d1f968cca83dcbc95bed2a281072b09abfc977c942413146ef7ed4525 + languageName: node + linkType: hard + "cache-content-type@npm:^1.0.0": version: 1.0.1 resolution: "cache-content-type@npm:1.0.1" @@ -25891,7 +26339,7 @@ __metadata: languageName: node linkType: hard -"css-loader@npm:^6.7.1": +"css-loader@npm:^6.5.1, css-loader@npm:^6.7.1": version: 6.11.0 resolution: "css-loader@npm:6.11.0" dependencies: @@ -25915,30 +26363,6 @@ __metadata: languageName: node linkType: hard -"css-loader@npm:^7.0.0": - version: 7.1.2 - resolution: "css-loader@npm:7.1.2" - dependencies: - icss-utils: ^5.1.0 - postcss: ^8.4.33 - postcss-modules-extract-imports: ^3.1.0 - postcss-modules-local-by-default: ^4.0.5 - postcss-modules-scope: ^3.2.0 - postcss-modules-values: ^4.0.0 - postcss-value-parser: ^4.2.0 - semver: ^7.5.4 - peerDependencies: - "@rspack/core": 0.x || 1.x - webpack: ^5.27.0 - peerDependenciesMeta: - "@rspack/core": - optional: true - webpack: - optional: true - checksum: 15bfd90d778ddab90ee1d04c8c8bcc13ea6c0791d01b52b09d1b1c753b3410f7a7788a510d93726a9878e70b7c1a140f21efdf5c96e1857872107551d3897822 - languageName: node - linkType: hard - "css-select@npm:^4.1.3, css-select@npm:^4.2.1": version: 4.3.0 resolution: "css-select@npm:4.3.0" @@ -26407,15 +26831,15 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.3.6, debug@npm:~4.3.6": - version: 4.3.7 - resolution: "debug@npm:4.3.7" +"debug@npm:4, debug@npm:^4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.3.6, debug@npm:~4.4.0": + version: 4.4.0 + resolution: "debug@npm:4.4.0" dependencies: ms: ^2.1.3 peerDependenciesMeta: supports-color: optional: true - checksum: 822d74e209cd910ef0802d261b150314bbcf36c582ccdbb3e70f0894823c17e49a50d3e66d96b633524263975ca16b6a833f3e3b7e030c157169a5fabac63160 + checksum: fb42df878dd0e22816fc56e1fdca9da73caa85212fbe40c868b1295a6878f9101ae684f4eeef516c13acfc700f5ea07f1136954f43d4cd2d477a811144136479 languageName: node linkType: hard @@ -27496,12 +27920,12 @@ __metadata: languageName: node linkType: hard -"error-stack-parser@npm:^2.0.6": - version: 2.0.6 - resolution: "error-stack-parser@npm:2.0.6" +"error-stack-parser@npm:^2.0.6, error-stack-parser@npm:^2.1.4": + version: 2.1.4 + resolution: "error-stack-parser@npm:2.1.4" dependencies: - stackframe: ^1.1.1 - checksum: bd8e048fcb1c0c74ab201271fec3b39c097a7c24bdef1718828d053c0584da5d7ad845253b5e4773803ee8e7450b23b0920e60a3b60dd403c1568c843058cb12 + stackframe: ^1.3.4 + checksum: 3b916d2d14c6682f287c8bfa28e14672f47eafe832701080e420e7cdbaebb2c50293868256a95706ac2330fe078cf5664713158b49bc30d7a5f2ac229ded0e18 languageName: node linkType: hard @@ -28845,7 +29269,7 @@ __metadata: "@backstage/plugin-search-backend-node": "workspace:^" "@backstage/plugin-signals-backend": "workspace:^" "@backstage/plugin-techdocs-backend": "workspace:^" - "@opentelemetry/auto-instrumentations-node": ^0.52.0 + "@opentelemetry/auto-instrumentations-node": ^0.54.0 "@opentelemetry/exporter-prometheus": ^0.54.0 "@opentelemetry/sdk-node": ^0.54.0 example-app: "link:../app" @@ -33466,11 +33890,11 @@ __metadata: linkType: hard "jest-when@npm:^3.1.0": - version: 3.6.0 - resolution: "jest-when@npm:3.6.0" + version: 3.7.0 + resolution: "jest-when@npm:3.7.0" peerDependencies: jest: ">= 25" - checksum: ed32ed84e5802bb6fec98966cdf862ce59677551be33d3795e6ac7a6207acf467ed559573d671c8d94c59f7fc0780cf358d2d165d81cdc7d9611250d975ee024 + checksum: d805e2af8e76bf172e33dfde5280590fbc3510427a2d671d3a36df1c90c1bb68ebfee2ea4c87132e265973c7092d3ad20efb69398bd70141f7abef8815d5ad00 languageName: node linkType: hard @@ -34372,8 +34796,8 @@ __metadata: linkType: hard "knip@npm:^5.0.0": - version: 5.38.2 - resolution: "knip@npm:5.38.2" + version: 5.39.4 + resolution: "knip@npm:5.39.4" dependencies: "@nodelib/fs.walk": 1.2.8 "@snyk/github-codeowners": 1.1.0 @@ -34397,7 +34821,7 @@ __metadata: bin: knip: bin/knip.js knip-bun: bin/knip-bun.js - checksum: dd2b9dd20f1e940e07057f60d04c39da12130e3c2246bc600500af3fe7fa8251ef170d63cd492e4b70bd946beef44ef797afe103b6805b355430ea4057d7cba3 + checksum: 0a67865d11e015e324097616caec95f2bec15081daf1a969efcabd0f183020a6c6460326d2ea8cfc1c60b3ecf285710420c328c3ff4093018aec1d077b5815d7 languageName: node linkType: hard @@ -34619,10 +35043,10 @@ __metadata: languageName: node linkType: hard -"lilconfig@npm:~3.1.2": - version: 3.1.2 - resolution: "lilconfig@npm:3.1.2" - checksum: 4e8b83ddd1d0ad722600994e6ba5d858ddca14f0587aa6b9c8185e17548149b5e13d4d583d811e9e9323157fa8c6a527e827739794c7502b59243c58e210b8c3 +"lilconfig@npm:~3.1.3": + version: 3.1.3 + resolution: "lilconfig@npm:3.1.3" + checksum: 644eb10830350f9cdc88610f71a921f510574ed02424b57b0b3abb66ea725d7a082559552524a842f4e0272c196b88dfe1ff7d35ffcc6f45736777185cd67c9a languageName: node linkType: hard @@ -34669,22 +35093,22 @@ __metadata: linkType: hard "lint-staged@npm:^15.0.0": - version: 15.2.10 - resolution: "lint-staged@npm:15.2.10" + version: 15.2.11 + resolution: "lint-staged@npm:15.2.11" dependencies: chalk: ~5.3.0 commander: ~12.1.0 - debug: ~4.3.6 + debug: ~4.4.0 execa: ~8.0.1 - lilconfig: ~3.1.2 - listr2: ~8.2.4 + lilconfig: ~3.1.3 + listr2: ~8.2.5 micromatch: ~4.0.8 pidtree: ~0.6.0 string-argv: ~0.3.2 - yaml: ~2.5.0 + yaml: ~2.6.1 bin: lint-staged: bin/lint-staged.js - checksum: 7ab255b848478ca47c6b94aad0e7a3cfe5ba48ae1fb353cfa86635741333b83b1fd793d7cac6d44bf0388ad087d7e0250c7ec0a8ebece63fbcf7a8d175279809 + checksum: 9668e67791fd73aa91cf9268641a5b41191b4221ac9e4d34b51bb10088a082548aa5984d9b38066c3832e41f5a01bbb36aa41d9a8c96bbc775301cb5c9071e13 languageName: node linkType: hard @@ -34695,9 +35119,9 @@ __metadata: languageName: node linkType: hard -"listr2@npm:~8.2.4": - version: 8.2.4 - resolution: "listr2@npm:8.2.4" +"listr2@npm:~8.2.5": + version: 8.2.5 + resolution: "listr2@npm:8.2.5" dependencies: cli-truncate: ^4.0.0 colorette: ^2.0.20 @@ -34705,7 +35129,7 @@ __metadata: log-update: ^6.1.0 rfdc: ^1.4.1 wrap-ansi: ^9.0.0 - checksum: b1cdcae653ff967a9b28637e346df2d6614165b4ad1e9e36b1403bc972550c51f57ec0e6d307dc3921ceea0601e244e848ab79457c6d570ab1f088b577a63d90 + checksum: 0ca2387b067eb11bbe91863f36903f3a5a040790422a499cc1a15806d8497979e7d1990bd129061c0510906b2971eaa97a74a9635e3ec5abd5830c9749b655b9 languageName: node linkType: hard @@ -35338,6 +35762,25 @@ __metadata: languageName: node linkType: hard +"make-fetch-happen@npm:^14.0.3": + version: 14.0.3 + resolution: "make-fetch-happen@npm:14.0.3" + dependencies: + "@npmcli/agent": ^3.0.0 + cacache: ^19.0.1 + http-cache-semantics: ^4.1.1 + minipass: ^7.0.2 + minipass-fetch: ^4.0.0 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + negotiator: ^1.0.0 + proc-log: ^5.0.0 + promise-retry: ^2.0.1 + ssri: ^12.0.0 + checksum: 6fb2fee6da3d98f1953b03d315826b5c5a4ea1f908481afc113782d8027e19f080c85ae998454de4e5f27a681d3ec58d57278f0868d4e0b736f51d396b661691 + languageName: node + linkType: hard + "make-fetch-happen@npm:^9.1.0": version: 9.1.0 resolution: "make-fetch-happen@npm:9.1.0" @@ -36417,6 +36860,15 @@ __metadata: languageName: node linkType: hard +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: ^7.0.3 + checksum: b251bceea62090f67a6cced7a446a36f4cd61ee2d5cea9aee7fff79ba8030e416327a1c5aa2908dc22629d06214b46d88fdab8c51ac76bacbf5703851b5ad342 + languageName: node + linkType: hard + "minipass-fetch@npm:^1.3.2, minipass-fetch@npm:^1.4.1": version: 1.4.1 resolution: "minipass-fetch@npm:1.4.1" @@ -36462,6 +36914,21 @@ __metadata: languageName: node linkType: hard +"minipass-fetch@npm:^4.0.0": + version: 4.0.0 + resolution: "minipass-fetch@npm:4.0.0" + dependencies: + encoding: ^0.1.13 + minipass: ^7.0.3 + minipass-sized: ^1.0.3 + minizlib: ^3.0.1 + dependenciesMeta: + encoding: + optional: true + checksum: 7d59a31011ab9e4d1af6562dd4c4440e425b2baf4c5edbdd2e22fb25a88629e1cdceca39953ff209da504a46021df520f18fd9a519f36efae4750ff724ddadea + languageName: node + linkType: hard + "minipass-flush@npm:^1.0.5": version: 1.0.5 resolution: "minipass-flush@npm:1.0.5" @@ -37047,6 +37514,13 @@ __metadata: languageName: node linkType: hard +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 20ebfe79b2d2e7cf9cbc8239a72662b584f71164096e6e8896c8325055497c96f6b80cd22c258e8a2f2aa382a787795ec3ee8b37b422a302c7d4381b0d5ecfbb + languageName: node + linkType: hard + "neo-async@npm:^2.5.0, neo-async@npm:^2.6.2": version: 2.6.2 resolution: "neo-async@npm:2.6.2" @@ -37210,9 +37684,9 @@ __metadata: languageName: node linkType: hard -"node-gyp@npm:^10.0.0, node-gyp@npm:latest": - version: 10.2.0 - resolution: "node-gyp@npm:10.2.0" +"node-gyp@npm:^10.0.0": + version: 10.3.1 + resolution: "node-gyp@npm:10.3.1" dependencies: env-paths: ^2.2.0 exponential-backoff: ^3.1.1 @@ -37226,7 +37700,7 @@ __metadata: which: ^4.0.0 bin: node-gyp: bin/node-gyp.js - checksum: 0233759d8c19765f7fdc259a35eb046ad86c3d09e22f7384613ae2b89647dd27fcf833fdf5293d9335041e91f9b1c539494225959cdb312a5c8080b7534b926f + checksum: 91b0690ab504fe051ad66863226dc5ecac72b8471f85e8428e4d5ca3217d3a2adfffae48cd555e8d009a4164689fff558b88d2bc9bfd246452a3336ab308cf99 languageName: node linkType: hard @@ -37250,6 +37724,26 @@ __metadata: languageName: node linkType: hard +"node-gyp@npm:latest": + version: 11.0.0 + resolution: "node-gyp@npm:11.0.0" + dependencies: + env-paths: ^2.2.0 + exponential-backoff: ^3.1.1 + glob: ^10.3.10 + graceful-fs: ^4.2.6 + make-fetch-happen: ^14.0.3 + nopt: ^8.0.0 + proc-log: ^5.0.0 + semver: ^7.3.5 + tar: ^7.4.3 + which: ^5.0.0 + bin: + node-gyp: bin/node-gyp.js + checksum: d7d5055ccc88177f721c7cd4f8f9440c29a0eb40e7b79dba89ef882ec957975dfc1dcb8225e79ab32481a02016eb13bbc051a913ea88d482d3cbdf2131156af4 + languageName: node + linkType: hard + "node-html-markdown@npm:^1.3.0": version: 1.3.0 resolution: "node-html-markdown@npm:1.3.0" @@ -37325,8 +37819,8 @@ __metadata: linkType: hard "node-mocks-http@npm:^1.0.0": - version: 1.16.1 - resolution: "node-mocks-http@npm:1.16.1" + version: 1.16.2 + resolution: "node-mocks-http@npm:1.16.2" dependencies: accepts: ^1.3.7 content-disposition: ^0.5.3 @@ -37346,7 +37840,7 @@ __metadata: optional: true "@types/node": optional: true - checksum: 198030725eac236062eb3547a7d5cec2d6f2d44bf05efab0ea621e90f671d6966dca2873faaea9bcbb5dde92a222aff0610a01d453c2f76b0bc5dbdf4bd8057a + checksum: 9d148c49947e2161dbfd55204f07352f3fd976a41dfe355a97bd932cb8d4dbf584be4058fc78b121a9d83f0b86397e00a591e87afa9a1ecfb0335608ef1ace96 languageName: node linkType: hard @@ -37469,6 +37963,17 @@ __metadata: languageName: node linkType: hard +"nopt@npm:^8.0.0": + version: 8.0.0 + resolution: "nopt@npm:8.0.0" + dependencies: + abbrev: ^2.0.0 + bin: + nopt: bin/nopt.js + checksum: 2cfc65e7ee38af2e04aea98f054753b0230011c0eeca4ecf131bd7d25984cbbf6f214586e0ae5dfcc2e830bc0bffa5a7fb28ea8d0b306ffd4ae8ea2d814c1ab3 + languageName: node + linkType: hard + "nopt@npm:~1.0.10": version: 1.0.10 resolution: "nopt@npm:1.0.10" @@ -39245,27 +39750,27 @@ __metadata: languageName: node linkType: hard -"playwright-core@npm:1.49.0": - version: 1.49.0 - resolution: "playwright-core@npm:1.49.0" +"playwright-core@npm:1.49.1": + version: 1.49.1 + resolution: "playwright-core@npm:1.49.1" bin: playwright-core: cli.js - checksum: d8423ad0cab2e672856529bf6b98b406e7e605da098b847b9b54ee8ebd8d716ed8880a9afff4b38f0a2e3f59b95661c74589116ce3ff2b5e0ae3561507086c94 + checksum: a940f4b10ff1de033b4b8594b5104b02849a892d9adda0d42330a872cd3d8d287ffd2b01fc33f33ccd34f8904bb8ae8220b878b62e899f3d9bcd1b0945ab45c7 languageName: node linkType: hard -"playwright@npm:1.49.0": - version: 1.49.0 - resolution: "playwright@npm:1.49.0" +"playwright@npm:1.49.1": + version: 1.49.1 + resolution: "playwright@npm:1.49.1" dependencies: fsevents: 2.3.2 - playwright-core: 1.49.0 + playwright-core: 1.49.1 dependenciesMeta: fsevents: optional: true bin: playwright: cli.js - checksum: f1bfb2fff65cad2ce996edab74ec231dfd21aeb5961554b765ce1eaec27efb87eaba37b00e91ecd27727b82861e5d8c230abe4960e93f6ada8be5ad1020df306 + checksum: c136d42d625e32614f90e5228a165dc8be48c5bfb52aca9210c6ff04161a409dbe42fe5ae4f05a2653f6a1b836876a04d3b0f24bcbbc053d1509c1d605b7c8d5 languageName: node linkType: hard @@ -39996,6 +40501,13 @@ __metadata: languageName: node linkType: hard +"proc-log@npm:^5.0.0": + version: 5.0.0 + resolution: "proc-log@npm:5.0.0" + checksum: c78b26ecef6d5cce4a7489a1e9923d7b4b1679028c8654aef0463b27f4a90b0946cd598f55799da602895c52feb085ec76381d007ab8dcceebd40b89c2f9dfe0 + languageName: node + linkType: hard + "process-nextick-args@npm:^2.0.0, process-nextick-args@npm:~2.0.0": version: 2.0.1 resolution: "process-nextick-args@npm:2.0.1" @@ -43225,14 +43737,14 @@ __metadata: languageName: node linkType: hard -"socks-proxy-agent@npm:^8.0.1, socks-proxy-agent@npm:^8.0.2, socks-proxy-agent@npm:^8.0.4": - version: 8.0.4 - resolution: "socks-proxy-agent@npm:8.0.4" +"socks-proxy-agent@npm:^8.0.1, socks-proxy-agent@npm:^8.0.2, socks-proxy-agent@npm:^8.0.3, socks-proxy-agent@npm:^8.0.4": + version: 8.0.5 + resolution: "socks-proxy-agent@npm:8.0.5" dependencies: - agent-base: ^7.1.1 + agent-base: ^7.1.2 debug: ^4.3.4 socks: ^2.8.3 - checksum: b2ec5051d85fe49072f9a250c427e0e9571fd09d5db133819192d078fd291276e1f0f50f6dbc04329b207738b1071314cee8bdbb4b12e27de42dbcf1d4233c67 + checksum: b4fbcdb7ad2d6eec445926e255a1fb95c975db0020543fbac8dfa6c47aecc6b3b619b7fb9c60a3f82c9b2969912a5e7e174a056ae4d98cb5322f3524d6036e1d languageName: node linkType: hard @@ -43534,6 +44046,15 @@ __metadata: languageName: node linkType: hard +"ssri@npm:^12.0.0": + version: 12.0.0 + resolution: "ssri@npm:12.0.0" + dependencies: + minipass: ^7.0.3 + checksum: ef4b6b0ae47b4a69896f5f1c4375f953b9435388c053c36d27998bc3d73e046969ccde61ab659e679142971a0b08e50478a1228f62edb994105b280f17900c98 + languageName: node + linkType: hard + "ssri@npm:^6.0.1": version: 6.0.2 resolution: "ssri@npm:6.0.2" @@ -43593,10 +44114,10 @@ __metadata: languageName: node linkType: hard -"stackframe@npm:^1.1.1": - version: 1.1.1 - resolution: "stackframe@npm:1.1.1" - checksum: 6031b30cc070972be6b12f4f4109e62150912ddbc8d6d2bc1707387bfa74b69ec298aa1211b9bf8dc4cf4f5245a5cdb72dda4b7c0467ea0cce2d10e4f10ffe3a +"stackframe@npm:^1.1.1, stackframe@npm:^1.3.4": + version: 1.3.4 + resolution: "stackframe@npm:1.3.4" + checksum: bae1596873595c4610993fa84f86a3387d67586401c1816ea048c0196800c0646c4d2da98c2ee80557fd9eff05877efe33b91ba6cd052658ed96ddc85d19067d languageName: node linkType: hard @@ -44550,7 +45071,7 @@ __metadata: languageName: node linkType: hard -"tar@npm:^7.0.0": +"tar@npm:^7.0.0, tar@npm:^7.4.3": version: 7.4.3 resolution: "tar@npm:7.4.3" dependencies: @@ -45874,6 +46395,15 @@ __metadata: languageName: node linkType: hard +"unique-filename@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-filename@npm:4.0.0" + dependencies: + unique-slug: ^5.0.0 + checksum: 6a62094fcac286b9ec39edbd1f8f64ff92383baa430af303dfed1ffda5e47a08a6b316408554abfddd9730c78b6106bef4ca4d02c1231a735ddd56ced77573df + languageName: node + linkType: hard + "unique-slug@npm:^2.0.0": version: 2.0.2 resolution: "unique-slug@npm:2.0.2" @@ -45892,6 +46422,15 @@ __metadata: languageName: node linkType: hard +"unique-slug@npm:^5.0.0": + version: 5.0.0 + resolution: "unique-slug@npm:5.0.0" + dependencies: + imurmurhash: ^0.1.4 + checksum: 222d0322bc7bbf6e45c08967863212398313ef73423f4125e075f893a02405a5ffdbaaf150f7dd1e99f8861348a486dd079186d27c5f2c60e465b7dcbb1d3e5b + languageName: node + linkType: hard + "unique-string@npm:^2.0.0": version: 2.0.0 resolution: "unique-string@npm:2.0.0" @@ -47202,6 +47741,17 @@ __metadata: languageName: node linkType: hard +"which@npm:^5.0.0": + version: 5.0.0 + resolution: "which@npm:5.0.0" + dependencies: + isexe: ^3.1.1 + bin: + node-which: bin/which.js + checksum: 6ec99e89ba32c7e748b8a3144e64bfc74aa63e2b2eacbb61a0060ad0b961eb1a632b08fb1de067ed59b002cec3e21de18299216ebf2325ef0f78e0f121e14e90 + languageName: node + linkType: hard + "wide-align@npm:^1.1.2": version: 1.1.5 resolution: "wide-align@npm:1.1.5" @@ -47591,7 +48141,7 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^2.0.0, yaml@npm:^2.0.0-10, yaml@npm:^2.1.1, yaml@npm:^2.2.1, yaml@npm:^2.2.2, yaml@npm:^2.3.2, yaml@npm:^2.3.3, yaml@npm:^2.3.4": +"yaml@npm:^2.0.0, yaml@npm:^2.0.0-10, yaml@npm:^2.1.1, yaml@npm:^2.2.1, yaml@npm:^2.2.2, yaml@npm:^2.3.2, yaml@npm:^2.3.3, yaml@npm:^2.3.4, yaml@npm:~2.6.1": version: 2.6.1 resolution: "yaml@npm:2.6.1" bin: @@ -47600,15 +48150,6 @@ __metadata: languageName: node linkType: hard -"yaml@npm:~2.5.0": - version: 2.5.1 - resolution: "yaml@npm:2.5.1" - bin: - yaml: bin.mjs - checksum: 31275223863fbd0b47ba9d2b248fbdf085db8d899e4ca43fff8a3a009497c5741084da6871d11f40e555d61360951c4c910b98216c1325d2c94753c0036d8172 - languageName: node - linkType: hard - "yargs-parser@npm:^20.2.2": version: 20.2.9 resolution: "yargs-parser@npm:20.2.9"