diff --git a/.changeset/backend-common-slips-away.md b/.changeset/backend-common-slips-away.md new file mode 100644 index 0000000000..93b77f1111 --- /dev/null +++ b/.changeset/backend-common-slips-away.md @@ -0,0 +1,7 @@ +--- +'@backstage/backend-common': patch +--- + +Added a `stream()` method to complement the `buffer()` method on `ReadUrlResponse`. A `ReadUrlResponseFactory` utility class is now also available, providing a simple, consistent way to provide a valid `ReadUrlResponse`. + +This method, though optional for now, will be required on the responses of `UrlReader.readUrl()` implementations in a future release. diff --git a/.changeset/beige-glasses-swim.md b/.changeset/beige-glasses-swim.md new file mode 100644 index 0000000000..9360bd5fdf --- /dev/null +++ b/.changeset/beige-glasses-swim.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Enabled select component to be enabled by keyboard diff --git a/.changeset/big-teachers-dress.md b/.changeset/big-teachers-dress.md new file mode 100644 index 0000000000..418b6a2f3f --- /dev/null +++ b/.changeset/big-teachers-dress.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-kubernetes': patch +'@backstage/plugin-kubernetes-backend': patch +'@backstage/plugin-kubernetes-common': patch +--- + +add Azure Identity auth provider and AKS dashboard formatter diff --git a/.changeset/dirty-ducks-suffer.md b/.changeset/dirty-ducks-suffer.md new file mode 100644 index 0000000000..bcfef8550b --- /dev/null +++ b/.changeset/dirty-ducks-suffer.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-org': patch +--- + +Fixed overflow bug of name and email on EntitiyMembersListCard component which can occur on specific 'screen width' + ’character length' combinations diff --git a/.changeset/dry-scissors-dream.md b/.changeset/dry-scissors-dream.md new file mode 100644 index 0000000000..09965f0f59 --- /dev/null +++ b/.changeset/dry-scissors-dream.md @@ -0,0 +1,5 @@ +--- +'@backstage/integration': minor +--- + +added the possibility to handle raw Gitlab URLs with nested namespaces diff --git a/.changeset/dull-waves-marry.md b/.changeset/dull-waves-marry.md new file mode 100644 index 0000000000..22d33238b4 --- /dev/null +++ b/.changeset/dull-waves-marry.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs': patch +--- + +Create a menu in the sub header of documentation pages, it is responsible for rendering TechDocs addons that allow users to customize their reading experience. diff --git a/.changeset/empty-planes-destroy.md b/.changeset/empty-planes-destroy.md new file mode 100644 index 0000000000..350dcc6b44 --- /dev/null +++ b/.changeset/empty-planes-destroy.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-bazaar': patch +--- + +Exported the SortView component from the Bazaar plugin for use directly diff --git a/.changeset/fluffy-sloths-deliver.md b/.changeset/fluffy-sloths-deliver.md new file mode 100644 index 0000000000..ba4e6e4fe5 --- /dev/null +++ b/.changeset/fluffy-sloths-deliver.md @@ -0,0 +1,10 @@ +--- +'@backstage/plugin-kubernetes': patch +'@backstage/plugin-kubernetes-backend': patch +'@backstage/plugin-kubernetes-common': patch +--- + +Add support for 'oidc' as authProvider for kubernetes authentication +and adds optional 'oidcTokenProvider' config value. This will allow +users to authenticate to kubernetes cluster using id tokens obtained +from the configured auth provider in their backstage instance. diff --git a/.changeset/good-beans-knock.md b/.changeset/good-beans-knock.md new file mode 100644 index 0000000000..91de53c128 --- /dev/null +++ b/.changeset/good-beans-knock.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Don't set the background color on an Avatar component that has a picture. diff --git a/.changeset/nice-parrots-lie.md b/.changeset/nice-parrots-lie.md new file mode 100644 index 0000000000..2a917b89f3 --- /dev/null +++ b/.changeset/nice-parrots-lie.md @@ -0,0 +1,17 @@ +--- +'@backstage/plugin-techdocs-react': patch +--- + +Create a new addon location called "Settings", it is designed for addons that allow users to customize the reading experience in documentation pages. + +Usage example: + +```tsx +const TextSize = techdocsModuleAddonsContribPlugin.provide( + createTechDocsAddonExtension({ + name: 'TextSize', + location: TechDocsAddonLocations.Settings, + component: TextSizeAddon, + }), +); +``` diff --git a/.changeset/pre.json b/.changeset/pre.json index cdcad84ba8..22d8a3460d 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -151,36 +151,53 @@ "@internal/plugin-todo-list": "1.0.0", "@internal/plugin-todo-list-backend": "1.0.0", "@internal/plugin-todo-list-common": "1.0.0", - "@backstage/plugin-techdocs-addons-test-utils": "0.0.0" + "@backstage/plugin-techdocs-addons-test-utils": "0.0.0", + "@backstage/plugin-codescene": "0.0.0" }, "changesets": [ "afraid-insects-do", + "backend-common-slips-away", + "backend-common-twist-your-ankle", + "beige-glasses-swim", "beige-panthers-dream", + "big-teachers-dress", "brave-starfishes-try", "breezy-days-prove", "bright-panthers-guess", "chatty-forks-bathe", + "chatty-pears-nail", "clever-trains-greet", "cool-mice-sit", "cool-ties-share", "curly-parrots-applaud", "cyan-boxes-double", + "dirty-clocks-poke", + "dirty-ducks-suffer", "dirty-eagles-hunt", + "dull-waves-marry", "early-crabs-help", "early-lemons-add", "eighty-chicken-retire", "empty-mugs-bow", + "empty-planes-destroy", "empty-poems-lick", "fair-kings-retire", "fair-pigs-mate", + "fast-stingrays-guess", + "fluffy-poems-sell", + "fluffy-sloths-deliver", + "fresh-panthers-arrive", "funny-lamps-turn", "fuzzy-seahorses-teach", + "gentle-penguins-kick", "giant-cheetahs-thank", + "good-beans-knock", "grumpy-panthers-peel", "hip-adults-collect", "hip-monkeys-hide", "honest-kids-live", "hot-peaches-give", + "hungry-chefs-return", "hungry-goats-mate", "kind-cats-clap", "lazy-zebras-pay", @@ -196,6 +213,7 @@ "nasty-humans-give", "nasty-paws-move", "new-beds-argue", + "nice-parrots-lie", "nine-actors-fly", "nine-geese-rest", "odd-apples-smash", @@ -204,14 +222,27 @@ "perfect-penguins-rescue", "pink-mayflies-rhyme", "polite-planets-learn", + "pretty-readers-grow", "renovate-05696d1", + "renovate-4b92131", "renovate-5970cc2", + "renovate-759d9d5", + "renovate-9466904", + "renovate-abcbd6e", + "renovate-abcbd6e2", "renovate-b063c4b", "renovate-bf43c44", + "renovate-bf63f74", "renovate-ca619fc", + "rotten-impalas-clap", "search-dry-wolves-join", "search-heavy-llamas-worry", + "search-the-worst-of-you", + "serious-apricots-collect", "seven-deers-rule", + "seven-panthers-pump", + "shiny-apes-design", + "shiny-moles-study", "shiny-students-approve", "short-chicken-act", "short-dodos-sparkle", @@ -219,9 +250,11 @@ "silver-readers-deliver", "six-buckets-tap", "sixty-llamas-change", + "small-eggs-guess", "smart-ghosts-search", "spotty-plums-rule", "stale-pigs-reply", + "stale-pugs-kiss", "strong-mangos-sell", "swift-bugs-share", "swift-parrots-hammer", @@ -229,16 +262,27 @@ "tasty-drinks-teach", "techdocs-changeset-not-found", "techdocs-five-hundred-ml", + "techdocs-hot-berries-collect", + "techdocs-loose-seal-blooth", "techdocs-low-calorie-drink", + "techdocs-money-banana-stand", "techdocs-nice-boats-wonder", "techdocs-quick-owls-smile", "techdocs-touch-screen-wipes", "techdocs-vitamin-well-reload", "thick-bees-brush", + "thick-tools-dream", + "three-tips-hunt", "tough-forks-carry", + "tricky-laws-thank", + "tricky-phones-sing", "violet-steaks-knock", + "warm-suns-wonder", "wicked-vans-press", "wild-pigs-work", - "wise-emus-wait" + "wise-countries-watch", + "wise-doors-hammer", + "wise-emus-wait", + "witty-lions-reply" ] } diff --git a/.changeset/renovate-9008399.md b/.changeset/renovate-9008399.md new file mode 100644 index 0000000000..64e1dd07a8 --- /dev/null +++ b/.changeset/renovate-9008399.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-codescene': patch +--- + +Updated dependency `@testing-library/user-event` to `^14.0.0`. diff --git a/.changeset/renovate-abcbd6e.md b/.changeset/renovate-abcbd6e.md deleted file mode 100644 index e96d9ea875..0000000000 --- a/.changeset/renovate-abcbd6e.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-scaffolder': patch -'@backstage/plugin-techdocs': patch ---- - -Updated dependency `event-source-polyfill` to `1.0.26`. diff --git a/.changeset/renovate-db1641c.md b/.changeset/renovate-db1641c.md new file mode 100644 index 0000000000..8d34bd3eb1 --- /dev/null +++ b/.changeset/renovate-db1641c.md @@ -0,0 +1,7 @@ +--- +'@backstage/core-components': patch +'@backstage/plugin-codescene': patch +'@backstage/plugin-sonarqube': patch +--- + +Updated dependency `rc-progress` to `3.3.2`. diff --git a/.changeset/rotten-impalas-clap.md b/.changeset/rotten-impalas-clap.md new file mode 100644 index 0000000000..6626a0a0bf --- /dev/null +++ b/.changeset/rotten-impalas-clap.md @@ -0,0 +1,6 @@ +--- +'@backstage/core-components': patch +'@backstage/plugin-catalog': patch +--- + +Sidebar NAV now includes aria-label. Component AboutField now uses h2 variant instead of subtitle2 (font properties unchanged) diff --git a/.changeset/seven-panthers-pump.md b/.changeset/seven-panthers-pump.md new file mode 100644 index 0000000000..856ab38d21 --- /dev/null +++ b/.changeset/seven-panthers-pump.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Add ARIA landmark(
), & label and a heading to OAuthRequestDialog. Removed nested interactive control (button). diff --git a/.changeset/shiny-apes-design.md b/.changeset/shiny-apes-design.md new file mode 100644 index 0000000000..69dfbf57ab --- /dev/null +++ b/.changeset/shiny-apes-design.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +Updated parseEntityTransformParams to handle keys with '.' in them. This will allow for querying of entities based off annotations such as 'backstage.io/orgin-location' or other entity field keys that have '.' in them. diff --git a/.changeset/shiny-moles-study.md b/.changeset/shiny-moles-study.md new file mode 100644 index 0000000000..59ce7d560b --- /dev/null +++ b/.changeset/shiny-moles-study.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Properly highlight `SidebarSubmenuItem` dropdown items on hover, use ellipsis styling on long labels in `SidebarSubmenu`, allow `icon` and `to` properties to be optional on `SidebarSubmenuItem`, and fix `SidebarPage` padding to be responsive to pinned state diff --git a/.changeset/shy-rings-mix.md b/.changeset/shy-rings-mix.md new file mode 100644 index 0000000000..de322fdf85 --- /dev/null +++ b/.changeset/shy-rings-mix.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-app-api': patch +--- + +Fix SAML session schema to no longer require the (deprecated) id, to unbreak session data storage. diff --git a/.changeset/small-eggs-guess.md b/.changeset/small-eggs-guess.md new file mode 100644 index 0000000000..4738a8775a --- /dev/null +++ b/.changeset/small-eggs-guess.md @@ -0,0 +1,34 @@ +--- +'@backstage/plugin-techdocs-module-addons-contrib': patch +--- + +Create a TechDocs `` addon that allows users to set a font size in the browser's local storage for the text of documentation pages. + +Here's an example on how to use it in a Backstage app: + +```diff +import { + DefaultTechDocsHome, + TechDocsIndexPage, + TechDocsReaderPage, +} from '@backstage/plugin-techdocs'; +import { TechDocsAddons } from '@backstage/plugin-techdocs-react/alpha'; ++import { TextSize } from '@backstage/plugin-techdocs-module-addons-contrib'; + +const AppRoutes = () => { + + // other plugin routes + }> + + + } + > + ++ + + + ; +}; +``` diff --git a/.changeset/stale-pugs-kiss.md b/.changeset/stale-pugs-kiss.md new file mode 100644 index 0000000000..db25d1ab2a --- /dev/null +++ b/.changeset/stale-pugs-kiss.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-home': patch +--- + +Display entity titles in `StarredEntities` home page card (if defined) and don't show entities which no longer exist diff --git a/.changeset/techdocs-hot-berries-collect.md b/.changeset/techdocs-hot-berries-collect.md new file mode 100644 index 0000000000..efb8dcc7c9 --- /dev/null +++ b/.changeset/techdocs-hot-berries-collect.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs': patch +--- + +Loading SVGs correctly with `bota` with extended characters diff --git a/.changeset/techdocs-light-treason.md b/.changeset/techdocs-light-treason.md new file mode 100644 index 0000000000..52136a732d --- /dev/null +++ b/.changeset/techdocs-light-treason.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs-node': patch +--- + +Updated the default version of the `@spotify/techdocs` container used when `techdocs.generator.runIn` is `docker` to `v1.0.3`. diff --git a/.changeset/techdocs-loose-seal-blooth.md b/.changeset/techdocs-loose-seal-blooth.md new file mode 100644 index 0000000000..fc6e809077 --- /dev/null +++ b/.changeset/techdocs-loose-seal-blooth.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs-addons-test-utils': patch +--- + +Fixed a bug preventing testing of TechDocs Addons whose dom contained `` tags. diff --git a/.changeset/techdocs-money-banana-stand.md b/.changeset/techdocs-money-banana-stand.md new file mode 100644 index 0000000000..43cbfaafbf --- /dev/null +++ b/.changeset/techdocs-money-banana-stand.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs-addons-test-utils': patch +--- + +The `TechDocsAddonTester` class may now be extended if custom test configuration is needed. diff --git a/.changeset/techdocs-wee-britain.md b/.changeset/techdocs-wee-britain.md new file mode 100644 index 0000000000..661ff76fc5 --- /dev/null +++ b/.changeset/techdocs-wee-britain.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs-addons-test-utils': patch +--- + +Fixed a type bug preventing `buildAddonsInTechDocs().withApis()` from being called with multiple partial API implementations. diff --git a/.changeset/thick-tools-dream.md b/.changeset/thick-tools-dream.md new file mode 100644 index 0000000000..4979c62787 --- /dev/null +++ b/.changeset/thick-tools-dream.md @@ -0,0 +1,40 @@ +--- +'@backstage/create-app': patch +--- + +Implement highlighting matching terms in search results. To enable this for an existing app, make the following changes: + +```diff +// packages/app/src/components/search/SearchPage.tsx +... +- {results.map(({ type, document }) => { ++ {results.map(({ type, document, highlight }) => { + switch (type) { + case 'software-catalog': + return ( + + ); + case 'techdocs': + return ( + + ); + default: + return ( + + ); + } + })} +... +``` diff --git a/.changeset/tricky-laws-thank.md b/.changeset/tricky-laws-thank.md new file mode 100644 index 0000000000..c9efa0c495 --- /dev/null +++ b/.changeset/tricky-laws-thank.md @@ -0,0 +1,8 @@ +--- +'@backstage/plugin-catalog': patch +'@backstage/plugin-search': patch +'@backstage/plugin-search-react': patch +'@backstage/plugin-techdocs': patch +--- + +Updated search result components to support rendering content with highlighted matched terms diff --git a/.changeset/warm-suns-wonder.md b/.changeset/warm-suns-wonder.md new file mode 100644 index 0000000000..9f52889fca --- /dev/null +++ b/.changeset/warm-suns-wonder.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-search-backend-module-elasticsearch': patch +'@backstage/plugin-search-backend-node': patch +'@backstage/plugin-search-common': patch +--- + +Support generating highlighted matched terms in search result data diff --git a/.changeset/wise-countries-watch.md b/.changeset/wise-countries-watch.md new file mode 100644 index 0000000000..e48e7bbecb --- /dev/null +++ b/.changeset/wise-countries-watch.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-azure-devops': patch +'@backstage/plugin-azure-devops-backend': patch +'@backstage/plugin-azure-devops-common': patch +--- + +Added entity view for Azure Git Tags, based on existing Pull Requests view diff --git a/.changeset/wise-doors-hammer.md b/.changeset/wise-doors-hammer.md new file mode 100644 index 0000000000..68160a3b64 --- /dev/null +++ b/.changeset/wise-doors-hammer.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-org': patch +--- + +Include namespace in `MyGroupSidebarItem` if not default and remove root item routing if there are multiple groups diff --git a/.github/renovate.json5 b/.github/renovate.json5 index ff351a5e0f..a8bc3448a5 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -3,7 +3,7 @@ extends: ['config:base', ':disableDependencyDashboard', ':gitSignOff'], rangeStrategy: 'update-lockfile', // @elastic/elasticsearch is ignored due to licensing issues. See #10992 - ignoreDeps: ['@elastic/elasticsearch'], + ignoreDeps: ['@elastic/elasticsearch', 'event-source-polyfill'], packageRules: [ { matchSourceUrlPrefixes: ['https://github.com/spotify/web-scripts'], diff --git a/.github/workflows/automate_review-labels.yaml b/.github/workflows/automate_review-labels.yaml index 3393344ddf..cae71f6aaa 100644 --- a/.github/workflows/automate_review-labels.yaml +++ b/.github/workflows/automate_review-labels.yaml @@ -16,14 +16,14 @@ jobs: label: runs-on: ubuntu-latest steps: + # THESE SCRIPTS SHOULD BE INLINED AND NOT IN REPO + # DUE TO THE TOKEN PERMISSIONS THAT ARE GIVEN + # TO THE WORKFLOW. THIS SCRIPT WILL AND SHOULD + # RUN FROM THE BASE REPO ALL TIMES. - uses: actions/github-script@v6 id: fix-labels with: github-token: ${{ secrets.GITHUB_TOKEN }} - # THIS SCRIPT SHOULD BE INLINED AND NOT IN REPO - # DUE TO THE TOKEN PERMISSIONS THAT ARE GIVEN - # TO THE WORKFLOW. THIS SCRIPT WILL AND SHOULD - # RUN FROM THE BASE REPO ALL TIMES. script: | if (['opened', 'synchronize'].includes('${{ github.event.action }}')) { // if it's the author, always add awaiting-review label @@ -48,3 +48,37 @@ jobs: console.log(e) }); } + + - name: Add PRs to review board + uses: actions/github-script@v6 + if: github.event.action == 'opened' || github.event.action == 'reopened' + env: + PROJECT_ID: PN_kwDOBFKqdc02LQ + with: + github-token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} + script: | + const prLookup = await github.graphql(` + query($owner: String!, $repo: String!, $number: Int!){ + repository(owner: $owner, name: $repo) { + pullRequest(number: $number) { + id + } + } + } + `, context.issue); + + await github.graphql(` + mutation($projectId: ID!, $contentId: ID!) { + addProjectNextItem(input: { + projectId: $projectId, + contentId: $contentId, + }) { + projectNextItem { + id + } + } + } + `, { + projectId: process.env.PROJECT_ID, + contentId: prLookup.repository.pullRequest.id + }) diff --git a/.github/workflows/deploy_microsite.yml b/.github/workflows/deploy_microsite.yml index 16e738abda..d0f8dc1e79 100644 --- a/.github/workflows/deploy_microsite.yml +++ b/.github/workflows/deploy_microsite.yml @@ -55,8 +55,7 @@ jobs: run: ls microsite/build/backstage && ls microsite/build/backstage/storybook - name: Deploy both microsite and storybook to gh-pages - uses: JamesIves/github-pages-deploy-action@3.7.1 + uses: JamesIves/github-pages-deploy-action@v4.3.3 with: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - BRANCH: gh-pages - FOLDER: microsite/build/backstage + branch: gh-pages + folder: microsite/build/backstage diff --git a/.github/workflows/sync_snyk-monitor.yml b/.github/workflows/sync_snyk-monitor.yml index 1c2390bfc4..d6adca927e 100644 --- a/.github/workflows/sync_snyk-monitor.yml +++ b/.github/workflows/sync_snyk-monitor.yml @@ -45,6 +45,6 @@ jobs: env: SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} - name: Upload Snyk report - uses: github/codeql-action/upload-sarif@v1 + uses: github/codeql-action/upload-sarif@v2 with: sarif_file: snyk.sarif diff --git a/.github/workflows/verify_codeql.yml b/.github/workflows/verify_codeql.yml index 2be2d0804f..f3417ac582 100644 --- a/.github/workflows/verify_codeql.yml +++ b/.github/workflows/verify_codeql.yml @@ -43,7 +43,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v2 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -54,7 +54,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@v1 + uses: github/codeql-action/autobuild@v2 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -68,4 +68,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v2 diff --git a/ADOPTERS.md b/ADOPTERS.md index d35a891244..3915aee949 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -124,3 +124,6 @@ _If you're using Backstage in your organization, please try to add your company | [Contentful](https://www.contentful.com) | [James Bourne](https://github.com/jamesmbourne) | Centralized documentation of service ownership, APIs, and documentation, and new service creation with a custom scaffolder - [full case study with Roadie](https://roadie.io/case-studies/maintaining-velocity-through-hypergrowth-contentful/). | | [Back Market](https://www.backmarket.com) | [Sami Farhat](https://github.com/skfarhat) | Internal Developer Portal featuring catalog, tech-radar, ownership management, component creation (scaffolder) and centralized infrastructure management -- probably more to come. | | [Avalia Systems](https://avalia.io) | [Olivier Liechti](https://github.com/wasadigi), [Fabio Velloso](https://github.com/fabiovelloso) | Innersource, software analytics, knowledge base for 360 software assessments, collaborative applications, hub for tracking and sharing IP assets. | +| [Albert Heijn](https://ah.technology) | [Joost Hofman](https://github.com/joosthofman), [Reindrich Geerman](https://github.com/reinst) | Single point of entry for all our engineers (Developer portal), Tech radar, catalog, templates (paved roads) and tech documentation. | +| [Wise, formerly TransferWise](https://wise.com) | [Andrew Beveridge](https://github.com/beveradb) | It's early days for us, we're trying to start small with catalog, tech docs and unified search. Future ambitious vision includes scaffolder for one-click component addition, building out integrations with CI/CD tooling, kubernetes clusters, monitoring/alerting tooling etc. and aiming for a frictionless "golden path" for engineers! 🚀 | + diff --git a/contrib/chart/backstage/Chart.lock b/contrib/chart/backstage/Chart.lock index d18a48a655..2a304bd917 100644 --- a/contrib/chart/backstage/Chart.lock +++ b/contrib/chart/backstage/Chart.lock @@ -1,6 +1,6 @@ dependencies: - name: postgresql repository: https://charts.bitnami.com/bitnami - version: 9.8.12 -digest: sha256:549b9a0cdf7b2e0ad949ebad853a467bf320928970a946fb0ef7e13e9bdb7a10 -generated: "2022-04-21T07:02:48.301491565Z" + version: 11.1.28 +digest: sha256:91deeef78a140252c1ec9fbdf011e5584fc26b67f5a5dc9b6c90be2eee838499 +generated: "2022-05-06T14:02:33.227808666Z" diff --git a/contrib/chart/backstage/Chart.yaml b/contrib/chart/backstage/Chart.yaml index 9770ef665c..43c1615d2f 100644 --- a/contrib/chart/backstage/Chart.yaml +++ b/contrib/chart/backstage/Chart.yaml @@ -18,7 +18,7 @@ sources: dependencies: - name: postgresql condition: postgresql.enabled - version: 9.8.12 + version: 11.1.28 repository: https://charts.bitnami.com/bitnami maintainers: diff --git a/docs/assets/techdocs/addon-locations.png b/docs/assets/techdocs/addon-locations.png index e535fe61aa..0541f35af5 100644 Binary files a/docs/assets/techdocs/addon-locations.png and b/docs/assets/techdocs/addon-locations.png differ diff --git a/docs/features/kubernetes/configuration.md b/docs/features/kubernetes/configuration.md index cb30451c7d..246e4dcd43 100644 --- a/docs/features/kubernetes/configuration.md +++ b/docs/features/kubernetes/configuration.md @@ -85,12 +85,14 @@ array. Users will see this value in the Software Catalog Kubernetes plugin. This determines how the Kubernetes client authenticates with the Kubernetes cluster. Valid values are: -| Value | Description | -| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `serviceAccount` | This will use a Kubernetes [service account](https://kubernetes.io/docs/reference/access-authn-authz/service-accounts-admin/) to access the Kubernetes API. When this is used the `serviceAccountToken` field should also be set. | -| `google` | This will use a user's Google auth token from the [Google auth plugin](https://backstage.io/docs/auth/) to access the Kubernetes API. | -| `aws` | This will use AWS credentials to access resources in EKS clusters | -| `googleServiceAccount` | This will use the Google Cloud service account credentials to access resources in clusters | +| Value | Description | +| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `serviceAccount` | This will use a Kubernetes [service account](https://kubernetes.io/docs/reference/access-authn-authz/service-accounts-admin/) to access the Kubernetes API. When this is used the `serviceAccountToken` field should also be set. | +| `google` | This will use a user's Google auth token from the [Google auth plugin](https://backstage.io/docs/auth/) to access the Kubernetes API. | +| `aws` | This will use AWS credentials to access resources in EKS clusters | +| `googleServiceAccount` | This will use the Google Cloud service account credentials to access resources in clusters | +| `azure` | This will use [Azure Identity](https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview) to access resources in clusters | +| `oidc` | This will use [Oidc Tokens](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#openid-connect-tokens) to authenticate to the Kubernetes API. When this is used the `oidcTokenProvider` field should also be set. | ##### `clusters.\*.skipTLSVerify` @@ -114,6 +116,33 @@ kubectl -n get secret $(kubectl -n get sa ); default: @@ -78,6 +79,7 @@ export const searchPage = ( ); } @@ -266,6 +268,7 @@ an example: ); // ... diff --git a/docs/features/search/how-to-guides.md b/docs/features/search/how-to-guides.md index d0e0fd95e6..64787ec3c1 100644 --- a/docs/features/search/how-to-guides.md +++ b/docs/features/search/how-to-guides.md @@ -411,6 +411,29 @@ export class YourSearchEngine implements SearchEngine { } ``` +## How to customize search results highlighting styling + +The default highlighting styling for matched terms in search results is your +browsers default styles for the `` HTML tag. If you want to customize +how highlighted terms look you can follow Backstage's guide on how to +[Customize the look-and-feel of your App](https://backstage.io/docs/getting-started/app-custom-theme) +to create an override with your preferred styling. + +For example, the following will result in highlighted terms to be bold & underlined: + +```jsx +const highlightOverride = { + BackstageHighlightedSearchResultText: { + highlight: { + color: 'inherit', + backgroundColor: 'inherit', + fontWeight: 'bold', + textDecoration: 'underline', + }, + }, +}; +``` + [obj-mode]: https://nodejs.org/docs/latest-v14.x/api/stream.html#stream_object_mode [read-stream]: https://nodejs.org/docs/latest-v14.x/api/stream.html#stream_readable_streams [async-gen]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of#iterating_over_async_generators diff --git a/docs/features/techdocs/README.md b/docs/features/techdocs/README.md index c64d0b785d..5ac275b8b4 100644 --- a/docs/features/techdocs/README.md +++ b/docs/features/techdocs/README.md @@ -82,13 +82,17 @@ With the Backstage 1.2 release, we plan to introduce the [TechDocs Addon Framewo In addition to the framework itself, we'll be open sourcing a `` addon, helping you to create a feedback loop that drives up documentation quality and fosters a documentation culture at your organization. -### **Future work 🔮** +### **Next** -Some of the following items are coming soon and some are potential ideas. +- What can we do in TechDocs to drive up documentation quality? +### **Someday/Maybe** + +- Contribute to and deploy from a marketplace of TechDocs Addons +- Addon: MDX (allows you to use JSX in your Markdown content) +- Can we go static site generator agnostic? - Better integration with - [Scaffolder V2](https://github.com/backstage/backstage/issues/2771) (e.g. easy to choose and plug documentation template with Software Templates) -- Static site generator agnostic, including possible support for MDX (allowing you to use JSX in your Markdown content) + [Scaffolder V2](https://github.com/backstage/backstage/issues/2771) (e.g. easy to choose and apply documentation template with Software Templates) - Possible to configure several aspects about TechDocs (e.g. URL, homepage, theme) diff --git a/docs/features/techdocs/addons.md b/docs/features/techdocs/addons.md index 0fba3b92e3..e8af56d3fc 100644 --- a/docs/features/techdocs/addons.md +++ b/docs/features/techdocs/addons.md @@ -35,6 +35,8 @@ representative of physical spaces in the TechDocs UI: line as the title. - `Subheader`: For Addons that sit below the header but above all content. This is a great location for tooling/configuration of TechDocs display. +- `Settings`: These addons are items added to the settings menu list and are designed to make + the reader experience customizable, for example accessibility options. - `PrimarySidebar`: Left of the content, above of the navigation. - `SecondarySidebar`: Right of the content, above the table of contents. - `Content`: A special location intended for Addons which augment the @@ -109,9 +111,10 @@ page header, TechDocs Addons whose location is `Header` will not be rendered. Addons can, in principle, be provided by any plugin! To make it easier to discover available Addons, we've compiled a list of them here: -| Addon | Package/Plugin | Description | -| ---------------------------------------------------------------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [``](https://backstage.io/docs/reference/plugin-techdocs-module-addons-contrib.reportissue) | `@backstage/plugin-techdocs-module-addons-contrib` | Allows TechDocs users to select a portion of text on a TechDocs page and open an issue against the repository that contains the documentation, populating the issue description with the selected text according to a configurable template. | +| Addon | Package/Plugin | Description | +| ---------------------------------------------------------------------------------------------------------- | -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [``](https://backstage.io/docs/reference/plugin-techdocs-module-addons-contrib.reportissue) | `@backstage/plugin-techdocs-module-addons-contrib` | Allows TechDocs users to select a portion of text on a TechDocs page and open an issue against the repository that contains the documentation, populating the issue description with the selected text according to a configurable template. | +| [``](https://backstage.io/docs/reference/plugin-techdocs-module-addons-contrib.textsize) | `@backstage/plugin-techdocs-module-addons-contrib` | This TechDocs addon allows users to customize text size on documentation pages, they can select how much they want to increase or decrease the font size via slider or buttons. The default value for font size is 100% and this setting is kept in the browser's local storage whenever it is changed. | Got an Addon to contribute? Feel free to add a row above! diff --git a/docs/features/techdocs/cli.md b/docs/features/techdocs/cli.md index 9a7dccd5a6..52c389975e 100644 --- a/docs/features/techdocs/cli.md +++ b/docs/features/techdocs/cli.md @@ -120,7 +120,7 @@ Generate TechDocs documentation site using MkDocs. Options: --source-dir Source directory containing mkdocs.yml and docs/ directory. (default: ".") --output-dir Output directory containing generated TechDocs site. (default: "./site/") - --docker-image The mkdocs docker container to use (default: "spotify/techdocs:v1.0.2") + --docker-image The mkdocs docker container to use (default: "spotify/techdocs:v1.0.3") --no-pull Do not pull the latest docker image --no-docker Do not use Docker, use MkDocs executable and plugins in current user environment. --techdocs-ref The repository hosting documentation source files e.g. diff --git a/docs/releases/v1.2.0-next.2-changelog.md b/docs/releases/v1.2.0-next.2-changelog.md new file mode 100644 index 0000000000..6ca238ccb5 --- /dev/null +++ b/docs/releases/v1.2.0-next.2-changelog.md @@ -0,0 +1,1594 @@ +# Release v1.2.0-next.2 + +## @backstage/plugin-codescene@0.1.0-next.0 + +### Minor Changes + +- 9bc6e9493f: Add CodeScene plugin + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/config@1.0.1-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-scaffolder-backend@1.2.0-next.1 + +### Minor Changes + +- f8baf7df44: Added the ability to reference the user in the `template.yaml` manifest + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/plugin-catalog-backend@1.1.2-next.2 + - @backstage/plugin-scaffolder-common@1.1.0-next.0 + - @backstage/config@1.0.1-next.0 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/integration@1.2.0-next.1 + - @backstage/catalog-client@1.0.2-next.0 + +## @backstage/plugin-scaffolder-backend-module-rails@0.4.0-next.1 + +### Minor Changes + +- 3d001a3bcf: **BREAKING**: Added a new `allowedImageNames` option, which needs to list any image name for it to be allowed as `imageName` input. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/plugin-scaffolder-backend@1.2.0-next.1 + - @backstage/config@1.0.1-next.0 + - @backstage/integration@1.2.0-next.1 + +## @backstage/plugin-scaffolder-common@1.1.0-next.0 + +### Minor Changes + +- f8baf7df44: Added the ability to reference the user in the `template.yaml` manifest + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.0.2-next.0 + +## @backstage/backend-common@0.13.3-next.2 + +### Patch Changes + +- e0a6360b80: Added a `stream()` method to complement the `buffer()` method on `ReadUrlResponse`. A `ReadUrlResponseFactory` utility class is now also available, providing a simple, consistent way to provide a valid `ReadUrlResponse`. + + This method, though optional for now, will be required on the responses of `UrlReader.readUrl()` implementations in a future release. + +- 4b811aafce: Implemented the `UrlReader.search()` method for Google Cloud Storage. Due to limitations in the underlying storage API, only prefix-based searches are supported right now (for example, `https://storage.cloud.google.com/your-bucket/some-path/*`). + +- Updated dependencies + - @backstage/cli-common@0.1.9-next.0 + - @backstage/config@1.0.1-next.0 + - @backstage/config-loader@1.1.1-next.1 + - @backstage/integration@1.2.0-next.1 + +## @backstage/backend-tasks@0.3.1-next.1 + +### Patch Changes + +- 73480846dd: `TaskScheduleDefinition` has been updated to also accept an options object containing duration information in the form of days, hours, seconds and so on. This allows for scheduling without importing `luxon`. + + ```diff + -import { Duration } from 'luxon'; + // omitted other code + + const schedule = env.scheduler.createScheduledTaskRunner({ + - frequency: Duration.fromObject({ minutes: 10 }), + - timeout: Duration.fromObject({ minutes: 15 }), + + frequency: { minutes: 10 }, + + timeout: { minutes: 15 }, + // omitted other code + }); + ``` + +- ebbec677e1: Correctly set next run time for tasks + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + +## @backstage/backend-test-utils@0.1.24-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/cli@0.17.1-next.2 + +## @backstage/catalog-client@1.0.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.0.2-next.0 + +## @backstage/catalog-model@1.0.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.1-next.0 + +## @backstage/cli@0.17.1-next.2 + +### Patch Changes + +- 632be18bbc: Updated `create-github-app` command to prompt for read or write permissions to simplify setup. +- Updated dependencies + - @backstage/cli-common@0.1.9-next.0 + - @backstage/config@1.0.1-next.0 + - @backstage/release-manifests@0.0.3-next.0 + - @backstage/config-loader@1.1.1-next.1 + +## @backstage/cli-common@0.1.9-next.0 + +### Patch Changes + +- 6e830352d4: Updated dependency `@types/node` to `^16.0.0`. + +## @backstage/codemods@0.1.38-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.1.9-next.0 + +## @backstage/config@1.0.1-next.0 + +### Patch Changes + +- 6e830352d4: Updated dependency `@types/node` to `^16.0.0`. + +## @backstage/config-loader@1.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.1.9-next.0 + - @backstage/config@1.0.1-next.0 + +## @backstage/core-app-api@1.0.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.1-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/core-components@0.9.4-next.1 + +### Patch Changes + +- 55f68c386a: Enabled select component to be enabled by keyboard +- ba97b80421: Updated dependency `@types/react-syntax-highlighter` to `^15.0.0`. +- 2bcb0a0e2b: Sidebar NAV now includes aria-label. Component AboutField now uses h2 variant instead of subtitle2 (font properties unchanged) +- Updated dependencies + - @backstage/config@1.0.1-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/core-plugin-api@1.0.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.1-next.0 + +## @backstage/create-app@0.4.27-next.2 + +### Patch Changes + +- 73480846dd: Simplified the search collator scheduling by removing the need for the `luxon` dependency. + + For existing installations the scheduling can be simplified by removing the `luxon` dependency and using the human friendly duration object instead. + Please note that this only applies if luxon is not used elsewhere in your installation. + + `packages/backend/package.json` + + ```diff + "express": "^4.17.1", + "express-promise-router": "^4.1.0", + - "luxon": "^2.0.2", + ``` + + `packages/backend/src/plugins/search.ts` + + ```diff + import { Router } from 'express'; + -import { Duration } from 'luxon'; + + // omitted other code + + const schedule = env.scheduler.createScheduledTaskRunner({ + - frequency: Duration.fromObject({ minutes: 10 }), + - timeout: Duration.fromObject({ minutes: 15 }), + + frequency: { minutes: 10 }, + + timeout: { minutes: 15 }, + // A 3 second delay gives the backend server a chance to initialize before + // any collators are executed, which may attempt requests against the API. + - initialDelay: Duration.fromObject({ seconds: 3 }), + + initialDelay: { seconds: 3 }, + }); + ``` + +- 7cda923c16: Tweaked the `.dockerignore` file so that it's easier to add additional backend packages if desired. + + To apply this change to an existing app, make the following change to `.dockerignore`: + + ```diff + cypress + microsite + node_modules + -packages + -!packages/backend/dist + +packages/*/src + +packages/*/node_modules + plugins + ``` + +- f55414f895: Added sample catalog data to the template under a top-level `examples` directory. This includes some simple entities, org data, and a template. You can find the sample data at . + +- 3a74e203a8: Implement highlighting matching terms in search results. To enable this for an existing app, make the following changes: + + ```diff + // packages/app/src/components/search/SearchPage.tsx + ... + - {results.map(({ type, document }) => { + + {results.map(({ type, document, highlight }) => { + switch (type) { + case 'software-catalog': + return ( + + ); + case 'techdocs': + return ( + + ); + default: + return ( + + ); + } + })} + ... + ``` + +- Updated dependencies + - @backstage/cli-common@0.1.9-next.0 + +## @backstage/dev-utils@1.0.2-next.2 + +### Patch Changes + +- 6e830352d4: Updated dependency `@types/node` to `^16.0.0`. +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-app-api@1.0.2-next.1 + - @backstage/core-plugin-api@1.0.2-next.1 + - @backstage/integration-react@1.1.0-next.2 + - @backstage/test-utils@1.1.0-next.2 + +## @backstage/integration@1.2.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.1-next.0 + +## @backstage/integration-react@1.1.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/config@1.0.1-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + - @backstage/integration@1.2.0-next.1 + +## @backstage/release-manifests@0.0.3-next.0 + +### Patch Changes + +- 6e830352d4: Updated dependency `@types/node` to `^16.0.0`. + +## @backstage/search-common@0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-common@0.3.4-next.0 + +## @techdocs/cli@1.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/cli-common@0.1.9-next.0 + - @backstage/config@1.0.1-next.0 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/plugin-techdocs-node@1.1.1-next.1 + +## @backstage/techdocs-common@0.11.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-node@1.1.1-next.1 + +## @backstage/test-utils@1.1.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.1-next.0 + - @backstage/core-app-api@1.0.2-next.1 + - @backstage/core-plugin-api@1.0.2-next.1 + - @backstage/plugin-permission-common@0.6.1-next.0 + - @backstage/plugin-permission-react@0.4.1-next.1 + +## @backstage/plugin-adr-backend@0.1.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-search-common@0.3.4-next.0 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/integration@1.2.0-next.1 + - @backstage/plugin-adr-common@0.1.0-next.1 + - @backstage/catalog-client@1.0.2-next.0 + +## @backstage/plugin-adr-common@0.1.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-common@0.3.4-next.0 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/integration@1.2.0-next.1 + +## @backstage/plugin-airbrake@0.3.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/dev-utils@1.0.2-next.2 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + - @backstage/test-utils@1.1.0-next.2 + +## @backstage/plugin-airbrake-backend@0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + +## @backstage/plugin-allure@0.1.21-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-analytics-module-ga@0.1.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/config@1.0.1-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-api-docs@0.8.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog@1.2.0-next.2 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-app-backend@0.3.32-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/config-loader@1.1.1-next.1 + +## @backstage/plugin-auth-backend@0.13.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/plugin-auth-node@0.2.1-next.1 + - @backstage/catalog-client@1.0.2-next.0 + +## @backstage/plugin-auth-node@0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + +## @backstage/plugin-azure-devops@0.1.21-next.2 + +### Patch Changes + +- ac14fcaf38: Added entity view for Azure Git Tags, based on existing Pull Requests view +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-azure-devops-common@0.2.3-next.0 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-azure-devops-backend@0.3.11-next.1 + +### Patch Changes + +- ac14fcaf38: Added entity view for Azure Git Tags, based on existing Pull Requests view +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-azure-devops-common@0.2.3-next.0 + +## @backstage/plugin-azure-devops-common@0.2.3-next.0 + +### Patch Changes + +- ac14fcaf38: Added entity view for Azure Git Tags, based on existing Pull Requests view + +## @backstage/plugin-badges@0.2.29-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-badges-backend@0.1.26-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/catalog-client@1.0.2-next.0 + +## @backstage/plugin-bazaar@0.1.20-next.2 + +### Patch Changes + +- 84c9e35a2f: Exported the SortView component from the Bazaar plugin for use directly +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog@1.2.0-next.2 + - @backstage/cli@0.17.1-next.2 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + - @backstage/catalog-client@1.0.2-next.0 + +## @backstage/plugin-bazaar-backend@0.1.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/backend-test-utils@0.1.24-next.1 + +## @backstage/plugin-bitrise@0.1.32-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-catalog@1.2.0-next.2 + +### Patch Changes + +- 2bcb0a0e2b: Sidebar NAV now includes aria-label. Component AboutField now uses h2 variant instead of subtitle2 (font properties unchanged) +- 3a74e203a8: Updated search result components to support rendering content with highlighted matched terms +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-search-react@0.2.0-next.2 + - @backstage/plugin-search-common@0.3.4-next.0 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + - @backstage/integration-react@1.1.0-next.2 + - @backstage/catalog-client@1.0.2-next.0 + - @backstage/plugin-catalog-common@1.0.2-next.0 + +## @backstage/plugin-catalog-backend@1.1.2-next.2 + +### Patch Changes + +- 16a40ac4c0: Fix wrong return type of the `isGroupEntity` function. +- 2909746147: Updated parseEntityTransformParams to handle keys with '.' in them. This will allow for querying of entities based off annotations such as 'backstage.io/orgin-location' or other entity field keys that have '.' in them. +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/plugin-scaffolder-common@1.1.0-next.0 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-search-common@0.3.4-next.0 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/integration@1.2.0-next.1 + - @backstage/plugin-permission-common@0.6.1-next.0 + - @backstage/plugin-permission-node@0.6.1-next.1 + - @backstage/catalog-client@1.0.2-next.0 + - @backstage/plugin-catalog-common@1.0.2-next.0 + +## @backstage/plugin-catalog-backend-module-aws@0.1.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/plugin-catalog-backend@1.1.2-next.2 + - @backstage/backend-tasks@0.3.1-next.1 + - @backstage/config@1.0.1-next.0 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/integration@1.2.0-next.1 + +## @backstage/plugin-catalog-backend-module-azure@0.1.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/plugin-catalog-backend@1.1.2-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/integration@1.2.0-next.1 + +## @backstage/plugin-catalog-backend-module-bitbucket@0.1.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/plugin-catalog-backend@1.1.2-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/integration@1.2.0-next.1 + +## @backstage/plugin-catalog-backend-module-gerrit@0.1.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/plugin-catalog-backend@1.1.2-next.2 + - @backstage/backend-tasks@0.3.1-next.1 + - @backstage/config@1.0.1-next.0 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/integration@1.2.0-next.1 + +## @backstage/plugin-catalog-backend-module-github@0.1.3-next.1 + +### Patch Changes + +- a7de43f648: `GitHubOrgEntityProvider.fromConfig` now supports a `schedule` option like other + entity providers, that makes it more convenient to leverage using the common + task scheduler. + + If you want to use this in your own project, it is used something like the following: + + ```ts + // In packages/backend/src/plugins/catalog.ts + builder.addEntityProvider( + GitHubOrgEntityProvider.fromConfig(env.config, { + id: 'production', + orgUrl: 'https://github.com/backstage', + schedule: env.scheduler.createScheduledTaskRunner({ + frequency: { cron: '*/30 * * * *' }, + timeout: { minutes: 10 }, + }), + logger: env.logger, + }), + ); + ``` + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/plugin-catalog-backend@1.1.2-next.2 + - @backstage/backend-tasks@0.3.1-next.1 + - @backstage/config@1.0.1-next.0 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/integration@1.2.0-next.1 + +## @backstage/plugin-catalog-backend-module-gitlab@0.1.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/plugin-catalog-backend@1.1.2-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/integration@1.2.0-next.1 + +## @backstage/plugin-catalog-backend-module-ldap@0.4.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.1.2-next.2 + - @backstage/backend-tasks@0.3.1-next.1 + - @backstage/config@1.0.1-next.0 + - @backstage/catalog-model@1.0.2-next.0 + +## @backstage/plugin-catalog-backend-module-msgraph@0.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.1.2-next.2 + - @backstage/backend-tasks@0.3.1-next.1 + - @backstage/config@1.0.1-next.0 + - @backstage/catalog-model@1.0.2-next.0 + +## @backstage/plugin-catalog-common@1.0.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.6.1-next.0 + - @backstage/search-common@0.3.4-next.0 + +## @backstage/plugin-catalog-graph@0.2.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + - @backstage/catalog-client@1.0.2-next.0 + +## @backstage/plugin-catalog-graphql@0.3.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.1-next.0 + - @backstage/catalog-model@1.0.2-next.0 + +## @backstage/plugin-catalog-import@0.8.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + - @backstage/integration@1.2.0-next.1 + - @backstage/integration-react@1.1.0-next.2 + - @backstage/catalog-client@1.0.2-next.0 + +## @backstage/plugin-catalog-react@1.1.0-next.2 + +### Patch Changes + +- 57f41fb8d6: Make Menu item on filters accessible through keyboard +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + - @backstage/integration@1.2.0-next.1 + - @backstage/plugin-permission-common@0.6.1-next.0 + - @backstage/plugin-permission-react@0.4.1-next.1 + - @backstage/catalog-client@1.0.2-next.0 + - @backstage/plugin-catalog-common@1.0.2-next.0 + +## @backstage/plugin-cicd-statistics@0.1.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-cicd-statistics-module-gitlab@0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + - @backstage/plugin-cicd-statistics@0.1.7-next.2 + +## @backstage/plugin-circleci@0.3.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-cloudbuild@0.3.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-code-climate@0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-code-coverage@0.1.32-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-code-coverage-backend@0.1.30-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/integration@1.2.0-next.1 + - @backstage/catalog-client@1.0.2-next.0 + +## @backstage/plugin-config-schema@0.1.28-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/config@1.0.1-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-cost-insights@0.11.27-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/config@1.0.1-next.0 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-explore@0.3.36-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-fossa@0.2.37-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-github-actions@0.5.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + - @backstage/integration@1.2.0-next.1 + +## @backstage/plugin-github-deployments@0.1.36-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + - @backstage/integration@1.2.0-next.1 + - @backstage/integration-react@1.1.0-next.2 + +## @backstage/plugin-gocd@0.1.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-graphiql@0.2.37-next.1 + +### Patch Changes + +- e1f42a0e2c: Updated dependency `@types/codemirror` to `^5.0.0`. +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-graphql-backend@0.1.22-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-catalog-graphql@0.3.9-next.0 + +## @backstage/plugin-home@0.4.21-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + - @backstage/plugin-stack-overflow@0.1.1-next.2 + +## @backstage/plugin-ilert@0.1.31-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-jenkins@0.7.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + - @backstage/plugin-jenkins-common@0.1.4-next.0 + +## @backstage/plugin-jenkins-backend@0.1.22-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/plugin-auth-node@0.2.1-next.1 + - @backstage/plugin-permission-common@0.6.1-next.0 + - @backstage/catalog-client@1.0.2-next.0 + - @backstage/plugin-jenkins-common@0.1.4-next.0 + +## @backstage/plugin-jenkins-common@0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.6.1-next.0 + - @backstage/plugin-catalog-common@1.0.2-next.0 + +## @backstage/plugin-kafka@0.3.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-kafka-backend@0.2.25-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/catalog-model@1.0.2-next.0 + +## @backstage/plugin-kubernetes@0.6.5-next.2 + +### Patch Changes + +- 1ef98cfe48: add Azure Identity auth provider and AKS dashboard formatter +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-kubernetes-common@0.2.10-next.0 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-kubernetes-backend@0.5.1-next.1 + +### Patch Changes + +- 1ef98cfe48: add Azure Identity auth provider and AKS dashboard formatter +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/plugin-kubernetes-common@0.2.10-next.0 + - @backstage/config@1.0.1-next.0 + - @backstage/catalog-model@1.0.2-next.0 + +## @backstage/plugin-kubernetes-common@0.2.10-next.0 + +### Patch Changes + +- 1ef98cfe48: add Azure Identity auth provider and AKS dashboard formatter +- Updated dependencies + - @backstage/catalog-model@1.0.2-next.0 + +## @backstage/plugin-lighthouse@0.3.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-newrelic-dashboard@0.1.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-org@0.5.5-next.2 + +### Patch Changes + +- dfee1002d7: Fixed overflow bug of name and email on EntitiyMembersListCard component which can occur on specific 'screen width' + ’character length' combinations +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-pagerduty@0.3.32-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-periskop@0.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-periskop-backend@0.1.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + +## @backstage/plugin-permission-backend@0.5.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-auth-node@0.2.1-next.1 + - @backstage/plugin-permission-common@0.6.1-next.0 + - @backstage/plugin-permission-node@0.6.1-next.1 + +## @backstage/plugin-permission-common@0.6.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.1-next.0 + +## @backstage/plugin-permission-node@0.6.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-auth-node@0.2.1-next.1 + - @backstage/plugin-permission-common@0.6.1-next.0 + +## @backstage/plugin-permission-react@0.4.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.1-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + - @backstage/plugin-permission-common@0.6.1-next.0 + +## @backstage/plugin-proxy-backend@0.2.26-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + +## @backstage/plugin-rollbar@0.4.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-rollbar-backend@0.1.29-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + +## @backstage/plugin-scaffolder@1.2.0-next.2 + +### Patch Changes + +- 70817dafc0: Updated dependency `use-immer` to `^0.7.0`. +- 1af133f779: Updated dependency `event-source-polyfill` to `1.0.26`. +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-scaffolder-common@1.1.0-next.0 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + - @backstage/integration@1.2.0-next.1 + - @backstage/integration-react@1.1.0-next.2 + - @backstage/plugin-permission-react@0.4.1-next.1 + - @backstage/catalog-client@1.0.2-next.0 + - @backstage/plugin-catalog-common@1.0.2-next.0 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/plugin-scaffolder-backend@1.2.0-next.1 + - @backstage/config@1.0.1-next.0 + - @backstage/integration@1.2.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.2.0-next.1 + - @backstage/config@1.0.1-next.0 + +## @backstage/plugin-search@0.8.1-next.2 + +### Patch Changes + +- 3a74e203a8: Updated search result components to support rendering content with highlighted matched terms +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-search-react@0.2.0-next.2 + - @backstage/plugin-search-common@0.3.4-next.0 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-search-backend@0.5.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-search-backend-node@0.6.1-next.1 + - @backstage/plugin-search-common@0.3.4-next.0 + - @backstage/plugin-auth-node@0.2.1-next.1 + - @backstage/plugin-permission-common@0.6.1-next.0 + - @backstage/plugin-permission-node@0.6.1-next.1 + +## @backstage/plugin-search-backend-module-elasticsearch@0.1.4-next.1 + +### Patch Changes + +- 71d3432710: Search Engines will now index documents in batches of 1000 instead of 100 (under the hood). This may result in your Backstage backend consuming slightly more memory during index runs, but should dramatically improve indexing performance for large document sets. +- 3a74e203a8: Support generating highlighted matched terms in search result data +- Updated dependencies + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-search-backend-node@0.6.1-next.1 + - @backstage/plugin-search-common@0.3.4-next.0 + +## @backstage/plugin-search-backend-module-pg@0.3.3-next.1 + +### Patch Changes + +- 71d3432710: Search Engines will now index documents in batches of 1000 instead of 100 (under the hood). This may result in your Backstage backend consuming slightly more memory during index runs, but should dramatically improve indexing performance for large document sets. +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/plugin-search-backend-node@0.6.1-next.1 + - @backstage/plugin-search-common@0.3.4-next.0 + +## @backstage/plugin-search-backend-node@0.6.1-next.1 + +### Patch Changes + +- 71d3432710: Search Engines will now index documents in batches of 1000 instead of 100 (under the hood). This may result in your Backstage backend consuming slightly more memory during index runs, but should dramatically improve indexing performance for large document sets. +- 3a74e203a8: Support generating highlighted matched terms in search result data +- Updated dependencies + - @backstage/backend-tasks@0.3.1-next.1 + - @backstage/plugin-search-common@0.3.4-next.0 + +## @backstage/plugin-search-common@0.3.4-next.0 + +### Patch Changes + +- 3a74e203a8: Support generating highlighted matched terms in search result data +- Updated dependencies + - @backstage/plugin-permission-common@0.6.1-next.0 + +## @backstage/plugin-search-react@0.2.0-next.2 + +### Patch Changes + +- 3a74e203a8: Updated search result components to support rendering content with highlighted matched terms +- Updated dependencies + - @backstage/plugin-search-common@0.3.4-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-sentry@0.3.43-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-sonarqube@0.3.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-splunk-on-call@0.3.29-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-stack-overflow@0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-search-common@0.3.4-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + - @backstage/plugin-home@0.4.21-next.2 + +## @backstage/plugin-stack-overflow-backend@0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-search-common@0.3.4-next.0 + +## @backstage/plugin-tech-insights@0.2.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-tech-insights-backend@0.4.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/backend-tasks@0.3.1-next.1 + - @backstage/config@1.0.1-next.0 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/plugin-tech-insights-node@0.3.0-next.2 + - @backstage/catalog-client@1.0.2-next.0 + +## @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-tech-insights-node@0.3.0-next.2 + +## @backstage/plugin-tech-insights-node@0.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + +## @backstage/plugin-techdocs@1.1.1-next.2 + +### Patch Changes + +- 52419be116: Create a menu in the sub header of documentation pages, it is responsible for rendering TechDocs addons that allow users to customize their reading experience. +- 1af133f779: Updated dependency `event-source-polyfill` to `1.0.26`. +- 2dcb2c9678: Loading SVGs correctly with `bota` with extended characters +- 3a74e203a8: Updated search result components to support rendering content with highlighted matched terms +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-techdocs-react@0.1.1-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-search-react@0.2.0-next.2 + - @backstage/plugin-search-common@0.3.4-next.0 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + - @backstage/integration@1.2.0-next.1 + - @backstage/integration-react@1.1.0-next.2 + +## @backstage/plugin-techdocs-addons-test-utils@0.1.0-next.1 + +### Patch Changes + +- f84e0e2818: Fixed a bug preventing testing of TechDocs Addons whose dom contained `` tags. +- 7c398c6473: The `TechDocsAddonTester` class may now be extended if custom test configuration is needed. +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-techdocs@1.1.1-next.2 + - @backstage/plugin-techdocs-react@0.1.1-next.2 + - @backstage/plugin-catalog@1.2.0-next.2 + - @backstage/plugin-search-react@0.2.0-next.2 + - @backstage/core-app-api@1.0.2-next.1 + - @backstage/core-plugin-api@1.0.2-next.1 + - @backstage/integration-react@1.1.0-next.2 + - @backstage/test-utils@1.1.0-next.2 + +## @backstage/plugin-techdocs-backend@1.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-search-common@0.3.4-next.0 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/integration@1.2.0-next.1 + - @backstage/plugin-permission-common@0.6.1-next.0 + - @backstage/plugin-techdocs-node@1.1.1-next.1 + - @backstage/catalog-client@1.0.2-next.0 + - @backstage/plugin-catalog-common@1.0.2-next.0 + +## @backstage/plugin-techdocs-module-addons-contrib@0.1.0-next.2 + +### Patch Changes + +- 52419be116: Create a TechDocs `` addon that allows users to set a font size in the browser's local storage for the text of documentation pages. + + Here's an example on how to use it in a Backstage app: + + ```diff + import { + DefaultTechDocsHome, + TechDocsIndexPage, + TechDocsReaderPage, + } from '@backstage/plugin-techdocs'; + import { TechDocsAddons } from '@backstage/plugin-techdocs-react/alpha'; + +import { TextSize } from '@backstage/plugin-techdocs-module-addons-contrib'; + + const AppRoutes = () => { + + // other plugin routes + }> + + + } + > + + + + + + ; + }; + ``` + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-techdocs-react@0.1.1-next.2 + - @backstage/core-plugin-api@1.0.2-next.1 + - @backstage/integration@1.2.0-next.1 + - @backstage/integration-react@1.1.0-next.2 + +## @backstage/plugin-techdocs-node@1.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-search-common@0.3.4-next.0 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/integration@1.2.0-next.1 + +## @backstage/plugin-techdocs-react@0.1.1-next.2 + +### Patch Changes + +- 52419be116: Create a new addon location called "Settings", it is designed for addons that allow users to customize the reading experience in documentation pages. + + Usage example: + + ```tsx + const TextSize = techdocsModuleAddonsContribPlugin.provide( + createTechDocsAddonExtension({ + name: 'TextSize', + location: TechDocsAddonLocations.Settings, + component: TextSizeAddon, + }), + ); + ``` + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-todo@0.2.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## @backstage/plugin-todo-backend@0.1.29-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/integration@1.2.0-next.1 + - @backstage/catalog-client@1.0.2-next.0 + +## example-app@0.2.71-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-kubernetes@0.6.5-next.2 + - @backstage/plugin-org@0.5.5-next.2 + - @backstage/plugin-techdocs@1.1.1-next.2 + - @backstage/plugin-techdocs-react@0.1.1-next.2 + - @backstage/plugin-scaffolder@1.2.0-next.2 + - @backstage/plugin-graphiql@0.2.37-next.1 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-catalog@1.2.0-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@0.1.0-next.2 + - @backstage/cli@0.17.1-next.2 + - @backstage/plugin-search@0.8.1-next.2 + - @backstage/plugin-search-react@0.2.0-next.2 + - @backstage/plugin-search-common@0.3.4-next.0 + - @backstage/plugin-azure-devops@0.1.21-next.2 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-app-api@1.0.2-next.1 + - @backstage/core-plugin-api@1.0.2-next.1 + - @backstage/integration-react@1.1.0-next.2 + - @backstage/plugin-catalog-import@0.8.8-next.2 + - @backstage/plugin-code-coverage@0.1.32-next.2 + - @backstage/plugin-cost-insights@0.11.27-next.1 + - @backstage/plugin-home@0.4.21-next.2 + - @backstage/plugin-lighthouse@0.3.5-next.2 + - @backstage/plugin-permission-react@0.4.1-next.1 + - @backstage/plugin-stack-overflow@0.1.1-next.2 + - @backstage/plugin-airbrake@0.3.5-next.2 + - @backstage/plugin-api-docs@0.8.5-next.2 + - @backstage/plugin-badges@0.2.29-next.2 + - @backstage/plugin-catalog-graph@0.2.17-next.2 + - @backstage/plugin-circleci@0.3.5-next.2 + - @backstage/plugin-cloudbuild@0.3.5-next.2 + - @backstage/plugin-explore@0.3.36-next.2 + - @backstage/plugin-github-actions@0.5.5-next.2 + - @backstage/plugin-gocd@0.1.11-next.2 + - @backstage/plugin-jenkins@0.7.4-next.2 + - @backstage/plugin-kafka@0.3.5-next.2 + - @backstage/plugin-newrelic-dashboard@0.1.13-next.2 + - @backstage/plugin-pagerduty@0.3.32-next.2 + - @backstage/plugin-rollbar@0.4.5-next.2 + - @backstage/plugin-sentry@0.3.43-next.2 + - @backstage/plugin-tech-insights@0.2.1-next.2 + - @backstage/plugin-todo@0.2.7-next.2 + - @backstage/plugin-catalog-common@1.0.2-next.0 + +## example-backend@0.2.71-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/plugin-kubernetes-backend@0.5.1-next.1 + - @backstage/plugin-catalog-backend@1.1.2-next.2 + - @backstage/backend-tasks@0.3.1-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.0-next.1 + - @backstage/plugin-scaffolder-backend@1.2.0-next.1 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-search-backend-node@0.6.1-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@0.1.4-next.1 + - @backstage/plugin-search-backend-module-pg@0.3.3-next.1 + - @backstage/plugin-azure-devops-backend@0.3.11-next.1 + - example-app@0.2.71-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/integration@1.2.0-next.1 + - @backstage/plugin-app-backend@0.3.32-next.1 + - @backstage/plugin-auth-backend@0.13.1-next.2 + - @backstage/plugin-auth-node@0.2.1-next.1 + - @backstage/plugin-badges-backend@0.1.26-next.1 + - @backstage/plugin-code-coverage-backend@0.1.30-next.1 + - @backstage/plugin-graphql-backend@0.1.22-next.1 + - @backstage/plugin-jenkins-backend@0.1.22-next.1 + - @backstage/plugin-kafka-backend@0.2.25-next.1 + - @backstage/plugin-permission-backend@0.5.7-next.1 + - @backstage/plugin-permission-common@0.6.1-next.0 + - @backstage/plugin-permission-node@0.6.1-next.1 + - @backstage/plugin-proxy-backend@0.2.26-next.1 + - @backstage/plugin-rollbar-backend@0.1.29-next.2 + - @backstage/plugin-search-backend@0.5.2-next.1 + - @backstage/plugin-tech-insights-backend@0.4.0-next.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.16-next.2 + - @backstage/plugin-tech-insights-node@0.3.0-next.2 + - @backstage/plugin-techdocs-backend@1.1.1-next.1 + - @backstage/plugin-todo-backend@0.1.29-next.1 + - @backstage/catalog-client@1.0.2-next.0 + +## techdocs-cli-embedded-app@0.2.70-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-techdocs@1.1.1-next.2 + - @backstage/plugin-techdocs-react@0.1.1-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-catalog@1.2.0-next.2 + - @backstage/cli@0.17.1-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-app-api@1.0.2-next.1 + - @backstage/core-plugin-api@1.0.2-next.1 + - @backstage/integration-react@1.1.0-next.2 + - @backstage/test-utils@1.1.0-next.2 + +## @internal/plugin-todo-list-backend@1.0.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-auth-node@0.2.1-next.1 + +## @internal/plugin-todo-list-common@1.0.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.6.1-next.0 diff --git a/docs/releases/v1.2.0-next.3-changelog.md b/docs/releases/v1.2.0-next.3-changelog.md new file mode 100644 index 0000000000..4efce476d4 --- /dev/null +++ b/docs/releases/v1.2.0-next.3-changelog.md @@ -0,0 +1,73 @@ +# Release v1.2.0-next.3 + +## @backstage/core-components@0.9.4-next.2 + +### Patch Changes + +- 52c02ac02b: Don't set the background color on an Avatar component that has a picture. +- 3603014e0e: Add ARIA landmark(
), & label and a heading to OAuthRequestDialog. Removed nested interactive control (button). +- 2025d7c123: Properly highlight `SidebarSubmenuItem` dropdown items on hover, use ellipsis styling on long labels in `SidebarSubmenu`, allow `icon` and `to` properties to be optional on `SidebarSubmenuItem`, and fix `SidebarPage` padding to be responsive to pinned state + +## @backstage/plugin-home@0.4.21-next.3 + +### Patch Changes + +- 69093c5f91: Display entity titles in `StarredEntities` home page card (if defined) and don't show entities which no longer exist +- Updated dependencies + - @backstage/core-components@0.9.4-next.2 + +## @backstage/plugin-kubernetes@0.6.5-next.3 + +### Patch Changes + +- 447e060872: Add support for 'oidc' as authProvider for kubernetes authentication + and adds optional 'oidcTokenProvider' config value. This will allow + users to authenticate to kubernetes cluster using id tokens obtained + from the configured auth provider in their backstage instance. +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.2.10-next.1 + - @backstage/core-components@0.9.4-next.2 + +## @backstage/plugin-kubernetes-backend@0.5.1-next.2 + +### Patch Changes + +- 447e060872: Add support for 'oidc' as authProvider for kubernetes authentication + and adds optional 'oidcTokenProvider' config value. This will allow + users to authenticate to kubernetes cluster using id tokens obtained + from the configured auth provider in their backstage instance. +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.2.10-next.1 + +## @backstage/plugin-kubernetes-common@0.2.10-next.1 + +### Patch Changes + +- 447e060872: Add support for 'oidc' as authProvider for kubernetes authentication + and adds optional 'oidcTokenProvider' config value. This will allow + users to authenticate to kubernetes cluster using id tokens obtained + from the configured auth provider in their backstage instance. + +## @backstage/plugin-org@0.5.5-next.3 + +### Patch Changes + +- 2025d7c123: Include namespace in `MyGroupSidebarItem` if not default and remove root item routing if there are multiple groups +- Updated dependencies + - @backstage/core-components@0.9.4-next.2 + +## @backstage/plugin-scaffolder@1.2.0-next.3 + +### Patch Changes + +- cc8ddd0979: revert dependency `event-source-polyfill` to `1.0.25` +- Updated dependencies + - @backstage/core-components@0.9.4-next.2 + +## @backstage/plugin-techdocs@1.1.1-next.3 + +### Patch Changes + +- cc8ddd0979: revert dependency `event-source-polyfill` to `1.0.25` +- Updated dependencies + - @backstage/core-components@0.9.4-next.2 diff --git a/package.json b/package.json index b586e0b8ba..c215ef69a4 100644 --- a/package.json +++ b/package.json @@ -45,11 +45,11 @@ ] }, "resolutions": { - "**/@graphql-codegen/cli/**/ws": "^7.4.6", + "**/@graphql-codegen/cli/**/ws": "^8.0.0", "@types/react": "^17", "@types/react-dom": "^17" }, - "version": "1.2.0-next.1", + "version": "1.2.0-next.3", "dependencies": { "@manypkg/get-packages": "^1.1.3", "@microsoft/api-documenter": "^7.17.11", @@ -68,7 +68,7 @@ "concurrently": "^7.0.0", "eslint-plugin-notice": "^0.9.10", "fs-extra": "10.1.0", - "husky": "^7.0.4", + "husky": "^8.0.0", "lerna": "^4.0.0", "lint-staged": "^12.2.0", "minimist": "^1.2.5", diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index 8ea789e99a..7f29042ceb 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,56 @@ # example-app +## 0.2.71-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-kubernetes@0.6.5-next.2 + - @backstage/plugin-org@0.5.5-next.2 + - @backstage/plugin-techdocs@1.1.1-next.2 + - @backstage/plugin-techdocs-react@0.1.1-next.2 + - @backstage/plugin-scaffolder@1.2.0-next.2 + - @backstage/plugin-graphiql@0.2.37-next.1 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-catalog@1.2.0-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@0.1.0-next.2 + - @backstage/cli@0.17.1-next.2 + - @backstage/plugin-search@0.8.1-next.2 + - @backstage/plugin-search-react@0.2.0-next.2 + - @backstage/plugin-search-common@0.3.4-next.0 + - @backstage/plugin-azure-devops@0.1.21-next.2 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-app-api@1.0.2-next.1 + - @backstage/core-plugin-api@1.0.2-next.1 + - @backstage/integration-react@1.1.0-next.2 + - @backstage/plugin-catalog-import@0.8.8-next.2 + - @backstage/plugin-code-coverage@0.1.32-next.2 + - @backstage/plugin-cost-insights@0.11.27-next.1 + - @backstage/plugin-home@0.4.21-next.2 + - @backstage/plugin-lighthouse@0.3.5-next.2 + - @backstage/plugin-permission-react@0.4.1-next.1 + - @backstage/plugin-stack-overflow@0.1.1-next.2 + - @backstage/plugin-airbrake@0.3.5-next.2 + - @backstage/plugin-api-docs@0.8.5-next.2 + - @backstage/plugin-badges@0.2.29-next.2 + - @backstage/plugin-catalog-graph@0.2.17-next.2 + - @backstage/plugin-circleci@0.3.5-next.2 + - @backstage/plugin-cloudbuild@0.3.5-next.2 + - @backstage/plugin-explore@0.3.36-next.2 + - @backstage/plugin-github-actions@0.5.5-next.2 + - @backstage/plugin-gocd@0.1.11-next.2 + - @backstage/plugin-jenkins@0.7.4-next.2 + - @backstage/plugin-kafka@0.3.5-next.2 + - @backstage/plugin-newrelic-dashboard@0.1.13-next.2 + - @backstage/plugin-pagerduty@0.3.32-next.2 + - @backstage/plugin-rollbar@0.4.5-next.2 + - @backstage/plugin-sentry@0.3.43-next.2 + - @backstage/plugin-tech-insights@0.2.1-next.2 + - @backstage/plugin-todo@0.2.7-next.2 + - @backstage/plugin-catalog-common@1.0.2-next.0 + ## 0.2.71-next.1 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index 4c219916d8..8f42ee2654 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "example-app", - "version": "0.2.71-next.1", + "version": "0.2.71-next.2", "private": true, "backstage": { "role": "frontend" @@ -8,58 +8,58 @@ "bundled": true, "dependencies": { "@backstage/app-defaults": "^1.0.2-next.0", - "@backstage/catalog-model": "^1.0.1", - "@backstage/cli": "^0.17.1-next.1", - "@backstage/config": "^1.0.0", - "@backstage/core-app-api": "^1.0.2-next.0", - "@backstage/core-components": "^0.9.4-next.0", - "@backstage/core-plugin-api": "^1.0.2-next.0", - "@backstage/integration-react": "^1.1.0-next.1", - "@backstage/plugin-airbrake": "^0.3.5-next.1", - "@backstage/plugin-api-docs": "^0.8.5-next.1", - "@backstage/plugin-azure-devops": "^0.1.21-next.1", + "@backstage/catalog-model": "^1.0.2-next.0", + "@backstage/cli": "^0.17.1-next.2", + "@backstage/config": "^1.0.1-next.0", + "@backstage/core-app-api": "^1.0.2-next.1", + "@backstage/core-components": "^0.9.4-next.1", + "@backstage/core-plugin-api": "^1.0.2-next.1", + "@backstage/integration-react": "^1.1.0-next.2", + "@backstage/plugin-airbrake": "^0.3.5-next.2", + "@backstage/plugin-api-docs": "^0.8.5-next.2", + "@backstage/plugin-azure-devops": "^0.1.21-next.2", "@backstage/plugin-apache-airflow": "^0.1.13-next.0", - "@backstage/plugin-badges": "^0.2.29-next.1", - "@backstage/plugin-catalog": "^1.2.0-next.1", - "@backstage/plugin-catalog-common": "^1.0.1", - "@backstage/plugin-catalog-graph": "^0.2.17-next.1", - "@backstage/plugin-catalog-import": "^0.8.8-next.1", - "@backstage/plugin-catalog-react": "^1.1.0-next.1", - "@backstage/plugin-circleci": "^0.3.5-next.1", - "@backstage/plugin-cloudbuild": "^0.3.5-next.1", - "@backstage/plugin-code-coverage": "^0.1.32-next.1", - "@backstage/plugin-cost-insights": "^0.11.27-next.0", - "@backstage/plugin-explore": "^0.3.36-next.1", + "@backstage/plugin-badges": "^0.2.29-next.2", + "@backstage/plugin-catalog": "^1.2.0-next.2", + "@backstage/plugin-catalog-common": "^1.0.2-next.0", + "@backstage/plugin-catalog-graph": "^0.2.17-next.2", + "@backstage/plugin-catalog-import": "^0.8.8-next.2", + "@backstage/plugin-catalog-react": "^1.1.0-next.2", + "@backstage/plugin-circleci": "^0.3.5-next.2", + "@backstage/plugin-cloudbuild": "^0.3.5-next.2", + "@backstage/plugin-code-coverage": "^0.1.32-next.2", + "@backstage/plugin-cost-insights": "^0.11.27-next.1", + "@backstage/plugin-explore": "^0.3.36-next.2", "@backstage/plugin-gcalendar": "^0.3.1-next.1", "@backstage/plugin-gcp-projects": "^0.3.24-next.0", - "@backstage/plugin-github-actions": "^0.5.5-next.1", - "@backstage/plugin-gocd": "^0.1.11-next.1", - "@backstage/plugin-graphiql": "^0.2.37-next.0", - "@backstage/plugin-home": "^0.4.21-next.1", - "@backstage/plugin-jenkins": "^0.7.4-next.1", - "@backstage/plugin-kafka": "^0.3.5-next.1", - "@backstage/plugin-kubernetes": "^0.6.5-next.1", - "@backstage/plugin-lighthouse": "^0.3.5-next.1", + "@backstage/plugin-github-actions": "^0.5.5-next.2", + "@backstage/plugin-gocd": "^0.1.11-next.2", + "@backstage/plugin-graphiql": "^0.2.37-next.1", + "@backstage/plugin-home": "^0.4.21-next.2", + "@backstage/plugin-jenkins": "^0.7.4-next.2", + "@backstage/plugin-kafka": "^0.3.5-next.2", + "@backstage/plugin-kubernetes": "^0.6.5-next.2", + "@backstage/plugin-lighthouse": "^0.3.5-next.2", "@backstage/plugin-newrelic": "^0.3.23-next.0", - "@backstage/plugin-newrelic-dashboard": "^0.1.13-next.1", - "@backstage/plugin-org": "^0.5.5-next.1", - "@backstage/plugin-pagerduty": "0.3.32-next.1", - "@backstage/plugin-permission-react": "^0.4.1-next.0", - "@backstage/plugin-rollbar": "^0.4.5-next.1", - "@backstage/plugin-scaffolder": "^1.2.0-next.1", - "@backstage/plugin-search": "^0.8.1-next.1", - "@backstage/plugin-search-react": "^0.2.0-next.1", - "@backstage/plugin-search-common": "^0.3.3", - "@backstage/plugin-sentry": "^0.3.43-next.1", + "@backstage/plugin-newrelic-dashboard": "^0.1.13-next.2", + "@backstage/plugin-org": "^0.5.5-next.2", + "@backstage/plugin-pagerduty": "0.3.32-next.2", + "@backstage/plugin-permission-react": "^0.4.1-next.1", + "@backstage/plugin-rollbar": "^0.4.5-next.2", + "@backstage/plugin-scaffolder": "^1.2.0-next.2", + "@backstage/plugin-search": "^0.8.1-next.2", + "@backstage/plugin-search-react": "^0.2.0-next.2", + "@backstage/plugin-search-common": "^0.3.4-next.0", + "@backstage/plugin-sentry": "^0.3.43-next.2", "@backstage/plugin-shortcuts": "^0.2.6-next.0", - "@backstage/plugin-stack-overflow": "^0.1.1-next.1", + "@backstage/plugin-stack-overflow": "^0.1.1-next.2", "@backstage/plugin-tech-radar": "^0.5.12-next.0", - "@backstage/plugin-techdocs": "^1.1.1-next.1", - "@backstage/plugin-techdocs-react": "^0.1.1-next.1", - "@backstage/plugin-techdocs-module-addons-contrib": "^0.1.0-next.1", - "@backstage/plugin-todo": "^0.2.7-next.1", + "@backstage/plugin-techdocs": "^1.1.1-next.2", + "@backstage/plugin-techdocs-react": "^0.1.1-next.2", + "@backstage/plugin-techdocs-module-addons-contrib": "^0.1.0-next.2", + "@backstage/plugin-todo": "^0.2.7-next.2", "@backstage/plugin-user-settings": "^0.4.4-next.0", - "@backstage/plugin-tech-insights": "^0.2.1-next.1", + "@backstage/plugin-tech-insights": "^0.2.1-next.2", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -80,7 +80,7 @@ "zen-observable": "^0.8.15" }, "devDependencies": { - "@backstage/test-utils": "^1.1.0-next.1", + "@backstage/test-utils": "^1.1.0-next.2", "@rjsf/core": "^3.2.1", "@testing-library/cypress": "^8.0.2", "@testing-library/jest-dom": "^5.10.1", diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index 4cf2c02e55..089900fb77 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -70,7 +70,10 @@ import { techdocsPlugin, } from '@backstage/plugin-techdocs'; import { TechDocsAddons } from '@backstage/plugin-techdocs-react'; -import { ReportIssue } from '@backstage/plugin-techdocs-module-addons-contrib'; +import { + ReportIssue, + TextSize, +} from '@backstage/plugin-techdocs-module-addons-contrib'; import { UserSettingsPage, UserSettingsTab, @@ -183,6 +186,7 @@ const routes = ( {techDocsPage} + + + + + {pullRequestsContent} diff --git a/packages/app/src/components/search/SearchModal.tsx b/packages/app/src/components/search/SearchModal.tsx index f75017a4dd..3fdacf08b6 100644 --- a/packages/app/src/components/search/SearchModal.tsx +++ b/packages/app/src/components/search/SearchModal.tsx @@ -180,7 +180,7 @@ export const SearchModal = ({ toggleModal }: { toggleModal: () => void }) => { {({ results }) => ( - {results.map(({ type, document }) => { + {results.map(({ type, document, highlight }) => { let resultItem; switch (type) { case 'software-catalog': @@ -188,6 +188,7 @@ export const SearchModal = ({ toggleModal }: { toggleModal: () => void }) => { ); break; @@ -196,6 +197,7 @@ export const SearchModal = ({ toggleModal }: { toggleModal: () => void }) => { ); break; @@ -204,6 +206,7 @@ export const SearchModal = ({ toggleModal }: { toggleModal: () => void }) => { ); } diff --git a/packages/app/src/components/search/SearchPage.tsx b/packages/app/src/components/search/SearchPage.tsx index fd9c80686c..d1b56bbaf0 100644 --- a/packages/app/src/components/search/SearchPage.tsx +++ b/packages/app/src/components/search/SearchPage.tsx @@ -132,13 +132,14 @@ const SearchPage = () => { {({ results }) => ( - {results.map(({ type, document }) => { + {results.map(({ type, document, highlight }) => { switch (type) { case 'software-catalog': return ( ); case 'techdocs': @@ -146,6 +147,7 @@ const SearchPage = () => { ); default: @@ -153,6 +155,7 @@ const SearchPage = () => { ); } diff --git a/packages/backend-common/CHANGELOG.md b/packages/backend-common/CHANGELOG.md index b67b7a3ce8..a00e094578 100644 --- a/packages/backend-common/CHANGELOG.md +++ b/packages/backend-common/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/backend-common +## 0.13.3-next.2 + +### Patch Changes + +- e0a6360b80: Added a `stream()` method to complement the `buffer()` method on `ReadUrlResponse`. A `ReadUrlResponseFactory` utility class is now also available, providing a simple, consistent way to provide a valid `ReadUrlResponse`. + + This method, though optional for now, will be required on the responses of `UrlReader.readUrl()` implementations in a future release. + +- 4b811aafce: Implemented the `UrlReader.search()` method for Google Cloud Storage. Due to limitations in the underlying storage API, only prefix-based searches are supported right now (for example, `https://storage.cloud.google.com/your-bucket/some-path/*`). +- Updated dependencies + - @backstage/cli-common@0.1.9-next.0 + - @backstage/config@1.0.1-next.0 + - @backstage/config-loader@1.1.1-next.1 + - @backstage/integration@1.2.0-next.1 + ## 0.13.3-next.1 ### Patch Changes diff --git a/packages/backend-common/api-report.md b/packages/backend-common/api-report.md index 961973b144..13c4ed62ce 100644 --- a/packages/backend-common/api-report.md +++ b/packages/backend-common/api-report.md @@ -547,6 +547,24 @@ export type ReadUrlOptions = { // @public export type ReadUrlResponse = { buffer(): Promise; + stream?(): Readable; + etag?: string; +}; + +// @public +export class ReadUrlResponseFactory { + static fromNodeJSReadable( + oldStyleStream: NodeJS.ReadableStream, + options?: ReadUrlResponseFactoryFromStreamOptions, + ): Promise; + static fromReadable( + stream: Readable, + options?: ReadUrlResponseFactoryFromStreamOptions, + ): Promise; +} + +// @public +export type ReadUrlResponseFactoryFromStreamOptions = { etag?: string; }; diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index a2913c7501..931ba4faec 100644 --- a/packages/backend-common/package.json +++ b/packages/backend-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-common", "description": "Common functionality library for Backstage backends", - "version": "0.13.3-next.1", + "version": "0.13.3-next.2", "main": "src/index.ts", "types": "src/index.ts", "private": false, @@ -34,11 +34,11 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/cli-common": "^0.1.8", - "@backstage/config": "^1.0.0", - "@backstage/config-loader": "^1.1.1-next.0", + "@backstage/cli-common": "^0.1.9-next.0", + "@backstage/config": "^1.0.1-next.0", + "@backstage/config-loader": "^1.1.1-next.1", "@backstage/errors": "^1.0.0", - "@backstage/integration": "^1.2.0-next.0", + "@backstage/integration": "^1.2.0-next.1", "@backstage/types": "^1.0.0", "@google-cloud/storage": "^5.8.0", "@manypkg/get-packages": "^1.1.3", @@ -50,6 +50,7 @@ "@types/webpack-env": "^1.15.2", "archiver": "^5.0.2", "aws-sdk": "^2.840.0", + "base64-stream": "^1.0.0", "compression": "^1.7.4", "concat-stream": "^2.0.0", "cors": "^2.8.5", @@ -90,9 +91,10 @@ } }, "devDependencies": { - "@backstage/backend-test-utils": "^0.1.24-next.0", - "@backstage/cli": "^0.17.1-next.1", + "@backstage/backend-test-utils": "^0.1.24-next.1", + "@backstage/cli": "^0.17.1-next.2", "@types/archiver": "^5.1.0", + "@types/base64-stream": "^1.0.2", "@types/compression": "^1.7.0", "@types/concat-stream": "^2.0.0", "@types/fs-extra": "^9.0.3", diff --git a/packages/backend-common/src/reading/AwsS3UrlReader.test.ts b/packages/backend-common/src/reading/AwsS3UrlReader.test.ts index 01fd27f45a..ea969b43a9 100644 --- a/packages/backend-common/src/reading/AwsS3UrlReader.test.ts +++ b/packages/backend-common/src/reading/AwsS3UrlReader.test.ts @@ -28,6 +28,7 @@ import AWSMock from 'aws-sdk-mock'; import aws from 'aws-sdk'; import path from 'path'; import { NotModifiedError } from '@backstage/errors'; +import getRawBody from 'raw-body'; const treeResponseFactory = DefaultReadTreeResponseFactory.create({ config: new ConfigReader({}), @@ -263,7 +264,7 @@ describe('AwsS3UrlReader', () => { describe('readUrl', () => { let awsS3UrlReader: AwsS3UrlReader; - beforeAll(() => { + beforeEach(() => { AWSMock.setSDKInstance(aws); AWSMock.mock( @@ -295,7 +296,7 @@ describe('AwsS3UrlReader', () => { ); }); - it('returns contents of an object in a bucket', async () => { + it('returns contents of an object in a bucket via buffer', async () => { const response = await awsS3UrlReader.readUrl( 'https://test-bucket.s3.us-east-2.amazonaws.com/awsS3-mock-object.yaml', ); @@ -303,6 +304,14 @@ describe('AwsS3UrlReader', () => { expect(buffer.toString().trim()).toBe('site_name: Test'); }); + it('returns contents of an object in a bucket via stream', async () => { + const response = await awsS3UrlReader.readUrl( + 'https://test-bucket.s3.us-east-2.amazonaws.com/awsS3-mock-object.yaml', + ); + const fromStream = await getRawBody(response.stream!()); + expect(fromStream.toString().trim()).toBe('site_name: Test'); + }); + it('rejects unknown targets', async () => { await expect( awsS3UrlReader.readUrl( diff --git a/packages/backend-common/src/reading/AwsS3UrlReader.ts b/packages/backend-common/src/reading/AwsS3UrlReader.ts index 4dd68bf32c..dbd2c66a62 100644 --- a/packages/backend-common/src/reading/AwsS3UrlReader.ts +++ b/packages/backend-common/src/reading/AwsS3UrlReader.ts @@ -26,7 +26,6 @@ import { SearchResponse, UrlReader, } from './types'; -import getRawBody from 'raw-body'; import { AwsS3Integration, ScmIntegrations, @@ -34,6 +33,7 @@ import { } from '@backstage/integration'; import { ForwardedError, NotModifiedError } from '@backstage/errors'; import { ListObjectsV2Output, ObjectList } from 'aws-sdk/clients/s3'; +import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; /** * Path style URLs: https://s3.(region).amazonaws.com/(bucket)/(key) @@ -214,13 +214,11 @@ export class AwsS3UrlReader implements UrlReader { const request = this.deps.s3.getObject(params); options?.signal?.addEventListener('abort', () => request.abort()); - const buffer = await getRawBody(request.createReadStream()); const etag = (await request.promise()).ETag; - return { - buffer: async () => buffer, - etag: etag, - }; + return ReadUrlResponseFactory.fromReadable(request.createReadStream(), { + etag, + }); } catch (e) { if (e.statusCode === 304) { throw new NotModifiedError(); diff --git a/packages/backend-common/src/reading/AzureUrlReader.ts b/packages/backend-common/src/reading/AzureUrlReader.ts index d6ceaec258..140496c181 100644 --- a/packages/backend-common/src/reading/AzureUrlReader.ts +++ b/packages/backend-common/src/reading/AzureUrlReader.ts @@ -37,6 +37,7 @@ import { ReadUrlOptions, ReadUrlResponse, } from './types'; +import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; /** * Implements a {@link UrlReader} for Azure repos. @@ -90,9 +91,7 @@ export class AzureUrlReader implements UrlReader { // for private repos when PAT is not valid, Azure API returns a http status code 203 with sign in page html if (response.ok && response.status !== 203) { - return { - buffer: async () => Buffer.from(await response.arrayBuffer()), - }; + return ReadUrlResponseFactory.fromNodeJSReadable(response.body); } const message = `${url} could not be read as ${builtUrl}, ${response.status} ${response.statusText}`; diff --git a/packages/backend-common/src/reading/BitbucketCloudUrlReader.test.ts b/packages/backend-common/src/reading/BitbucketCloudUrlReader.test.ts index 38841d75ad..12ace2755b 100644 --- a/packages/backend-common/src/reading/BitbucketCloudUrlReader.test.ts +++ b/packages/backend-common/src/reading/BitbucketCloudUrlReader.test.ts @@ -29,6 +29,7 @@ import path from 'path'; import { NotModifiedError } from '@backstage/errors'; import { BitbucketCloudUrlReader } from './BitbucketCloudUrlReader'; import { DefaultReadTreeResponseFactory } from './tree'; +import getRawBody from 'raw-body'; const treeResponseFactory = DefaultReadTreeResponseFactory.create({ config: new ConfigReader({}), @@ -65,7 +66,7 @@ describe('BitbucketCloudUrlReader', () => { setupRequestMockHandlers(worker); describe('readUrl', () => { - it('should be able to readUrl without ETag', async () => { + it('should be able to readUrl via buffer without ETag', async () => { worker.use( rest.get( 'https://api.bitbucket.org/2.0/repositories/backstage-verification/test-template/src/master/template.yaml', @@ -87,6 +88,28 @@ describe('BitbucketCloudUrlReader', () => { expect(buffer.toString()).toBe('foo'); }); + it('should be able to readUrl via stream without ETag', async () => { + worker.use( + rest.get( + 'https://api.bitbucket.org/2.0/repositories/backstage-verification/test-template/src/master/template.yaml', + (req, res, ctx) => { + expect(req.headers.get('If-None-Match')).toBeNull(); + return res( + ctx.status(200), + ctx.body('foo'), + ctx.set('ETag', 'etag-value'), + ); + }, + ), + ); + + const result = await reader.readUrl( + 'https://bitbucket.org/backstage-verification/test-template/src/master/template.yaml', + ); + const fromStream = await getRawBody(result.stream!()); + expect(fromStream.toString()).toBe('foo'); + }); + it('should be able to readUrl with matching ETag', async () => { worker.use( rest.get( diff --git a/packages/backend-common/src/reading/BitbucketCloudUrlReader.ts b/packages/backend-common/src/reading/BitbucketCloudUrlReader.ts index 6a9406e920..7bc4cd9c11 100644 --- a/packages/backend-common/src/reading/BitbucketCloudUrlReader.ts +++ b/packages/backend-common/src/reading/BitbucketCloudUrlReader.ts @@ -39,6 +39,7 @@ import { SearchResponse, UrlReader, } from './types'; +import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; /** * Implements a {@link UrlReader} for files from Bitbucket Cloud. @@ -112,10 +113,9 @@ export class BitbucketCloudUrlReader implements UrlReader { } if (response.ok) { - return { - buffer: async () => Buffer.from(await response.arrayBuffer()), + return ReadUrlResponseFactory.fromNodeJSReadable(response.body, { etag: response.headers.get('ETag') ?? undefined, - }; + }); } const message = `${url} could not be read as ${bitbucketUrl}, ${response.status} ${response.statusText}`; diff --git a/packages/backend-common/src/reading/BitbucketServerUrlReader.ts b/packages/backend-common/src/reading/BitbucketServerUrlReader.ts index 320b8f2719..b4e1e62327 100644 --- a/packages/backend-common/src/reading/BitbucketServerUrlReader.ts +++ b/packages/backend-common/src/reading/BitbucketServerUrlReader.ts @@ -38,6 +38,7 @@ import { SearchResponse, UrlReader, } from './types'; +import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; /** * Implements a {@link UrlReader} for files from Bitbucket Server APIs. @@ -103,10 +104,9 @@ export class BitbucketServerUrlReader implements UrlReader { } if (response.ok) { - return { - buffer: async () => Buffer.from(await response.arrayBuffer()), + return ReadUrlResponseFactory.fromNodeJSReadable(response.body, { etag: response.headers.get('ETag') ?? undefined, - }; + }); } const message = `${url} could not be read as ${bitbucketUrl}, ${response.status} ${response.statusText}`; diff --git a/packages/backend-common/src/reading/BitbucketUrlReader.test.ts b/packages/backend-common/src/reading/BitbucketUrlReader.test.ts index 3a2360debb..922480f8e7 100644 --- a/packages/backend-common/src/reading/BitbucketUrlReader.test.ts +++ b/packages/backend-common/src/reading/BitbucketUrlReader.test.ts @@ -30,6 +30,7 @@ import { NotModifiedError } from '@backstage/errors'; import { BitbucketUrlReader } from './BitbucketUrlReader'; import { DefaultReadTreeResponseFactory } from './tree'; import { getVoidLogger } from '../logging'; +import getRawBody from 'raw-body'; const logger = getVoidLogger(); @@ -113,7 +114,7 @@ describe('BitbucketUrlReader', () => { setupRequestMockHandlers(worker); describe('readUrl', () => { - it('should be able to readUrl without ETag', async () => { + it('should be able to readUrl via buffer without ETag', async () => { worker.use( rest.get( 'https://api.bitbucket.org/2.0/repositories/backstage-verification/test-template/src/master/template.yaml', @@ -135,6 +136,28 @@ describe('BitbucketUrlReader', () => { expect(buffer.toString()).toBe('foo'); }); + it('should be able to readUrl via stream without ETag', async () => { + worker.use( + rest.get( + 'https://api.bitbucket.org/2.0/repositories/backstage-verification/test-template/src/master/template.yaml', + (req, res, ctx) => { + expect(req.headers.get('If-None-Match')).toBeNull(); + return res( + ctx.status(200), + ctx.body('foo'), + ctx.set('ETag', 'etag-value'), + ); + }, + ), + ); + + const result = await bitbucketProcessor.readUrl( + 'https://bitbucket.org/backstage-verification/test-template/src/master/template.yaml', + ); + const fromStream = await getRawBody(result.stream!()); + expect(fromStream.toString()).toBe('foo'); + }); + it('should be able to readUrl with matching ETag', async () => { worker.use( rest.get( diff --git a/packages/backend-common/src/reading/BitbucketUrlReader.ts b/packages/backend-common/src/reading/BitbucketUrlReader.ts index 1687a66262..805697bf27 100644 --- a/packages/backend-common/src/reading/BitbucketUrlReader.ts +++ b/packages/backend-common/src/reading/BitbucketUrlReader.ts @@ -40,6 +40,7 @@ import { SearchResponse, UrlReader, } from './types'; +import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; /** * Implements a {@link UrlReader} for files from Bitbucket v1 and v2 APIs, such @@ -123,10 +124,9 @@ export class BitbucketUrlReader implements UrlReader { } if (response.ok) { - return { - buffer: async () => Buffer.from(await response.arrayBuffer()), + return ReadUrlResponseFactory.fromNodeJSReadable(response.body, { etag: response.headers.get('ETag') ?? undefined, - }; + }); } const message = `${url} could not be read as ${bitbucketUrl}, ${response.status} ${response.statusText}`; diff --git a/packages/backend-common/src/reading/FetchUrlReader.ts b/packages/backend-common/src/reading/FetchUrlReader.ts index cb873ebdf8..b83f08c22f 100644 --- a/packages/backend-common/src/reading/FetchUrlReader.ts +++ b/packages/backend-common/src/reading/FetchUrlReader.ts @@ -25,6 +25,7 @@ import { UrlReader, } from './types'; import path from 'path'; +import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; /** * A {@link UrlReader} that does a plain fetch of the URL. @@ -103,10 +104,9 @@ export class FetchUrlReader implements UrlReader { } if (response.ok) { - return { - buffer: async () => Buffer.from(await response.arrayBuffer()), + return ReadUrlResponseFactory.fromNodeJSReadable(response.body, { etag: response.headers.get('ETag') ?? undefined, - }; + }); } const message = `could not read ${url}, ${response.status} ${response.statusText}`; diff --git a/packages/backend-common/src/reading/GerritUrlReader.test.ts b/packages/backend-common/src/reading/GerritUrlReader.test.ts index fc27b3dd6a..4e0b97fc58 100644 --- a/packages/backend-common/src/reading/GerritUrlReader.test.ts +++ b/packages/backend-common/src/reading/GerritUrlReader.test.ts @@ -31,6 +31,7 @@ import { getVoidLogger } from '../logging'; import { UrlReaderPredicateTuple } from './types'; import { DefaultReadTreeResponseFactory } from './tree'; import { GerritUrlReader } from './GerritUrlReader'; +import getRawBody from 'raw-body'; const treeResponseFactory = DefaultReadTreeResponseFactory.create({ config: new ConfigReader({}), @@ -128,7 +129,7 @@ describe('GerritUrlReader', () => { describe('readUrl', () => { const responseBuffer = Buffer.from('Apache License'); - it('should be able to read file contents', async () => { + it('should be able to read file contents as buffer', async () => { worker.use( rest.get( 'https://gerrit.com/projects/web%2Fproject/branches/master/files/LICENSE/content', @@ -148,6 +149,26 @@ describe('GerritUrlReader', () => { expect(buffer.toString()).toBe(responseBuffer.toString()); }); + it('should be able to read file contents as stream', async () => { + worker.use( + rest.get( + 'https://gerrit.com/projects/web%2Fproject/branches/master/files/LICENSE/content', + (_, res, ctx) => { + return res( + ctx.status(200), + ctx.body(responseBuffer.toString('base64')), + ); + }, + ), + ); + + const result = await gerritProcessor.readUrl( + 'https://gerrit.com/web/project/+/refs/heads/master/LICENSE', + ); + const fromStream = await getRawBody(result.stream!()); + expect(fromStream.toString()).toBe(responseBuffer.toString()); + }); + it('should raise NotFoundError on 404.', async () => { worker.use( rest.get( diff --git a/packages/backend-common/src/reading/GerritUrlReader.ts b/packages/backend-common/src/reading/GerritUrlReader.ts index f3e8924192..59b33bb2cb 100644 --- a/packages/backend-common/src/reading/GerritUrlReader.ts +++ b/packages/backend-common/src/reading/GerritUrlReader.ts @@ -25,6 +25,7 @@ import { parseGerritJsonResponse, parseGerritGitilesUrl, } from '@backstage/integration'; +import { Base64Decode } from 'base64-stream'; import concatStream from 'concat-stream'; import fs from 'fs-extra'; import fetch, { Response } from 'node-fetch'; @@ -125,9 +126,18 @@ export class GerritUrlReader implements UrlReader { throw new Error(`Unable to read gerrit file ${url}, ${e}`); } if (response.ok) { - const responseBody = await response.text(); + let responseBody: string; return { - buffer: async () => Buffer.from(responseBody, 'base64'), + buffer: async () => { + if (responseBody === undefined) { + responseBody = await response.text(); + } + return Buffer.from(responseBody, 'base64'); + }, + stream: () => { + const readable = new Readable().wrap(response.body); + return readable.pipe(new Base64Decode()); + }, }; } if (response.status === 404) { diff --git a/packages/backend-common/src/reading/GithubUrlReader.ts b/packages/backend-common/src/reading/GithubUrlReader.ts index d86f491827..3806253a6f 100644 --- a/packages/backend-common/src/reading/GithubUrlReader.ts +++ b/packages/backend-common/src/reading/GithubUrlReader.ts @@ -39,6 +39,7 @@ import { ReadUrlOptions, ReadUrlResponse, } from './types'; +import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; export type GhRepoResponse = RestEndpointMethodTypes['repos']['get']['response']['data']; @@ -127,10 +128,9 @@ export class GithubUrlReader implements UrlReader { } if (response.ok) { - return { - buffer: async () => Buffer.from(await response.arrayBuffer()), + return ReadUrlResponseFactory.fromNodeJSReadable(response.body, { etag: response.headers.get('ETag') ?? undefined, - }; + }); } let message = `${url} could not be read as ${ghUrl}, ${response.status} ${response.statusText}`; diff --git a/packages/backend-common/src/reading/GitlabUrlReader.ts b/packages/backend-common/src/reading/GitlabUrlReader.ts index d0e43fea59..2387dadf5b 100644 --- a/packages/backend-common/src/reading/GitlabUrlReader.ts +++ b/packages/backend-common/src/reading/GitlabUrlReader.ts @@ -38,6 +38,7 @@ import { ReadUrlOptions, } from './types'; import { trimEnd } from 'lodash'; +import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; /** * Implements a {@link UrlReader} for files on GitLab. @@ -97,10 +98,9 @@ export class GitlabUrlReader implements UrlReader { } if (response.ok) { - return { - buffer: async () => Buffer.from(await response.arrayBuffer()), + return ReadUrlResponseFactory.fromNodeJSReadable(response.body, { etag: response.headers.get('ETag') ?? undefined, - }; + }); } const message = `${url} could not be read as ${builtUrl}, ${response.status} ${response.statusText}`; diff --git a/packages/backend-common/src/reading/GoogleGcsUrlReader.ts b/packages/backend-common/src/reading/GoogleGcsUrlReader.ts index 167e20ca2b..56b15a60e7 100644 --- a/packages/backend-common/src/reading/GoogleGcsUrlReader.ts +++ b/packages/backend-common/src/reading/GoogleGcsUrlReader.ts @@ -28,6 +28,8 @@ import { GoogleGcsIntegrationConfig, readGoogleGcsIntegrationConfig, } from '@backstage/integration'; +import { Readable } from 'stream'; +import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; const GOOGLE_GCS_HOST = 'storage.cloud.google.com'; @@ -85,13 +87,14 @@ export class GoogleGcsUrlReader implements UrlReader { private readonly storage: Storage, ) {} + private readStreamFromUrl(url: string): Readable { + const { bucket, key } = parseURL(url); + return this.storage.bucket(bucket).file(key).createReadStream(); + } + async read(url: string): Promise { try { - const { bucket, key } = parseURL(url); - - return await getRawBody( - this.storage.bucket(bucket).file(key).createReadStream(), - ); + return await getRawBody(this.readStreamFromUrl(url)); } catch (error) { throw new Error(`unable to read gcs file from ${url}, ${error}`); } @@ -102,8 +105,8 @@ export class GoogleGcsUrlReader implements UrlReader { _options?: ReadUrlOptions, ): Promise { // TODO etag is not implemented yet. - const buffer = await this.read(url); - return { buffer: async () => buffer }; + const stream = this.readStreamFromUrl(url); + return ReadUrlResponseFactory.fromReadable(stream); } async readTree(): Promise { diff --git a/packages/backend-common/src/reading/ReadUrlResponseFactory.test.ts b/packages/backend-common/src/reading/ReadUrlResponseFactory.test.ts new file mode 100644 index 0000000000..c8a659e792 --- /dev/null +++ b/packages/backend-common/src/reading/ReadUrlResponseFactory.test.ts @@ -0,0 +1,125 @@ +/* + * 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 { ConflictError } from '@backstage/errors'; +import getRawBody from 'raw-body'; +import { Readable, Stream } from 'stream'; +import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; + +describe('ReadUrlResponseFactory', () => { + describe("fromReadable's", () => { + const expectedText = 'expected text'; + let readable: Readable; + + beforeEach(() => { + readable = Readable.from(expectedText, { + objectMode: false, + }); + }); + + it('etag is passed through', async () => { + const expectedEtag = 'xyz'; + const response = await ReadUrlResponseFactory.fromReadable(readable, { + etag: expectedEtag, + }); + expect(response.etag).toEqual(expectedEtag); + }); + + it('buffer returns expected data', async () => { + const response = await ReadUrlResponseFactory.fromReadable(readable); + const buffer = await response.buffer(); + expect(buffer.toString()).toEqual(expectedText); + }); + + it('buffer can be called multiple times', async () => { + const response = await ReadUrlResponseFactory.fromReadable(readable); + const buffer1 = await response.buffer(); + const buffer2 = await response.buffer(); + expect(buffer1.toString()).toEqual(expectedText); + expect(buffer2.toString()).toEqual(expectedText); + }); + + it('buffer cannot be called after stream is called', async () => { + const response = await ReadUrlResponseFactory.fromReadable(readable); + response.stream!(); + expect(() => response.buffer()).toThrowError(ConflictError); + }); + + it('stream returns expected data', async () => { + const response = await ReadUrlResponseFactory.fromReadable(readable); + const stream = response.stream!(); + const bufferFromStream = await getRawBody(stream); + expect(bufferFromStream.toString()).toEqual(expectedText); + }); + + it('stream cannot be called after buffer is called', async () => { + const response = await ReadUrlResponseFactory.fromReadable(readable); + response.buffer(); + expect(() => response.stream!()).toThrowError(ConflictError); + }); + }); + + describe("fromNodeJSReadable's", () => { + const expectedText = 'expected text'; + const timeouts: NodeJS.Timeout[] = []; + let readable: NodeJS.ReadableStream; + + beforeEach(() => { + // @ts-ignore + readable = new Stream({ encoding: 'utf-8' }); + readable.readable = true; + + // Write data asynchronously, as soon as possible. + timeouts[0] = setTimeout(() => { + timeouts[1] = setTimeout(readable.emit.bind(readable, 'end'), 0); + readable.emit('data', expectedText); + }, 0); + }); + + afterEach(() => { + // Clear out timeouts so we don't emit data across tests. + timeouts.forEach(clearTimeout); + }); + + it('etag is passed through', async () => { + const expectedEtag = 'xyz'; + const response = await ReadUrlResponseFactory.fromNodeJSReadable( + readable, + { + etag: expectedEtag, + }, + ); + expect(response.etag).toEqual(expectedEtag); + }); + + it('buffer returns expected data', async () => { + const response = await ReadUrlResponseFactory.fromNodeJSReadable( + readable, + ); + const buffer = await response.buffer(); + expect(buffer.toString()).toEqual(expectedText); + }); + + it('stream returns expected data', async () => { + const response = await ReadUrlResponseFactory.fromNodeJSReadable( + readable, + ); + const stream = response.stream!(); + const bufferFromStream = await getRawBody(stream); + expect(bufferFromStream.toString()).toEqual(expectedText); + }); + }); +}); diff --git a/packages/backend-common/src/reading/ReadUrlResponseFactory.ts b/packages/backend-common/src/reading/ReadUrlResponseFactory.ts new file mode 100644 index 0000000000..91d1939c24 --- /dev/null +++ b/packages/backend-common/src/reading/ReadUrlResponseFactory.ts @@ -0,0 +1,77 @@ +/* + * 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 { ConflictError } from '@backstage/errors'; +import getRawBody from 'raw-body'; +import { Readable } from 'stream'; +import { + ReadUrlResponse, + ReadUrlResponseFactoryFromStreamOptions, +} from './types'; + +/** + * Utility class for UrlReader implementations to create valid ReadUrlResponse + * instances from common response primitives. + * + * @public + */ +export class ReadUrlResponseFactory { + /** + * Resolves a ReadUrlResponse from a Readable stream. + */ + static async fromReadable( + stream: Readable, + options?: ReadUrlResponseFactoryFromStreamOptions, + ): Promise { + // Reference to eventual buffer enables callers to call buffer() multiple + // times without consequence. + let buffer: Promise; + + // Prevent "stream is not readable" errors from bubbling up. + const conflictError = new ConflictError( + 'Cannot use buffer() and stream() from the same ReadUrlResponse', + ); + let hasCalledStream = false; + let hasCalledBuffer = false; + + return { + buffer: () => { + hasCalledBuffer = true; + if (hasCalledStream) throw conflictError; + if (buffer) return buffer; + buffer = getRawBody(stream); + return buffer; + }, + stream: () => { + hasCalledStream = true; + if (hasCalledBuffer) throw conflictError; + return stream; + }, + etag: options?.etag, + }; + } + + /** + * Resolves a ReadUrlResponse from an old-style NodeJS.ReadableStream. + */ + static async fromNodeJSReadable( + oldStyleStream: NodeJS.ReadableStream, + options?: ReadUrlResponseFactoryFromStreamOptions, + ): Promise { + const readable = new Readable().wrap(oldStyleStream); + return ReadUrlResponseFactory.fromReadable(readable, options); + } +} diff --git a/packages/backend-common/src/reading/index.ts b/packages/backend-common/src/reading/index.ts index f1609179b5..9ee86ef3f2 100644 --- a/packages/backend-common/src/reading/index.ts +++ b/packages/backend-common/src/reading/index.ts @@ -23,6 +23,7 @@ export { GithubUrlReader } from './GithubUrlReader'; export { GitlabUrlReader } from './GitlabUrlReader'; export { AwsS3UrlReader } from './AwsS3UrlReader'; export { FetchUrlReader } from './FetchUrlReader'; +export { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; export type { FromReadableArrayOptions, ReaderFactory, @@ -34,6 +35,7 @@ export type { ReadTreeResponseFactoryOptions, ReadUrlOptions, ReadUrlResponse, + ReadUrlResponseFactoryFromStreamOptions, SearchOptions, SearchResponse, SearchResponseFile, diff --git a/packages/backend-common/src/reading/types.ts b/packages/backend-common/src/reading/types.ts index 9505778705..6eae4e6cac 100644 --- a/packages/backend-common/src/reading/types.ts +++ b/packages/backend-common/src/reading/types.ts @@ -124,6 +124,15 @@ export type ReadUrlResponse = { */ buffer(): Promise; + /** + * Returns the data that was read from the remote URL as a Readable stream. + * + * @remarks + * + * This method will be required in a future release. + */ + stream?(): Readable; + /** * Etag returned by content provider. * @@ -134,6 +143,15 @@ export type ReadUrlResponse = { etag?: string; }; +/** + * An options object for {@link ReadUrlResponseFactory} factory methods. + * + * @public + */ +export type ReadUrlResponseFactoryFromStreamOptions = { + etag?: string; +}; + /** * An options object for {@link UrlReader.readTree} operations. * diff --git a/packages/backend-tasks/CHANGELOG.md b/packages/backend-tasks/CHANGELOG.md index a8c66d866d..73e18d5c6c 100644 --- a/packages/backend-tasks/CHANGELOG.md +++ b/packages/backend-tasks/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/backend-tasks +## 0.3.1-next.1 + +### Patch Changes + +- 73480846dd: `TaskScheduleDefinition` has been updated to also accept an options object containing duration information in the form of days, hours, seconds and so on. This allows for scheduling without importing `luxon`. + + ```diff + -import { Duration } from 'luxon'; + // omitted other code + + const schedule = env.scheduler.createScheduledTaskRunner({ + - frequency: Duration.fromObject({ minutes: 10 }), + - timeout: Duration.fromObject({ minutes: 15 }), + + frequency: { minutes: 10 }, + + timeout: { minutes: 15 }, + // omitted other code + }); + ``` + +- ebbec677e1: Correctly set next run time for tasks +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + ## 0.3.1-next.0 ### Patch Changes diff --git a/packages/backend-tasks/package.json b/packages/backend-tasks/package.json index 20eab4e58e..c9e1371447 100644 --- a/packages/backend-tasks/package.json +++ b/packages/backend-tasks/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-tasks", "description": "Common distributed task management library for Backstage backends", - "version": "0.3.1-next.0", + "version": "0.3.1-next.1", "main": "src/index.ts", "types": "src/index.ts", "private": false, @@ -33,8 +33,8 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/backend-common": "^0.13.3-next.0", - "@backstage/config": "^1.0.0", + "@backstage/backend-common": "^0.13.3-next.2", + "@backstage/config": "^1.0.1-next.0", "@backstage/errors": "^1.0.0", "@backstage/types": "^1.0.0", "@types/luxon": "^2.0.4", @@ -48,8 +48,8 @@ "zod": "^3.9.5" }, "devDependencies": { - "@backstage/backend-test-utils": "^0.1.24-next.0", - "@backstage/cli": "^0.17.1-next.0", + "@backstage/backend-test-utils": "^0.1.24-next.1", + "@backstage/cli": "^0.17.1-next.2", "@types/cron": "^1.7.3", "wait-for-expect": "^3.0.2" }, diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md index 4a6a5a0c25..d224abb4e4 100644 --- a/packages/backend-test-utils/CHANGELOG.md +++ b/packages/backend-test-utils/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/backend-test-utils +## 0.1.24-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/cli@0.17.1-next.2 + ## 0.1.24-next.0 ### Patch Changes diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index eb6f7e0aba..0c7dc08e8b 100644 --- a/packages/backend-test-utils/package.json +++ b/packages/backend-test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-test-utils", "description": "Test helpers library for Backstage backends", - "version": "0.1.24-next.0", + "version": "0.1.24-next.1", "main": "src/index.ts", "types": "src/index.ts", "private": false, @@ -34,9 +34,9 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/backend-common": "^0.13.3-next.0", - "@backstage/cli": "^0.17.1-next.0", - "@backstage/config": "^1.0.0", + "@backstage/backend-common": "^0.13.3-next.2", + "@backstage/cli": "^0.17.1-next.2", + "@backstage/config": "^1.0.1-next.0", "better-sqlite3": "^7.5.0", "knex": "^1.0.2", "msw": "^0.35.0", @@ -46,7 +46,7 @@ "uuid": "^8.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.1-next.0" + "@backstage/cli": "^0.17.1-next.2" }, "files": [ "dist" diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index d77bb00d72..649d2fc525 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,45 @@ # example-backend +## 0.2.71-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/plugin-kubernetes-backend@0.5.1-next.1 + - @backstage/plugin-catalog-backend@1.1.2-next.2 + - @backstage/backend-tasks@0.3.1-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.0-next.1 + - @backstage/plugin-scaffolder-backend@1.2.0-next.1 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-search-backend-node@0.6.1-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@0.1.4-next.1 + - @backstage/plugin-search-backend-module-pg@0.3.3-next.1 + - @backstage/plugin-azure-devops-backend@0.3.11-next.1 + - example-app@0.2.71-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/integration@1.2.0-next.1 + - @backstage/plugin-app-backend@0.3.32-next.1 + - @backstage/plugin-auth-backend@0.13.1-next.2 + - @backstage/plugin-auth-node@0.2.1-next.1 + - @backstage/plugin-badges-backend@0.1.26-next.1 + - @backstage/plugin-code-coverage-backend@0.1.30-next.1 + - @backstage/plugin-graphql-backend@0.1.22-next.1 + - @backstage/plugin-jenkins-backend@0.1.22-next.1 + - @backstage/plugin-kafka-backend@0.2.25-next.1 + - @backstage/plugin-permission-backend@0.5.7-next.1 + - @backstage/plugin-permission-common@0.6.1-next.0 + - @backstage/plugin-permission-node@0.6.1-next.1 + - @backstage/plugin-proxy-backend@0.2.26-next.1 + - @backstage/plugin-rollbar-backend@0.1.29-next.2 + - @backstage/plugin-search-backend@0.5.2-next.1 + - @backstage/plugin-tech-insights-backend@0.4.0-next.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.16-next.2 + - @backstage/plugin-tech-insights-node@0.3.0-next.2 + - @backstage/plugin-techdocs-backend@1.1.1-next.1 + - @backstage/plugin-todo-backend@0.1.29-next.1 + - @backstage/catalog-client@1.0.2-next.0 + ## 0.2.71-next.1 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index 1757693252..9b1664cbe9 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "example-backend", - "version": "0.2.71-next.1", + "version": "0.2.71-next.2", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", @@ -26,39 +26,39 @@ "build-image": "docker build ../.. -f Dockerfile --tag example-backend" }, "dependencies": { - "@backstage/backend-common": "^0.13.3-next.1", - "@backstage/backend-tasks": "^0.3.1-next.0", - "@backstage/catalog-client": "^1.0.1", - "@backstage/catalog-model": "^1.0.1", - "@backstage/config": "^1.0.0", - "@backstage/integration": "^1.2.0-next.0", - "@backstage/plugin-app-backend": "^0.3.32-next.0", - "@backstage/plugin-auth-backend": "^0.13.1-next.1", - "@backstage/plugin-auth-node": "^0.2.1-next.0", - "@backstage/plugin-azure-devops-backend": "^0.3.11-next.0", - "@backstage/plugin-badges-backend": "^0.1.26-next.0", - "@backstage/plugin-catalog-backend": "^1.1.2-next.1", - "@backstage/plugin-code-coverage-backend": "^0.1.30-next.0", - "@backstage/plugin-graphql-backend": "^0.1.22-next.0", - "@backstage/plugin-jenkins-backend": "^0.1.22-next.0", - "@backstage/plugin-kubernetes-backend": "^0.5.1-next.0", - "@backstage/plugin-kafka-backend": "^0.2.25-next.0", - "@backstage/plugin-permission-backend": "^0.5.7-next.0", - "@backstage/plugin-permission-common": "^0.6.0", - "@backstage/plugin-permission-node": "^0.6.1-next.0", - "@backstage/plugin-proxy-backend": "^0.2.26-next.0", - "@backstage/plugin-rollbar-backend": "^0.1.29-next.1", - "@backstage/plugin-scaffolder-backend": "^1.2.0-next.0", - "@backstage/plugin-scaffolder-backend-module-rails": "^0.3.7-next.0", - "@backstage/plugin-search-backend": "^0.5.2-next.0", - "@backstage/plugin-search-backend-node": "^0.6.1-next.0", - "@backstage/plugin-search-backend-module-elasticsearch": "^0.1.4-next.0", - "@backstage/plugin-search-backend-module-pg": "^0.3.3-next.0", - "@backstage/plugin-techdocs-backend": "^1.1.1-next.0", - "@backstage/plugin-tech-insights-backend": "^0.4.0-next.1", - "@backstage/plugin-tech-insights-node": "^0.3.0-next.1", - "@backstage/plugin-tech-insights-backend-module-jsonfc": "^0.1.16-next.1", - "@backstage/plugin-todo-backend": "^0.1.29-next.0", + "@backstage/backend-common": "^0.13.3-next.2", + "@backstage/backend-tasks": "^0.3.1-next.1", + "@backstage/catalog-client": "^1.0.2-next.0", + "@backstage/catalog-model": "^1.0.2-next.0", + "@backstage/config": "^1.0.1-next.0", + "@backstage/integration": "^1.2.0-next.1", + "@backstage/plugin-app-backend": "^0.3.32-next.1", + "@backstage/plugin-auth-backend": "^0.13.1-next.2", + "@backstage/plugin-auth-node": "^0.2.1-next.1", + "@backstage/plugin-azure-devops-backend": "^0.3.11-next.1", + "@backstage/plugin-badges-backend": "^0.1.26-next.1", + "@backstage/plugin-catalog-backend": "^1.1.2-next.2", + "@backstage/plugin-code-coverage-backend": "^0.1.30-next.1", + "@backstage/plugin-graphql-backend": "^0.1.22-next.1", + "@backstage/plugin-jenkins-backend": "^0.1.22-next.1", + "@backstage/plugin-kubernetes-backend": "^0.5.1-next.1", + "@backstage/plugin-kafka-backend": "^0.2.25-next.1", + "@backstage/plugin-permission-backend": "^0.5.7-next.1", + "@backstage/plugin-permission-common": "^0.6.1-next.0", + "@backstage/plugin-permission-node": "^0.6.1-next.1", + "@backstage/plugin-proxy-backend": "^0.2.26-next.1", + "@backstage/plugin-rollbar-backend": "^0.1.29-next.2", + "@backstage/plugin-scaffolder-backend": "^1.2.0-next.1", + "@backstage/plugin-scaffolder-backend-module-rails": "^0.4.0-next.1", + "@backstage/plugin-search-backend": "^0.5.2-next.1", + "@backstage/plugin-search-backend-node": "^0.6.1-next.1", + "@backstage/plugin-search-backend-module-elasticsearch": "^0.1.4-next.1", + "@backstage/plugin-search-backend-module-pg": "^0.3.3-next.1", + "@backstage/plugin-techdocs-backend": "^1.1.1-next.1", + "@backstage/plugin-tech-insights-backend": "^0.4.0-next.2", + "@backstage/plugin-tech-insights-node": "^0.3.0-next.2", + "@backstage/plugin-tech-insights-backend-module-jsonfc": "^0.1.16-next.2", + "@backstage/plugin-todo-backend": "^0.1.29-next.1", "@gitbeaker/node": "^35.1.0", "@octokit/rest": "^18.5.3", "better-sqlite3": "^7.5.0", @@ -75,7 +75,7 @@ "winston": "^3.2.1" }, "devDependencies": { - "@backstage/cli": "^0.17.1-next.1", + "@backstage/cli": "^0.17.1-next.2", "@types/dockerode": "^3.3.0", "@types/express": "^4.17.6", "@types/express-serve-static-core": "^4.17.5", diff --git a/packages/catalog-client/CHANGELOG.md b/packages/catalog-client/CHANGELOG.md index 968afe294b..4c02f5fb28 100644 --- a/packages/catalog-client/CHANGELOG.md +++ b/packages/catalog-client/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/catalog-client +## 1.0.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.0.2-next.0 + ## 1.0.1 ### Patch Changes diff --git a/packages/catalog-client/package.json b/packages/catalog-client/package.json index a5af4e21c1..725f318d80 100644 --- a/packages/catalog-client/package.json +++ b/packages/catalog-client/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/catalog-client", "description": "An isomorphic client for the catalog backend", - "version": "1.0.1", + "version": "1.0.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -33,12 +33,12 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.1", + "@backstage/catalog-model": "^1.0.2-next.0", "@backstage/errors": "^1.0.0", "cross-fetch": "^3.1.5" }, "devDependencies": { - "@backstage/cli": "^0.17.1-next.0", + "@backstage/cli": "^0.17.1-next.2", "@types/jest": "^26.0.7", "msw": "^0.35.0" }, diff --git a/packages/catalog-model/CHANGELOG.md b/packages/catalog-model/CHANGELOG.md index 6dd90da2be..8cc061c193 100644 --- a/packages/catalog-model/CHANGELOG.md +++ b/packages/catalog-model/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/catalog-model +## 1.0.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.1-next.0 + ## 1.0.1 ### Patch Changes diff --git a/packages/catalog-model/package.json b/packages/catalog-model/package.json index 4154e1b8df..6d3506c5bf 100644 --- a/packages/catalog-model/package.json +++ b/packages/catalog-model/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/catalog-model", "description": "Types and validators that help describe the model of a Backstage Catalog", - "version": "1.0.1", + "version": "1.0.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,7 +34,7 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/config": "^1.0.0", + "@backstage/config": "^1.0.1-next.0", "@backstage/errors": "^1.0.0", "@backstage/types": "^1.0.0", "ajv": "^8.10.0", @@ -43,7 +43,7 @@ "uuid": "^8.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.1-next.0", + "@backstage/cli": "^0.17.1-next.2", "@types/jest": "^26.0.7", "@types/json-schema": "^7.0.5", "@types/lodash": "^4.14.151", diff --git a/packages/cli-common/CHANGELOG.md b/packages/cli-common/CHANGELOG.md index c890e44b29..718f766286 100644 --- a/packages/cli-common/CHANGELOG.md +++ b/packages/cli-common/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/cli-common +## 0.1.9-next.0 + +### Patch Changes + +- 6e830352d4: Updated dependency `@types/node` to `^16.0.0`. + ## 0.1.8 ### Patch Changes diff --git a/packages/cli-common/package.json b/packages/cli-common/package.json index bbbc41b812..afeccfef8d 100644 --- a/packages/cli-common/package.json +++ b/packages/cli-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/cli-common", "description": "Common functionality used by cli, backend, and create-app", - "version": "0.1.8", + "version": "0.1.9-next.0", "private": false, "main": "src/index.ts", "types": "src/index.ts", diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index da3e112df8..77db125206 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/cli +## 0.17.1-next.2 + +### Patch Changes + +- 632be18bbc: Updated `create-github-app` command to prompt for read or write permissions to simplify setup. +- Updated dependencies + - @backstage/cli-common@0.1.9-next.0 + - @backstage/config@1.0.1-next.0 + - @backstage/release-manifests@0.0.3-next.0 + - @backstage/config-loader@1.1.1-next.1 + ## 0.17.1-next.1 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 5440982d73..fe97e6127b 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/cli", "description": "CLI for developing Backstage plugins and apps", - "version": "0.17.1-next.1", + "version": "0.17.1-next.2", "private": false, "publishConfig": { "access": "public" @@ -31,11 +31,11 @@ "backstage-cli": "bin/backstage-cli" }, "dependencies": { - "@backstage/cli-common": "^0.1.8", - "@backstage/config": "^1.0.0", - "@backstage/config-loader": "^1.1.1-next.0", + "@backstage/cli-common": "^0.1.9-next.0", + "@backstage/config": "^1.0.1-next.0", + "@backstage/config-loader": "^1.1.1-next.1", "@backstage/errors": "^1.0.0", - "@backstage/release-manifests": "^0.0.2", + "@backstage/release-manifests": "^0.0.3-next.0", "@backstage/types": "^1.0.0", "@hot-loader/react-dom-v16": "npm:@hot-loader/react-dom@^16.0.2", "@hot-loader/react-dom-v17": "npm:@hot-loader/react-dom@^17.0.2", @@ -125,13 +125,13 @@ "zod": "^3.11.6" }, "devDependencies": { - "@backstage/backend-common": "^0.13.3-next.1", - "@backstage/config": "^1.0.0", - "@backstage/core-app-api": "^1.0.2-next.0", - "@backstage/core-components": "^0.9.4-next.0", - "@backstage/core-plugin-api": "^1.0.2-next.0", - "@backstage/dev-utils": "^1.0.2-next.1", - "@backstage/test-utils": "^1.1.0-next.1", + "@backstage/backend-common": "^0.13.3-next.2", + "@backstage/config": "^1.0.1-next.0", + "@backstage/core-app-api": "^1.0.2-next.1", + "@backstage/core-components": "^0.9.4-next.1", + "@backstage/core-plugin-api": "^1.0.2-next.1", + "@backstage/dev-utils": "^1.0.2-next.2", + "@backstage/test-utils": "^1.1.0-next.2", "@backstage/theme": "^0.2.15", "@types/diff": "^5.0.0", "@types/express": "^4.17.6", diff --git a/packages/codemods/CHANGELOG.md b/packages/codemods/CHANGELOG.md index 9b3aec5d0e..a913c906f9 100644 --- a/packages/codemods/CHANGELOG.md +++ b/packages/codemods/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/codemods +## 0.1.38-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.1.9-next.0 + ## 0.1.38-next.0 ### Patch Changes diff --git a/packages/codemods/package.json b/packages/codemods/package.json index f1700564eb..2edf0ce953 100644 --- a/packages/codemods/package.json +++ b/packages/codemods/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/codemods", "description": "A collection of codemods for Backstage projects", - "version": "0.1.38-next.0", + "version": "0.1.38-next.1", "private": false, "publishConfig": { "access": "public", @@ -34,7 +34,7 @@ "backstage-codemods": "bin/backstage-codemods" }, "dependencies": { - "@backstage/cli-common": "^0.1.8", + "@backstage/cli-common": "^0.1.9-next.0", "chalk": "^4.0.0", "jscodeshift": "^0.13.0", "jscodeshift-add-imports": "^1.0.10" diff --git a/packages/config-loader/CHANGELOG.md b/packages/config-loader/CHANGELOG.md index 894be08dc0..e2f89babb2 100644 --- a/packages/config-loader/CHANGELOG.md +++ b/packages/config-loader/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/config-loader +## 1.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.1.9-next.0 + - @backstage/config@1.0.1-next.0 + ## 1.1.1-next.0 ### Patch Changes diff --git a/packages/config-loader/package.json b/packages/config-loader/package.json index aa40320ac2..ca439d07ce 100644 --- a/packages/config-loader/package.json +++ b/packages/config-loader/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/config-loader", "description": "Config loading functionality used by Backstage backend, and CLI", - "version": "1.1.1-next.0", + "version": "1.1.1-next.1", "private": false, "publishConfig": { "access": "public", @@ -34,8 +34,8 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/cli-common": "^0.1.8", - "@backstage/config": "^1.0.0", + "@backstage/cli-common": "^0.1.9-next.0", + "@backstage/config": "^1.0.1-next.0", "@backstage/errors": "^1.0.0", "@backstage/types": "^1.0.0", "@types/json-schema": "^7.0.6", diff --git a/packages/config/CHANGELOG.md b/packages/config/CHANGELOG.md index ce8d1a05f4..396249fd86 100644 --- a/packages/config/CHANGELOG.md +++ b/packages/config/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/config +## 1.0.1-next.0 + +### Patch Changes + +- 6e830352d4: Updated dependency `@types/node` to `^16.0.0`. + ## 1.0.0 ### Major Changes diff --git a/packages/config/package.json b/packages/config/package.json index 869f050b8b..189963c333 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/config", "description": "Config API used by Backstage core, backend, and CLI", - "version": "1.0.0", + "version": "1.0.1-next.0", "private": false, "publishConfig": { "access": "public", @@ -37,7 +37,7 @@ "lodash": "^4.17.21" }, "devDependencies": { - "@backstage/test-utils": "^1.1.0-next.1", + "@backstage/test-utils": "^1.1.0-next.2", "@types/jest": "^26.0.7", "@types/node": "^16.0.0" }, diff --git a/packages/core-app-api/CHANGELOG.md b/packages/core-app-api/CHANGELOG.md index d9450a53c5..a658b9a4b0 100644 --- a/packages/core-app-api/CHANGELOG.md +++ b/packages/core-app-api/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/core-app-api +## 1.0.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.1-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + ## 1.0.2-next.0 ### Patch Changes diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json index c4d9ea050f..a0e96684b4 100644 --- a/packages/core-app-api/package.json +++ b/packages/core-app-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/core-app-api", "description": "Core app API used by Backstage apps", - "version": "1.0.2-next.0", + "version": "1.0.2-next.1", "private": false, "publishConfig": { "access": "public", @@ -33,8 +33,8 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/config": "^1.0.0", - "@backstage/core-plugin-api": "^1.0.2-next.0", + "@backstage/config": "^1.0.1-next.0", + "@backstage/core-plugin-api": "^1.0.2-next.1", "@backstage/types": "^1.0.0", "@backstage/version-bridge": "^1.0.1", "@types/prop-types": "^15.7.3", @@ -49,8 +49,8 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.1-next.1", - "@backstage/test-utils": "^1.1.0-next.1", + "@backstage/cli": "^0.17.1-next.2", + "@backstage/test-utils": "^1.1.0-next.2", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/packages/core-app-api/src/apis/implementations/auth/saml/types.ts b/packages/core-app-api/src/apis/implementations/auth/saml/types.ts index 55b278b429..e5e32e3457 100644 --- a/packages/core-app-api/src/apis/implementations/auth/saml/types.ts +++ b/packages/core-app-api/src/apis/implementations/auth/saml/types.ts @@ -34,7 +34,6 @@ export const samlSessionSchema: z.ZodSchema = z.object({ picture: z.string().optional(), }), backstageIdentity: z.object({ - id: z.string(), token: z.string(), identity: z.object({ type: z.literal('user'), diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md index 147f4b4f52..05efac4a62 100644 --- a/packages/core-components/CHANGELOG.md +++ b/packages/core-components/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/core-components +## 0.9.4-next.2 + +### Patch Changes + +- 52c02ac02b: Don't set the background color on an Avatar component that has a picture. +- 3603014e0e: Add ARIA landmark(
), & label and a heading to OAuthRequestDialog. Removed nested interactive control (button). +- 2025d7c123: Properly highlight `SidebarSubmenuItem` dropdown items on hover, use ellipsis styling on long labels in `SidebarSubmenu`, allow `icon` and `to` properties to be optional on `SidebarSubmenuItem`, and fix `SidebarPage` padding to be responsive to pinned state + +## 0.9.4-next.1 + +### Patch Changes + +- 55f68c386a: Enabled select component to be enabled by keyboard +- ba97b80421: Updated dependency `@types/react-syntax-highlighter` to `^15.0.0`. +- 2bcb0a0e2b: Sidebar NAV now includes aria-label. Component AboutField now uses h2 variant instead of subtitle2 (font properties unchanged) +- Updated dependencies + - @backstage/config@1.0.1-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + ## 0.9.4-next.0 ### Patch Changes diff --git a/packages/core-components/api-report.md b/packages/core-components/api-report.md index a195d62496..727a50926c 100644 --- a/packages/core-components/api-report.md +++ b/packages/core-components/api-report.md @@ -1084,8 +1084,8 @@ export type SidebarSubmenuItemDropdownItem = { // @public export type SidebarSubmenuItemProps = { title: string; - to: string; - icon: IconComponent; + to?: string; + icon?: IconComponent; dropdownItems?: SidebarSubmenuItemDropdownItem[]; }; diff --git a/packages/core-components/package.json b/packages/core-components/package.json index 164513b89c..e2f05aff2d 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/core-components", "description": "Core components used by Backstage plugins and apps", - "version": "0.9.4-next.0", + "version": "0.9.4-next.2", "private": false, "publishConfig": { "access": "public", @@ -33,8 +33,8 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/config": "^1.0.0", - "@backstage/core-plugin-api": "^1.0.2-next.0", + "@backstage/config": "^1.0.1-next.0", + "@backstage/core-plugin-api": "^1.0.2-next.1", "@backstage/errors": "^1.0.0", "@backstage/theme": "^0.2.15", "@material-table/core": "^3.1.0", @@ -55,7 +55,7 @@ "pluralize": "^8.0.0", "prop-types": "^15.7.2", "qs": "^6.9.4", - "rc-progress": "3.2.4", + "rc-progress": "3.3.2", "react-helmet": "6.1.0", "react-hook-form": "^7.12.2", "react-markdown": "^8.0.0", @@ -78,9 +78,9 @@ "react-dom": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/core-app-api": "^1.0.2-next.0", - "@backstage/cli": "^0.17.1-next.1", - "@backstage/test-utils": "^1.1.0-next.1", + "@backstage/core-app-api": "^1.0.2-next.1", + "@backstage/cli": "^0.17.1-next.2", + "@backstage/test-utils": "^1.1.0-next.2", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/packages/core-components/src/components/Avatar/Avatar.test.tsx b/packages/core-components/src/components/Avatar/Avatar.test.tsx index 1c08d57679..d7bbf712fe 100644 --- a/packages/core-components/src/components/Avatar/Avatar.test.tsx +++ b/packages/core-components/src/components/Avatar/Avatar.test.tsx @@ -17,6 +17,7 @@ import { render } from '@testing-library/react'; import React from 'react'; import { Avatar } from './Avatar'; +import { stringToColor } from './utils'; describe('', () => { it('renders without exploding', async () => { @@ -24,4 +25,24 @@ describe('', () => { expect(getByText('JD')).toBeInTheDocument(); }); + + it('generates a background color', async () => { + const bgcolor = stringToColor('John Doe'); + const { getByText } = render(); + expect(getByText('JD')).toHaveStyle(`background-color: ${bgcolor}`); + }); + + it('does not generate a background color when a picture is given', async () => { + const bgcolor = stringToColor('John Doe'); + const { getByAltText } = render( + , + ); + + expect(getByAltText('John Doe')).not.toHaveStyle( + `background-color: ${bgcolor}`, + ); + }); }); diff --git a/packages/core-components/src/components/Avatar/Avatar.tsx b/packages/core-components/src/components/Avatar/Avatar.tsx index 304ee574d2..af8dabf554 100644 --- a/packages/core-components/src/components/Avatar/Avatar.tsx +++ b/packages/core-components/src/components/Avatar/Avatar.tsx @@ -67,15 +67,23 @@ export interface AvatarProps { export function Avatar(props: AvatarProps) { const { displayName, picture, customStyles } = props; const classes = useStyles(); + let styles = { ...customStyles }; + // We only calculate the background color if there's not an avatar + // picture. If there is a picture, it might have a transparent + // background and we don't know whether the calculated background + // color will clash. + if (!picture) { + styles = { + backgroundColor: stringToColor(displayName || ''), + ...customStyles, + }; + } return ( {displayName && extractInitials(displayName)} diff --git a/packages/core-components/src/components/OAuthRequestDialog/LoginRequestListItem.tsx b/packages/core-components/src/components/OAuthRequestDialog/LoginRequestListItem.tsx index 0c6bd62bcb..c7707c07d5 100644 --- a/packages/core-components/src/components/OAuthRequestDialog/LoginRequestListItem.tsx +++ b/packages/core-components/src/components/OAuthRequestDialog/LoginRequestListItem.tsx @@ -59,7 +59,7 @@ const LoginRequestListItem = ({ request, busy, setBusy }: RowProps) => { const IconComponent = request.provider.icon; return ( - + diff --git a/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx b/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx index b11821803a..02b1afe4a1 100644 --- a/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx +++ b/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx @@ -25,6 +25,7 @@ import React, { useMemo, useState } from 'react'; import useObservable from 'react-use/lib/useObservable'; import LoginRequestListItem from './LoginRequestListItem'; import { useApi, oauthRequestApiRef } from '@backstage/core-plugin-api'; +import Typography from '@material-ui/core/Typography'; export type OAuthRequestDialogClassKey = | 'dialog' @@ -40,6 +41,9 @@ const useStyles = makeStyles( title: { minWidth: 0, }, + titleHeading: { + fontSize: theme.typography.h6.fontSize, + }, contentList: { padding: 0, }, @@ -69,23 +73,31 @@ export function OAuthRequestDialog(_props: {}) { fullWidth maxWidth="xs" classes={{ paper: classes.dialog }} + aria-labelledby="oauth-req-dialog-title" > - - Login Required - +
+ + + Login Required + + - - - {requests.map(request => ( - - ))} - - + + + {requests.map(request => ( + + ))} + + +
diff --git a/packages/core-components/src/components/Select/Select.tsx b/packages/core-components/src/components/Select/Select.tsx index 022df0a7ad..31097d8aab 100644 --- a/packages/core-components/src/components/Select/Select.tsx +++ b/packages/core-components/src/components/Select/Select.tsx @@ -19,6 +19,7 @@ import Chip from '@material-ui/core/Chip'; import ClickAwayListener from '@material-ui/core/ClickAwayListener'; import FormControl from '@material-ui/core/FormControl'; import InputBase from '@material-ui/core/InputBase'; +import InputLabel from '@material-ui/core/InputLabel'; import MenuItem from '@material-ui/core/MenuItem'; import Select from '@material-ui/core/Select'; import { @@ -87,6 +88,16 @@ const useStyles = makeStyles( color: theme.palette.text.primary, }, }, + formLabel: { + transform: 'initial', + fontWeight: 'bold', + fontSize: 14, + fontFamily: theme.typography.fontFamily, + color: theme.palette.text.primary, + '&.Mui-focused': { + color: theme.palette.text.primary, + }, + }, chips: { display: 'flex', flexWrap: 'wrap', @@ -184,9 +195,9 @@ export function SelectComponent(props: SelectProps) { return (
- {label} + {label}