diff --git a/.changeset/afraid-foxes-provide.md b/.changeset/afraid-foxes-provide.md new file mode 100644 index 0000000000..e02702b895 --- /dev/null +++ b/.changeset/afraid-foxes-provide.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-sonarqube': patch +--- + +Additional export added in order to bind SonarQubeClient to its apiref diff --git a/.changeset/brave-cougars-burn.md b/.changeset/brave-cougars-burn.md new file mode 100644 index 0000000000..419378d25d --- /dev/null +++ b/.changeset/brave-cougars-burn.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-scaffolder-react': patch +'@backstage/plugin-scaffolder': patch +--- + +`scaffolder/next`: bump `react-jsonschema-form` libraries to `v5-stable` diff --git a/.changeset/chatty-owls-care.md b/.changeset/chatty-owls-care.md new file mode 100644 index 0000000000..9f39f51bb5 --- /dev/null +++ b/.changeset/chatty-owls-care.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +The `backstage-cli repo test` command now sets a default Jest `--workerIdleMemoryLimit` of 1GB. If needed to ensure that tests are not run in band, `--maxWorkers=2` is set as well. This is the recommended workaround for dealing with Jest workers leaking memory and eventually hitting the heap limit. diff --git a/.changeset/cuddly-boxes-agree.md b/.changeset/cuddly-boxes-agree.md new file mode 100644 index 0000000000..83f027ecb5 --- /dev/null +++ b/.changeset/cuddly-boxes-agree.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs': minor +--- + +Update DocsTable and EntityListDocsTable to accept overrides for Material Table options. diff --git a/.changeset/dry-donkeys-cheer.md b/.changeset/dry-donkeys-cheer.md new file mode 100644 index 0000000000..70ed45fa74 --- /dev/null +++ b/.changeset/dry-donkeys-cheer.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Added a check to ensure that Yarn v1 is used when creating new projects. diff --git a/.changeset/dull-gorillas-sing.md b/.changeset/dull-gorillas-sing.md new file mode 100644 index 0000000000..99246bea1c --- /dev/null +++ b/.changeset/dull-gorillas-sing.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +The previous migration that adds the `search.original_value` column may leave some of the entities not updated. Add a migration script to trigger a reprocessing of the entities. diff --git a/.changeset/four-candles-add.md b/.changeset/four-candles-add.md new file mode 100644 index 0000000000..fa975e0a58 --- /dev/null +++ b/.changeset/four-candles-add.md @@ -0,0 +1,18 @@ +--- +'@backstage/plugin-tech-insights-backend': patch +'@backstage/plugin-tech-insights-common': patch +'@backstage/plugin-tech-insights-node': minor +'@backstage/plugin-tech-insights': patch +--- + +TechInsightsApi interface now has getFactSchemas() method. +TechInsightsClient now implements method getFactSchemas(). + +**BREAKING** FactSchema type moved from @backstage/plugin-tech-insights-node into @backstage/plugin-tech-insights-common + +These changes are **required** if you were importing this type directly. + +```diff +- import { FactSchema } from '@backstage/plugin-tech-insights-node'; ++ import { FactSchema } from '@backstage/plugin-tech-insights-common'; +``` diff --git a/.changeset/four-rivers-enjoy.md b/.changeset/four-rivers-enjoy.md new file mode 100644 index 0000000000..b38babd8bd --- /dev/null +++ b/.changeset/four-rivers-enjoy.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-msgraph': patch +--- + +Fix MS Graph provider to use target URL for fetching access token diff --git a/.changeset/gold-bulldogs-talk.md b/.changeset/gold-bulldogs-talk.md new file mode 100644 index 0000000000..e5b6254ec5 --- /dev/null +++ b/.changeset/gold-bulldogs-talk.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-search': minor +--- + +Update `SearchModal` component to use `SearchResult` extensions. diff --git a/.changeset/happy-cows-moo.md b/.changeset/happy-cows-moo.md new file mode 100644 index 0000000000..a5e425f5d2 --- /dev/null +++ b/.changeset/happy-cows-moo.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-azure-devops-backend': patch +--- + +Fixed a bug where the azure devops host in URLs on the readme card was being URL encoded, breaking hosts with ports. diff --git a/.changeset/hip-pugs-teach.md b/.changeset/hip-pugs-teach.md new file mode 100644 index 0000000000..4a3820cecc --- /dev/null +++ b/.changeset/hip-pugs-teach.md @@ -0,0 +1,12 @@ +--- +'@backstage/plugin-techdocs-module-addons-contrib': patch +'@backstage/plugin-techdocs-addons-test-utils': patch +'@backstage/plugin-apollo-explorer': patch +'@backstage/plugin-cicd-statistics': patch +'@backstage/plugin-codescene': patch +'@backstage/plugin-dynatrace': patch +'@backstage/plugin-org-react': patch +'@backstage/plugin-playlist': patch +--- + +Depend on `@material-ui/core` version `^4.12.2` like all other in-repo packages diff --git a/.changeset/hot-lions-cover.md b/.changeset/hot-lions-cover.md new file mode 100644 index 0000000000..62064188a4 --- /dev/null +++ b/.changeset/hot-lions-cover.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-github': patch +--- + +Add support for filtering out forks diff --git a/.changeset/hungry-news-fix.md b/.changeset/hungry-news-fix.md new file mode 100644 index 0000000000..c59113d9f4 --- /dev/null +++ b/.changeset/hungry-news-fix.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-sentry': patch +--- + +Fix broken module exports and dependencies to match a backend module, rather than a frontend plugin. diff --git a/.changeset/late-rice-crash.md b/.changeset/late-rice-crash.md new file mode 100644 index 0000000000..b692310c01 --- /dev/null +++ b/.changeset/late-rice-crash.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-home': patch +--- + +Fixed regression that caused the `WelcomeTitle` to not be the right size when passed to the `title` property of the `
` component. A Storybook entry was also added for the `WelcomeTitle` diff --git a/.changeset/many-nails-joke.md b/.changeset/many-nails-joke.md new file mode 100644 index 0000000000..2ffd97dd0b --- /dev/null +++ b/.changeset/many-nails-joke.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog': minor +--- + +Added Markdown support in the `AboutCard` description section diff --git a/.changeset/modern-cats-worry.md b/.changeset/modern-cats-worry.md new file mode 100644 index 0000000000..b6698cb805 --- /dev/null +++ b/.changeset/modern-cats-worry.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +Switched the order of reprocessing statements retroactively in migrations. This only improves the experience for those who at a later time perform a large upgrade of an old Backstage installation. diff --git a/.changeset/nasty-beans-accept.md b/.changeset/nasty-beans-accept.md new file mode 100644 index 0000000000..51b3e88e49 --- /dev/null +++ b/.changeset/nasty-beans-accept.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Update `SearchPage` template to use `SearchResult` extensions. diff --git a/.changeset/neat-zebras-run.md b/.changeset/neat-zebras-run.md new file mode 100644 index 0000000000..4ce5d5c393 --- /dev/null +++ b/.changeset/neat-zebras-run.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-app-api': patch +--- + +Fixed an issue where an explicit port the frontend base URL could break the app. diff --git a/.changeset/nine-guests-compete.md b/.changeset/nine-guests-compete.md new file mode 100644 index 0000000000..697236d0b7 --- /dev/null +++ b/.changeset/nine-guests-compete.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-home': patch +--- + +remove unused plugin-stack-overflow dependency diff --git a/.changeset/ninety-hats-serve.md b/.changeset/ninety-hats-serve.md new file mode 100644 index 0000000000..762e53c242 --- /dev/null +++ b/.changeset/ninety-hats-serve.md @@ -0,0 +1,30 @@ +--- +'@backstage/plugin-catalog-backend-module-azure': patch +--- + +This will add the ability to use Azure DevOps with multi project with a single value which is a new feature as previously this had to be done manually for each project that you wanted to add. + +Right now you would have to fill in multiple values in the config to use multiple projects: + +``` +yourFirstProviderId: # identifies your dataset / provider independent of config changes + organization: myorg + project: 'firstProject' # this will match the firstProject project + repository: '*' # this will match all repos + path: /catalog-info.yaml +yourSecondProviderId: # identifies your dataset / provider independent of config changes + organization: myorg + project: 'secondProject' # this will match the secondProject project + repository: '*' # this will match all repos + path: /catalog-info.yaml +``` + +With this change you can actually have all projects available where your PAT determines which you have access to, so that includes multiple projects: + +``` +yourFirstProviderId: # identifies your dataset / provider independent of config changes + organization: myorg + project: '*' # this will match all projects where your PAT has access to + repository: '*' # this will match all repos + path: /catalog-info.yaml +``` diff --git a/.changeset/old-knives-wonder.md b/.changeset/old-knives-wonder.md new file mode 100644 index 0000000000..93d2be4871 --- /dev/null +++ b/.changeset/old-knives-wonder.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog': minor +--- + +The `CatalogSearchResultListItem` component is now a search result extension. This means that when rendered as a child of components that render search extensions, the `result`, `rank`, and `highlight` properties are optional. See the [documentation](https://backstage.io/docs/features/search/how-to-guides#how-to-render-search-results-using-extensions) for more details. diff --git a/.changeset/poor-moons-confess.md b/.changeset/poor-moons-confess.md index 7fbdc292ed..7489a3c9f1 100644 --- a/.changeset/poor-moons-confess.md +++ b/.changeset/poor-moons-confess.md @@ -1,5 +1,5 @@ --- -'@backstage/plugin-catalog-backend-module-incremental-ingestion': minor +'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch --- -Return EventSubscriber from addIncrementalEntityProvider to hook up to EventsBackend +Return `EventSubscriber` from `addIncrementalEntityProvider` to hook up to `EventsBackend` diff --git a/.changeset/popular-dancers-join.md b/.changeset/popular-dancers-join.md new file mode 100644 index 0000000000..e7f6ab524f --- /dev/null +++ b/.changeset/popular-dancers-join.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +The Button component has been deprecated in favor of the LinkButton component diff --git a/.changeset/pre.json b/.changeset/pre.json index 0d150702fb..8d412f53b5 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -198,36 +198,79 @@ "@backstage/plugin-scaffolder-node": "0.0.0" }, "changesets": [ + "afraid-foxes-provide", + "brave-cougars-burn", "bright-eagles-love", "brown-islands-own", "calm-avocados-exercise", + "chatty-owls-care", + "clean-queens-judge", "cold-cycles-switch", "create-app-1674561612", + "cuddly-boxes-agree", "cyan-deers-walk", + "dry-donkeys-cheer", + "dull-gorillas-sing", "eight-falcons-explode", + "eight-hotels-sparkle", "flat-cups-itch", + "four-candles-add", + "four-rivers-enjoy", "friendly-scissors-shop", + "gold-bulldogs-talk", "gold-lemons-eat", "gold-masks-sleep", + "grumpy-bottles-stare", + "happy-cows-moo", + "hip-pugs-teach", + "hot-lions-cover", + "hungry-news-fix", "itchy-goats-melt", "khaki-toes-care", + "late-rice-crash", "lazy-badgers-rule", "lazy-badgers-try", "lemon-tables-train", "lovely-ladybugs-taste", + "many-nails-joke", + "modern-cats-worry", + "nasty-beans-accept", + "neat-zebras-run", "nervous-apricots-whisper", "nervous-mangos-rhyme", + "nine-glasses-invent", + "nine-guests-compete", + "ninety-hats-serve", + "old-knives-wonder", "perfect-cheetahs-serve", "pink-falcons-serve", + "poor-moons-confess", + "popular-dancers-join", + "pretty-ladybugs-taste", + "purple-feet-smile", "quick-ladybugs-reply", "rare-melons-battle", + "renovate-0b349f9", + "renovate-0c3644c", + "rich-snakes-rest", "rotten-mayflies-love", + "sharp-lobsters-build", "shiny-years-tap", + "shy-steaks-invite", "silly-turkeys-hang", + "smart-dingos-raise", + "soft-boxes-buy", + "soft-snails-notice", "spotty-coats-clean", "stale-dots-smile", + "stupid-ladybugs-brake", "swift-fishes-smash", + "tall-years-relate", + "thick-clocks-pump", + "twenty-islands-wonder", "twenty-parents-relate", + "two-melons-lie", + "witty-moose-itch", "young-singers-learn" ] } diff --git a/.changeset/pretty-ladybugs-taste.md b/.changeset/pretty-ladybugs-taste.md new file mode 100644 index 0000000000..5c87cde123 --- /dev/null +++ b/.changeset/pretty-ladybugs-taste.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Adds new type, TableOptions, extending Material Table Options. diff --git a/.changeset/purple-feet-smile.md b/.changeset/purple-feet-smile.md new file mode 100644 index 0000000000..0416284edf --- /dev/null +++ b/.changeset/purple-feet-smile.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-tech-radar': patch +--- + +Allow to set additional links to the entry description. diff --git a/.changeset/renovate-0c3644c.md b/.changeset/renovate-0c3644c.md new file mode 100644 index 0000000000..c32438b452 --- /dev/null +++ b/.changeset/renovate-0c3644c.md @@ -0,0 +1,6 @@ +--- +'@backstage/cli': patch +'@backstage/plugin-scaffolder-backend': patch +--- + +Updated dependency `esbuild` to `^0.17.0`. diff --git a/.changeset/rich-snakes-rest.md b/.changeset/rich-snakes-rest.md new file mode 100644 index 0000000000..7b42491ba1 --- /dev/null +++ b/.changeset/rich-snakes-rest.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-explore': minor +--- + +The `ToolSearchResultListItem` component is now a search result extension. This means that when rendered as a child of components that render search extensions, the `result`, `rank`, and `highlight` properties are optional. See the [documentation](https://backstage.io/docs/features/search/how-to-guides#how-to-render-search-results-using-extensions) for more details. diff --git a/.changeset/sharp-lobsters-build.md b/.changeset/sharp-lobsters-build.md new file mode 100644 index 0000000000..d00333581b --- /dev/null +++ b/.changeset/sharp-lobsters-build.md @@ -0,0 +1,10 @@ +--- +'@backstage/backend-plugin-api': patch +--- + +The `register` methods passed to `createBackendPlugin` and `createBackendModule` +now have dedicated `BackendPluginRegistrationPoints` and +`BackendModuleRegistrationPoints` arguments, respectively. This lets us make it +clear on a type level that it's not possible to pass in extension points as +dependencies to plugins (should only ever be done for modules). This has no +practical effect on code that was already well behaved. diff --git a/.changeset/shy-steaks-invite.md b/.changeset/shy-steaks-invite.md new file mode 100644 index 0000000000..b4a70589f9 --- /dev/null +++ b/.changeset/shy-steaks-invite.md @@ -0,0 +1,16 @@ +--- +'@backstage/plugin-catalog-backend-module-bitbucket': patch +'@backstage/plugin-catalog-backend-module-github': patch +'@backstage/plugin-catalog-backend-module-gitlab': patch +'@backstage/plugin-catalog-backend-module-azure': patch +'@backstage/plugin-azure-devops-backend': patch +'@backstage/plugin-git-release-manager': patch +'@backstage/core-components': patch +'@backstage/plugin-playlist-backend': patch +'@backstage/plugin-apache-airflow': patch +'@backstage/plugin-circleci': patch +'@backstage/plugin-bitrise': patch +'@backstage/plugin-sentry': patch +--- + +Internal refactor to not use deprecated `substr` diff --git a/.changeset/soft-boxes-buy.md b/.changeset/soft-boxes-buy.md new file mode 100644 index 0000000000..581f69cacd --- /dev/null +++ b/.changeset/soft-boxes-buy.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-gitlab': patch +--- + +Implement Group and User Catalog Provider diff --git a/.changeset/soft-snails-notice.md b/.changeset/soft-snails-notice.md new file mode 100644 index 0000000000..ed39ee9591 --- /dev/null +++ b/.changeset/soft-snails-notice.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': patch +--- + +Prefer schema ordering of template properties during review content generation. diff --git a/.changeset/stupid-ladybugs-brake.md b/.changeset/stupid-ladybugs-brake.md new file mode 100644 index 0000000000..5a14b82937 --- /dev/null +++ b/.changeset/stupid-ladybugs-brake.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-search-react': minor +--- + +- Create the search results extensions, for more details see the documentation [here](https://backstage.io/docs/features/search/how-to-guides#how-to-render-search-results-using-extensions); +- Update the `SearchResult`, `SearchResultList` and `SearchResultGroup` components to use extensions and default their props to optionally accept a query, when the query is not passed, the component tries to get it from the search context. diff --git a/.changeset/tall-years-relate.md b/.changeset/tall-years-relate.md new file mode 100644 index 0000000000..10198992ea --- /dev/null +++ b/.changeset/tall-years-relate.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-airbrake': patch +--- + +Adds a boolean helper function to airbrake plugin for use on the EntityPage to show/hide airbrake tab depending on whether the entity's catalog-info.yml has an airbrake id set in the metadata diff --git a/.changeset/thick-clocks-pump.md b/.changeset/thick-clocks-pump.md new file mode 100644 index 0000000000..6b3b6e86de --- /dev/null +++ b/.changeset/thick-clocks-pump.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': patch +--- + +Fixed bug in review step refactor that caused schema-based display settings for individual property values to be discarded. diff --git a/.changeset/twenty-islands-wonder.md b/.changeset/twenty-islands-wonder.md new file mode 100644 index 0000000000..fe3c5a05c8 --- /dev/null +++ b/.changeset/twenty-islands-wonder.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-react': minor +--- + +Aligned buttons on "Unregister entity" dialog to keep them on the same line diff --git a/.changeset/two-melons-lie.md b/.changeset/two-melons-lie.md new file mode 100644 index 0000000000..f7abd749d5 --- /dev/null +++ b/.changeset/two-melons-lie.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Switch to inline source maps for test transpilation, simplifying editor setups. diff --git a/.changeset/witty-moose-itch.md b/.changeset/witty-moose-itch.md new file mode 100644 index 0000000000..e2593bf7e7 --- /dev/null +++ b/.changeset/witty-moose-itch.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs': minor +--- + +The `TechDocsSearchResultListItem` component is now a search result extension. This means that when rendered as a child of components that render search extensions, the `result`, `rank`, and `highlight` properties are optional. See the [documentation](https://backstage.io/docs/features/search/how-to-guides#how-to-render-search-results-using-extensions) for more details. diff --git a/.github/ISSUE_TEMPLATE/bug.yaml b/.github/ISSUE_TEMPLATE/bug.yaml index 782b5fdfa0..57595621e4 100644 --- a/.github/ISSUE_TEMPLATE/bug.yaml +++ b/.github/ISSUE_TEMPLATE/bug.yaml @@ -1,6 +1,6 @@ name: '🐛 Bug Report' description: 'Submit a bug report to help us improve' -title: '🐛 Bug Report: ' +title: '🐛 Bug Report: ' labels: - bug body: diff --git a/.github/ISSUE_TEMPLATE/feature.yaml b/.github/ISSUE_TEMPLATE/feature.yaml index b5e06d48cf..b2d5a6be81 100644 --- a/.github/ISSUE_TEMPLATE/feature.yaml +++ b/.github/ISSUE_TEMPLATE/feature.yaml @@ -1,6 +1,6 @@ name: 🚀 Feature description: 'Submit a proposal for a new feature' -title: '🚀 Feature: ' +title: '🚀 Feature: <title>' labels: [enhancement] body: - type: markdown diff --git a/.github/ISSUE_TEMPLATE/plugin.yaml b/.github/ISSUE_TEMPLATE/plugin.yaml index a36c427981..a7f5216631 100644 --- a/.github/ISSUE_TEMPLATE/plugin.yaml +++ b/.github/ISSUE_TEMPLATE/plugin.yaml @@ -1,6 +1,6 @@ name: 🔌 Plugin description: 'Submit a proposal for a new Plugin' -title: '🔌 Plugin: ' +title: '🔌 Plugin: <title>' labels: [plugin] body: - type: markdown diff --git a/.github/ISSUE_TEMPLATE/rfc.yaml b/.github/ISSUE_TEMPLATE/rfc.yaml index 775c64e674..8e73992dc8 100644 --- a/.github/ISSUE_TEMPLATE/rfc.yaml +++ b/.github/ISSUE_TEMPLATE/rfc.yaml @@ -1,6 +1,6 @@ name: 💬 RFC description: 'Request For Comments (RFC) from the community' -title: '💬 RFC: ' +title: '💬 RFC: <title>' labels: [rfc] body: - type: markdown diff --git a/.github/ISSUE_TEMPLATE/ux_component.yaml b/.github/ISSUE_TEMPLATE/ux_component.yaml index 453f1e8278..c528356eb3 100644 --- a/.github/ISSUE_TEMPLATE/ux_component.yaml +++ b/.github/ISSUE_TEMPLATE/ux_component.yaml @@ -1,6 +1,6 @@ name: 🦄 UX Component description: 'For designers to request UX components to be added to the Backstage Storybook' -title: '🦄 UX Component: ' +title: '🦄 UX Component: <title>' labels: [design] body: - type: markdown diff --git a/.github/workflows/sync_release-manifest.yml b/.github/workflows/sync_release-manifest.yml index c6d00ecd28..8cf6991aaf 100644 --- a/.github/workflows/sync_release-manifest.yml +++ b/.github/workflows/sync_release-manifest.yml @@ -53,10 +53,6 @@ jobs: github-token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} # TODO(Rugvip): Remove the create-app dispatch once we've been on the release version for a while script: | - const releaseVersion = require('./backstage/package.json').version; - if(releaseVersion.includes('next')) { - return; - } console.log('Dispatching upgrade helper sync'); await github.rest.actions.createWorkflowDispatch({ owner: 'backstage', @@ -65,6 +61,6 @@ jobs: ref: 'master', inputs: { version: require('./backstage/packages/create-app/package.json').version, - releaseVersion + releaseVersion: require('./backstage/package.json').version }, }); diff --git a/.github/workflows/uffizzi-build.yml b/.github/workflows/uffizzi-build.yml index a23216a9cb..5c8e179958 100644 --- a/.github/workflows/uffizzi-build.yml +++ b/.github/workflows/uffizzi-build.yml @@ -89,16 +89,11 @@ jobs: name: preview-spec path: docker-compose.rendered.yml retention-days: 2 - - name: Serialize PR Event to File - run: | - cat << EOF > event.json - ${{ toJSON(github.event) }} - EOF - name: Upload PR Event as Artifact uses: actions/upload-artifact@v3 with: name: preview-spec - path: event.json + path: ${{ github.event_path }} retention-days: 2 delete-preview: @@ -107,14 +102,9 @@ jobs: if: ${{ github.event.action == 'closed' }} steps: # If this PR is closing, we will not render a compose file nor pass it to the next workflow. - - name: Serialize PR Event to File - run: | - cat << EOF > event.json - ${{ toJSON(github.event) }} - EOF - name: Upload PR Event as Artifact uses: actions/upload-artifact@v3 with: name: preview-spec - path: event.json + path: ${{ github.event_path }} retention-days: 2 diff --git a/.github/workflows/uffizzi-preview.yaml b/.github/workflows/uffizzi-preview.yaml index 3c344f5a78..6390671bbd 100644 --- a/.github/workflows/uffizzi-preview.yaml +++ b/.github/workflows/uffizzi-preview.yaml @@ -11,6 +11,7 @@ jobs: cache-compose-file: name: Cache Compose File runs-on: ubuntu-latest + if: ${{ github.event.workflow_run.conclusion == 'success' }} outputs: compose-file-cache-key: ${{ env.COMPOSE_FILE_HASH }} pr-number: ${{ env.PR_NUMBER }} @@ -47,7 +48,7 @@ jobs: run: | echo 'EVENT_JSON<<EOF' >> $GITHUB_ENV cat event.json >> $GITHUB_ENV - echo 'EOF' >> $GITHUB_ENV + echo -e '\nEOF' >> $GITHUB_ENV - name: Hash Rendered Compose File id: hash @@ -77,6 +78,7 @@ jobs: name: Use Remote Workflow to Preview on Uffizzi needs: - cache-compose-file + if: ${{ github.event.workflow_run.conclusion == 'success' }} uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v2 with: # If this workflow was triggered by a PR close event, cache-key will be an empty string diff --git a/STYLE.md b/STYLE.md index 87e0644759..e38354ae1d 100644 --- a/STYLE.md +++ b/STYLE.md @@ -94,6 +94,13 @@ This section describes guidelines for designing public APIs. It can also be appl /* ... */ } + // In order to make a private constructor available for testing you can use a + // static factory marked as `@internal`, which will not show up in the public API. + /** @internal */ + static forTesting(internalOptions?: { ... }) { + return new DefaultImageLoader(internalOptions); + } + private constructor(/* ... */) { /* ... */ } diff --git a/docs/assets/backend-system/architecture-building-blocks.drawio.svg b/docs/assets/backend-system/architecture-building-blocks.drawio.svg index 0244d461c6..7a65f3a725 100644 --- a/docs/assets/backend-system/architecture-building-blocks.drawio.svg +++ b/docs/assets/backend-system/architecture-building-blocks.drawio.svg @@ -1,32 +1,28 @@ -<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="522px" height="282px" viewBox="-0.5 -0.5 522 282" content="<mxfile scale="1.5" border="20"><diagram id="gKBvn7eBFHudv9VMIRD-" name="Page-1">3VhBc6IwGP01XDtAAPW4tbZ76Ywz7sx2jylEyBgTJwTF/fUbSJBErKtsq654kPfyhYT3Mg+CA8bL8oXDVfbKEkQc301KBzw5vu95wJd/FbNVTDgaKCLlONFFLTHDv5EmXc0WOEG5VSgYIwKvbDJmlKJYWBzknG3ssjkj9qgrmKIOMYsh6bI/cSIyxYLAbfnvCKdZM/JQN7zDeJFyVlA9nOODeX2o5iVsLqXr8wwmbGNQYOKAMWdMqLNlOUakkrZRTfV7/qB1N22OqDilg3YlF9vmzlEihdCQMir/HjOxJBJ58hTR5Fslr4TvhMWLHxmmin7GxCjSjgYS5QJyYeBaHVSN70rUnXBjN+Qp0lSgqGpqRo2+oxfElkjwrSzgiECB17aHUC+FdFe36zplWI7qu3rZhtqUrQ2bC+Ss4DHSfVpN5YkxiZaqlT6s+vBc1Uss3irBHoaDUONfRttTqdWswdYAU8SxnBjiDXcx/5RaivK7lkaXsRSMbE8HX+apvsc1JIWe7KPMAillx2tbwE2GBZqtYK3VRqapbf1c2jJmhPG6L5hE1a92hbMFMlqi+qh6MCoMXh3HnFojLlB51IWm1RazgRsjIZtgy4x0DNyPbbMUPyIv6Mg7Q3yNY/mQuCN9weHVagg8/CJ9Rz0jyTPiyH0IjwfSVcIn6IZP+Nnhc6rKnt87+a3gd/+is5zWmwkMdyrYdqvRzfkDruVP0EmZKSlSTO8qZPZCHFwuZMKOvJNSIJpjRiVdP4XvSmlwPakbl89PmpsP9OiWAh30DnS/R6B7/0OgH/DnaoEedRLnlSUFuau3xv1960Vj5uz3xs9ekgnMsxp4GkyhkPtdWjO+6+003lt8fTat4B9X7eE9qheNHkLLwRO/PHSutL8S9ne76l567HYlbL9JqfL2ux+Y/AE=</diagram></mxfile>" style="background-color: rgb(255, 255, 255);"> +<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="642px" height="327px" viewBox="-0.5 -0.5 642 327" content="<mxfile scale="1.5" border="20"><diagram id="gKBvn7eBFHudv9VMIRD-" name="Page-1">3VnbTuMwEP2aPFLl1tsjlMLuw0pI3dXCo0ncxMK1K8dtU75+7dhJnBhKFMJlGySUGV/nnDNjE5xgsclvGdimv2gMseO7ce4E147vz1xX/JaOo3JMZ9qRMBQrl1c7VugZamfZbYdimDU6ckoxR9umM6KEwIg3fIAxemh2W1PcXHULEmg5VhHAtvcvinmqvEHo1v4fECVpuXIZ3iOInhJGd0Qv5/jBunhU8waUU+n+WQpiejBcwdIJFoxSrt42+QJiiWyJmhp380prtW0GCe8ywFcD9gDvdORXIgJI4kzvjx9LSIqooBznOsHVIUUcrrYgkq0HoQHhS/kGC8sTr2uE8YJiyoqxwXIif4Q/44w+QaNlUjxyBCXc8KtH+O2IdJB7yDjMDZeO8BbSDeTsKLro1otAo63FeFGif6ipDUvFpgatJd1Aqymppq4hFS8a1ZcRDiyEV5DtUQTPCWGvhfDUBnj2QfjOLXzvGN2L6mHBC2OR4toklMAmnjBH/N54f5A0jMbaus41K4VxLA0SX8piI8xHTKOn3ykiyn2DcDUxKetbWNADGDfsJueSIt04P8VMRncs0mGFujwClkDda6xcMuCT7DGIAUf7Zs17iQw99I4isZG6C12vM7Fmm61qhU4EenYN+pP1Zc8dTccmgW/QJzZ5bxoG6dKshxXWh9EuEw2Jw+cSo0TMdL1BcYyLCClDz0IToMr6YQQSdBSITm935Lr+TI35FpoJ7aTHuwSRc6qp7VOrqrGfUFTHFr7LnEOSIUqEu6D0nKBuH1+fCXV54zWwXgDZo1/9+99Or8knnF6dqbDvau85ifweJ5H3xSfRQBR2PV8Gp3BiMSj+NN3hs7ps+/Ovq1bVbmuAfxIhqf4Fa+TO50aeeCM37Hhpq7PjwWz79pc2Gc4dZEiAD5merFOi+XaihUMnWudbW90nb8qrVGVbbioSPejEPF57Irc1kYrfmqjHNfKFzx891XwWolQBtLLRP52NA2p58n20HLQuhH217L+REwNK2b679PwOckZSNi9g3kkdxyBLi5W9dwh48FvPOwTcKqKBO5rOjWc87ifo9rzDKVqY9Wdv1b3+z0Kw/Ac=</diagram></mxfile>" style="background-color: rgb(255, 255, 255);"> <defs/> <g> - <path d="M 79.5 79.5 L 79.5 190.32" fill="none" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" pointer-events="stroke"/> - <path d="M 79.5 197.82 L 77 190.32 L 82 190.32 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" pointer-events="all"/> - <path d="M 439.5 79.5 L 439.5 190.32" fill="none" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" pointer-events="stroke"/> - <path d="M 439.5 197.82 L 437 190.32 L 442 190.32 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" pointer-events="all"/> - <rect x="19.5" y="19.5" width="480" height="60" fill="#e6e6e6" stroke="#666666" stroke-width="1.5" pointer-events="all"/> + <rect x="19.5" y="19.5" width="600" height="60" fill="#e6e6e6" stroke="#666666" stroke-width="1.5" pointer-events="all"/> <g transform="translate(-0.5 -0.5)scale(1.5)"> <switch> <foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"> - <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 318px; height: 1px; padding-top: 33px; margin-left: 14px;"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 398px; height: 1px; padding-top: 33px; margin-left: 14px;"> <div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"> <div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"> - Backend + Backends </div> </div> </div> </foreignObject> - <text x="173" y="37" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle"> - Backend + <text x="213" y="37" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle"> + Backends </text> </switch> </g> - <rect x="199.5" y="109.5" width="120" height="60" fill="#e6e6e6" stroke="#666666" stroke-width="1.5" pointer-events="all"/> + <rect x="259.5" y="154.5" width="120" height="60" fill="#e6e6e6" stroke="#666666" stroke-width="1.5" pointer-events="all"/> <g transform="translate(-0.5 -0.5)scale(1.5)"> <switch> <foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"> - <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 93px; margin-left: 134px;"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 123px; margin-left: 174px;"> <div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"> <div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"> Services @@ -34,20 +30,52 @@ </div> </div> </foreignObject> - <text x="173" y="97" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle"> + <text x="213" y="127" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle"> Services </text> </switch> </g> - <path d="M 139.5 229.5 L 190.32 229.5" fill="none" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" pointer-events="stroke"/> - <path d="M 197.82 229.5 L 190.32 232 L 190.32 227 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" pointer-events="all"/> - <path d="M 109.5 199.5 L 191.86 144.59" fill="none" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" pointer-events="stroke"/> - <path d="M 198.1 140.43 L 193.25 146.67 L 190.48 142.51 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" pointer-events="all"/> - <rect x="19.5" y="199.5" width="120" height="60" fill="#e6e6e6" stroke="#666666" stroke-width="1.5" pointer-events="all"/> + <path d="M 139.5 274.5 L 250.32 274.5" fill="none" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" pointer-events="stroke"/> + <path d="M 257.82 274.5 L 250.32 277 L 250.32 272 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" pointer-events="all"/> <g transform="translate(-0.5 -0.5)scale(1.5)"> <switch> <foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"> - <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 153px; margin-left: 14px;"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 183px; margin-left: 133px;"> + <div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"> + <div style="display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"> + Provide + </div> + </div> + </div> + </foreignObject> + <text x="133" y="186" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="9px" text-anchor="middle"> + Provide + </text> + </switch> + </g> + <path d="M 109.5 244.5 L 250.98 187.91" fill="none" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" pointer-events="stroke"/> + <path d="M 257.94 185.12 L 251.91 190.23 L 250.05 185.59 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" pointer-events="all"/> + <g transform="translate(-0.5 -0.5)scale(1.5)"> + <switch> + <foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 143px; margin-left: 123px;"> + <div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"> + <div style="display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"> + Use + </div> + </div> + </div> + </foreignObject> + <text x="123" y="146" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="9px" text-anchor="middle"> + Use + </text> + </switch> + </g> + <rect x="19.5" y="244.5" width="120" height="60" fill="#e6e6e6" stroke="#666666" stroke-width="1.5" pointer-events="all"/> + <g transform="translate(-0.5 -0.5)scale(1.5)"> + <switch> + <foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 183px; margin-left: 14px;"> <div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"> <div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"> Plugins @@ -55,16 +83,16 @@ </div> </div> </foreignObject> - <text x="53" y="157" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle"> + <text x="53" y="187" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle"> Plugins </text> </switch> </g> - <rect x="199.5" y="199.5" width="120" height="60" fill="#e6e6e6" stroke="#666666" stroke-width="1.5" pointer-events="all"/> + <rect x="259.5" y="244.5" width="120" height="60" fill="#e6e6e6" stroke="#666666" stroke-width="1.5" pointer-events="all"/> <g transform="translate(-0.5 -0.5)scale(1.5)"> <switch> <foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"> - <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 153px; margin-left: 134px;"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 183px; margin-left: 174px;"> <div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"> <div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"> Extension Points @@ -72,20 +100,52 @@ </div> </div> </foreignObject> - <text x="173" y="157" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle"> + <text x="213" y="187" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle"> Extension Poi... </text> </switch> </g> - <path d="M 379.5 229.5 L 328.68 229.5" fill="none" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" pointer-events="stroke"/> - <path d="M 321.18 229.5 L 328.68 227 L 328.68 232 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" pointer-events="all"/> - <path d="M 409.5 199.5 L 327.14 144.59" fill="none" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" pointer-events="stroke"/> - <path d="M 320.9 140.43 L 328.52 142.51 L 325.75 146.67 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" pointer-events="all"/> - <rect x="379.5" y="199.5" width="120" height="60" fill="#e6e6e6" stroke="#666666" stroke-width="1.5" pointer-events="all"/> + <path d="M 499.5 274.5 L 388.68 274.5" fill="none" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" pointer-events="stroke"/> + <path d="M 381.18 274.5 L 388.68 272 L 388.68 277 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" pointer-events="all"/> <g transform="translate(-0.5 -0.5)scale(1.5)"> <switch> <foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"> - <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 153px; margin-left: 254px;"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 183px; margin-left: 293px;"> + <div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"> + <div style="display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"> + Call + </div> + </div> + </div> + </foreignObject> + <text x="293" y="186" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="9px" text-anchor="middle"> + Call + </text> + </switch> + </g> + <path d="M 529.5 244.5 L 388.02 187.91" fill="none" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" pointer-events="stroke"/> + <path d="M 381.06 185.12 L 388.95 185.59 L 387.09 190.23 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" pointer-events="all"/> + <g transform="translate(-0.5 -0.5)scale(1.5)"> + <switch> + <foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 143px; margin-left: 303px;"> + <div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"> + <div style="display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"> + Use + </div> + </div> + </div> + </foreignObject> + <text x="303" y="146" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="9px" text-anchor="middle"> + Use + </text> + </switch> + </g> + <rect x="499.5" y="244.5" width="120" height="60" fill="#e6e6e6" stroke="#666666" stroke-width="1.5" pointer-events="all"/> + <g transform="translate(-0.5 -0.5)scale(1.5)"> + <switch> + <foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 183px; margin-left: 334px;"> <div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"> <div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"> Modules @@ -93,19 +153,71 @@ </div> </div> </foreignObject> - <text x="293" y="157" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle"> + <text x="373" y="187" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle"> Modules </text> </switch> </g> - <path d="M 259.5 79.5 L 259.5 100.32" fill="none" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" stroke-dasharray="1.5 1.5" pointer-events="stroke"/> - <path d="M 259.5 107.82 L 257 100.32 L 262 100.32 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" pointer-events="all"/> + <path d="M 78.9 81.9 L 79.47 235.32" fill="none" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" pointer-events="stroke"/> + <path d="M 79.49 242.82 L 76.97 235.33 L 81.97 235.31 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" pointer-events="all"/> + <g transform="translate(-0.5 -0.5)scale(1.5)"> + <switch> + <foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 109px; margin-left: 53px;"> + <div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"> + <div style="display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"> + Install + </div> + </div> + </div> + </foreignObject> + <text x="53" y="112" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="9px" text-anchor="middle"> + Install + </text> + </switch> + </g> + <path d="M 559.5 80.7 L 559.5 235.32" fill="none" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" pointer-events="stroke"/> + <path d="M 559.5 242.82 L 557 235.32 L 562 235.32 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" pointer-events="all"/> + <g transform="translate(-0.5 -0.5)scale(1.5)"> + <switch> + <foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 108px; margin-left: 373px;"> + <div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"> + <div style="display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"> + Install + </div> + </div> + </div> + </foreignObject> + <text x="373" y="111" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="9px" text-anchor="middle"> + Install + </text> + </switch> + </g> + <path d="M 319.5 79.5 L 319.5 145.32" fill="none" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" stroke-dasharray="4.5 4.5" pointer-events="stroke"/> + <path d="M 319.5 152.82 L 317 145.32 L 322 145.32 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="1.5" stroke-miterlimit="10" pointer-events="all"/> + <g transform="translate(-0.5 -0.5)scale(1.5)"> + <switch> + <foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 78px; margin-left: 213px;"> + <div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"> + <div style="display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"> + Provide + </div> + </div> + </div> + </foreignObject> + <text x="213" y="81" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="9px" text-anchor="middle"> + Provide + </text> + </switch> + </g> </g> <switch> <g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/> <a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"> <text text-anchor="middle" font-size="10px" x="50%" y="100%"> - Viewer does not support full SVG 1.1 + Text is not SVG - cannot display </text> </a> </switch> diff --git a/docs/backend-system/architecture/01-index.md b/docs/backend-system/architecture/01-index.md index e3354112fb..88ba3262df 100644 --- a/docs/backend-system/architecture/01-index.md +++ b/docs/backend-system/architecture/01-index.md @@ -6,16 +6,14 @@ sidebar_label: System Architecture description: The structure and architecture of the new Backend System and its component parts --- -# Overview +## Building Blocks This section introduces the high-level building blocks upon which this new system is built. These are all concepts that exist in our current system in one way or another, but they have all been lifted up to be first class concerns in -the new system. - -## Building Blocks - -This section introduces the high-level building blocks upon which this new system is built. Regardless of whether you are setting up your own backstage instance, developing plugins, or extending plugins with new features, it is important to understand these concepts. +the new system. Regardless of whether you are setting up your own backstage +instance, developing plugins, or extending plugins with new features, it is +important to understand these concepts. The diagram below provides an overview of the different building blocks, and the other blocks that each of them interact with. @@ -37,7 +35,7 @@ Plugins provide the actual features, just like in our existing system. They oper Services provide utilities to help make it simpler to implement plugins, so that each plugin doesn't need to implement everything from scratch. There are both many built-in services, like the ones for logging, database access, and reading configuration, but you can also import third-party services, or create your own. -Services are also a customization point for individual backend installations. You can both override services with your own implementations, as well as make smaller customizations to existing services. +Services are also a customization point for individual backend installations. You can override services with your own implementations, as well as make smaller customizations to existing services. ### Extension Points @@ -45,7 +43,7 @@ Many plugins have ways in which you can extend them, for example entity provider Extension Points look a little bit like services, since you depended on them just like you would a service. A key difference is that extension points are registered and provided by plugins themselves, based on what customizations each individual plugin wants to expose. -Extension Points are also exported separately from the plugin instance itself, and a single plugin can also expose multiple different extension points at once. This makes it easier to evolve and deprecated individual Extension Points over time, rather than dealing with a single large API surface. +Extension Points are also exported separately from the plugin instance itself, and a single plugin can also expose multiple different extension points at once. This makes it easier to evolve and deprecate individual Extension Points over time, rather than dealing with a single large API surface. ### Modules @@ -53,22 +51,20 @@ Modules use the plugin Extension Points to add new features for plugins. They mi Each module may only extend a single plugin, and the module must be deployed together with that plugin in the same backend instance. Modules may however only communicate with their plugin through its registered extension points. -Just like plugins, modules also have access to services and can depend on their own service implementations. They will however share services with the plugin that they extend, there are no module-specific service implementations. +Just like plugins, modules also have access to services and can depend on their own service implementations. They will however share services with the plugin that they extend - there are no module-specific service implementations. ## Package structure A detailed explanation of the package architecture can be found in the [Backstage Architecture Overview](../../overview/architecture-overview.md#package-architecture). The -most important packages to consider for this system are `backend`, -`plugin-<pluginId>-backend`, `plugin-<pluginId>-node`, and -`plugin-<pluginId>-backend-module-<moduleId>`. +most important packages to consider for this system are the following: - `plugin-<pluginId>-backend` houses the implementation of the backend plugins themselves. -- `plugin-<pluginId>-node` houses the extension points and any other utilities +- `plugin-<pluginId>-node` houses the backend plugin's extension points and any other utilities that modules or other plugins might need. - `plugin-<pluginId>-backend-module-<moduleId>` houses the modules that extend - the plugins via the extension points. + the plugin via its extension points. - `backend` is the backend itself that wires everything together to something that you can deploy. diff --git a/docs/backend-system/architecture/03-services.md b/docs/backend-system/architecture/03-services.md index 27fea27db9..96b82d7e95 100644 --- a/docs/backend-system/architecture/03-services.md +++ b/docs/backend-system/architecture/03-services.md @@ -1,103 +1,227 @@ --- id: services -title: Backend Service APIs -sidebar_label: Service APIs +title: Backend Services +sidebar_label: Services # prettier-ignore -description: Service APIs for backend plugins +description: Services for backend plugins --- -## Backend Services +Backend services provide shared functionality available to all backend plugins and modules. They are made available through service references that embed a type that represents the service interface, similar to how [Utility APIs](../../api/utility-apis.md) work in the Backstage frontend system. To use a service in your plugin or module you request an implementation of that service using the service reference. -The default backend provides several [core services](https://github.com/backstage/backstage/blob/master/packages/backend-plugin-api/src/services/definitions/coreServices.ts) out of the box which includes access to configuration, logging, databases and more. -Service dependencies are declared using their `ServiceRef`s in the `deps` section of the plugin or module, and the implementations are then forwarded to the `init` method of the plugin or module. +The system surrounding services exists to provide a level of indirection between the service interfaces and their implementation. It is an implementation of dependency injection, where each backend instance is the dependency injection container. The implementation for each service is provided by a service factory, which encapsulates the logic for how each service instance is created. -### Service References +## Service Interfaces -A `ServiceRef` is a named reference to an interface which are later used to resolve the concrete service implementation. Conceptually this is very similar to `ApiRef`s in the frontend. -Services is what provides common utilities that previously resided in the `PluginEnvironment` such as Config, Logging and Database. +Service interfaces can be any TypeScript type, but it is best to make it an object interface with a number of methods. General guidelines for interface design apply: keep them simple and lean, with few but powerful methods. Take care to avoid locking down the ways in which individual methods can evolve. Often you want to stick to a method with an options object as its only parameter, and return a result object. If there is any reason for uncertainty about whether the method should be async or not, always make it async. For example, a minimal interface should often use the following pattern: -On startup the backend will make sure that the services are initialized before being passed to the plugin/module that depend on them. -ServiceRefs contain a scope which is used to determine if the serviceFactory creating the service will create a new instance scoped per plugin/module or if it will be shared. `plugin` scoped services will be created once per plugin/module and `root` scoped services will be created once per backend instance. +```ts +export interface FooService { + foo(options: FooOptions): Promise<FooResult>; +} +``` -#### Defining a Service +## Service References + +Once you have defined a service interface, you need to create a service reference using the `createServiceRef` function. This will create a `ServiceRef` instance, which is a reference that you export in order to allow users to interact with your service. Conceptually this is very similar to `ApiRef`s in the frontend system. For example: + +```ts +import { createServiceRef } from '@backstage/backend-plugin-api'; + +export interface FooService { + foo(options: FooOptions): Promise<FooResult>; +} + +export const fooServiceRef = createServiceRef<FooService>({ + id: 'example.foo', // the owner of this service is in this case the 'example' plugin +}); +``` + +The `fooServiceRef` that we create above should be exported, and can then be used to declare a dependency on the `FooService` interface and receive an implementation of it at runtime. + +When creating a service reference you need to give it an ID. This ID needs to be globally unique, and should generally be of the format `'<pluginId>.<serviceName>'`. For more naming patters surrounding services, see the [naming patterns](./07-naming-patterns.md#services) page. + +A note on naming: the frontend and backend systems intentionally use the separate names "APIs" and "Services" for concepts that are quite similar. This is to avoid confusion between the two, both in documentation and discussion, but also in code. While the two systems are quite similar, they are not identical, and they can't be used interchangeably. + +## Service Factories + +In order to be able to depend on a service interface through a service reference, we of course also need to have some way of creating the concrete implementation of it. To encapsulate that logic we use service factories, which define both how service instances are created, as well as what other services they depend on for their implementation. + +Service factories can come from many different sources. There are built-in service factories, external ones that you can import from other packages, and you can also create your own. Specific service factories are installed within each backend instance, which acts as the dependency injection container. For any given backend instance there can only be a single designated service factory for each service. + +To define a service factory, we use `createServiceFactory`: + +```ts +import { createServiceFactory } from '@backstage/backend-plugin-api'; + +class DefaultFooService implements FooService { + async foo(options: FooOptions): Promise<FooResult> { + // ... + } +} + +export const fooFactory = createServiceFactory({ + service: fooServiceRef, + deps: { bar: barServiceRef }, + factory({ bar }) { + return new DefaultFooService(bar); + }, +}); +``` + +To create a service factory we need to provide a reference to the `service` for which the factory will create instances, a `deps` object which lists the other services that the factory depends on, and a `factory` function which will be called to create the service instance. The backend system will call the `factory` function with an object that contains the service instances for each of the dependencies listed in the `deps` object. If a service implementation does not depend on any other services, the `deps` are left as an empty object (`{}`). The `factory` function must return a value that implements the service interface. + +If you need the creation of the service instance to be asynchronous, you can make the `factory` function async. For example: + +```ts +export const fooFactory = createServiceFactory({ + service: fooServiceRef, + deps: {}, + async factory() { + const foo = new DefaultFooService(); + await foo.init(); + return foo; + }, +}); +``` + +Note that circular dependencies among service factories are not allowed. This is verified at runtime, and your backend instance will refuse to start up if it detects any conflicts. Likewise, the backend will also fail to start up if a service factory depends on a service that is not provided by any registered service factory. + +## Service Factory Options + +To install a service factory in a backend instance, we pass it in through the `services` option to `createBackend`: + +```ts +const backend = createBackend({ + services: [fooFactory()], +}); +``` + +Note that we call `fooFactory` to create the service factory instance. This is because `createServiceFactory` always returns a factory function that creates the actual service factory. This is done to always allow for options to be added to the service factory in the future, without breaking existing code. To add options to your service factory, you wrap the object passed to `createServiceFactory` in a callback that accepts the desired options. For example: + +```ts +export interface FooFactoryOptions { + mode: 'eager' | 'lazy'; +} + +export const fooFactory = createServiceFactory( + (options?: FooFactoryOptions) => ({ + service: fooServiceRef, + deps: { bar: barServiceRef }, + factory({ bar }) { + return new DefaultFooService(bar, options?.mode); + }, + }), +); +``` + +This lets us use the options to customize the factory implementation in any way we want. From the outside the service factory looks just like before, except that we're now also able to pass options when installing the factory: + +```ts +const backend = createBackend({ + services: [fooFactory({ mode: 'eager' })], +}); +``` + +## Core Services + +The backend system provides a number of core service definitions that both help implement the main functionality of the backend, but also provide a set of utilities for common concerns, such as logging, database access, job scheduling, and so on. These core services will always be present in a backend instance created with `createBackend`, and they can all be overridden with custom implementations if needed. + +The service references for all core services are exported via their own `coreServices` object, available from the `@backstage/backend-plugin-api` package. For example, the logging service is accessible via `coreServices.logger`. + +You can read more about what core services there are and how to use them in the [core services](../core-services/01-index.md) section. + +## Service Scope + +By default services are scoped to individual plugins, meaning that separate instances of the service will be created for each plugin. For example, in our `fooFactory` above, a separate instance of `DefaultFooService` will be created for every plugin that depends on the service. This both makes it possible to tailor the service implementations for the individual plugins, and also ensures some level of separation between plugins. + +The service scope is defined during the call to `createServiceRef`, with plugin scope being the default. Our above definition of the `fooServiceRef` is therefore equivalent to the following: + +```ts +export const fooServiceRef = createServiceRef<FooService>({ + scope: 'plugin', + id: 'example.foo', +}); +``` + +There are only two possible scopes for services, `'plugin'` and `'root'`. + +## Root Scoped Services + +If a service is defined as a root scoped service, the implementation created by the factory will be shared across all plugins and services. One other differentiating factory for root scoped services is that they are always initialized, regardless of whether any plugins depend on them or not. This makes them suitable for implementing backend-wide concerns that are not specific to any individual plugin. + +There is a limitation in the usage of root scoped services, which is that their implementation can only depend on other root scoped services. Plugin scoped services on the other hand can depend on both root and plugin scoped services. Because of this limitation, one of the main reasons to define a root scoped services is to make it possible for other root scoped services to depend on it. + +Because of these limitations and particular use-cases for root scoped services, they tend to be more rare than plugin scoped services. In general, you should prefer defining a service as plugin scoped, unless you are implementing either of the two mentioned use-cases. + +Some services come in pairs of a plugin and a root scoped service definition. For example, the `rootLogger` service is a root scoped service, while the `logger` service is a plugin scoped service. The `rootLogger` service houses the main logging implementation, while the `logger` service simply builds upon the `rootLogger` to add plugin specific labels. This division exists so that other root scoped services also have access to a logging service, but it is always preferable if the split can be avoided. If you do end up implementing this pattern, the root scoped service should be prefixed with `root`, this is to encourage use of the plugin scoped service instead. + +## Plugin Metadata + +Plugin scoped services have access to a plugin metadata service, which is a special service provided by the backend system that is not possible to override. The plugin metadata service provides information about the plugin that a service instance is being created for. It is itself a plugin scoped service, and can be depended on like any other service through the `coreServices.pluginMetadata` reference. + +The plugin metadata service is the base for all plugin specific customizations for services. For example, the default implementation of the plugin scoped logger service uses the plugin metadata service to attach the plugin ID as a field in all log messages: + +```ts +export const loggerFactory = createServiceFactory({ + service: coreServices.logger, + deps: { + rootLogger: coreServices.rootLogger, + pluginMetadata: coreServices.pluginMetadata, + }, + factory({ rootLogger, pluginMetadata }) { + return rootLogger.child({ plugin: pluginMetadata.getId() }); + }, +}); +``` + +## Root Context for Service Factories + +Some services may benefit from having a context that is shared across all instances of a service. This of course only applies to plugin scoped services, as root scoped services only ever have a single instance. The root context could for example be used for sharing a common connection pool for database access, generated secrets for development, or any other kind of shared facility. Note that you should not use this to share state between plugins in production, as that would be a violation of the [plugin isolation rule](./04-plugins.md#rules-of-plugins). + +The root context is defined as part of the service factory by passing the `createRootContext` option: + +```ts +export const fooFactory = createServiceFactory({ + service: fooServiceRef, + deps: { rootLogger: coreServices.rootLogger, bar: barServiceRef }, + createRootContext({ rootLogger }) { + return new FooRootContext(rootLogger); + } + factory({ bar }, ctx) { + return ctx.forPlugin(bar) + }, +}); +``` + +Whatever value is returned by the `createRootContext` function will shared and passed as the second argument to each invocation of the `factory` function. That way you can create a shared context that is used in the creation of each plugin instance. Unlike the `factory` function, the `createRootContext` function will only receive root scoped services as its dependencies, but just like the `factory` function, it can also be `async`. + +## Default Service Factories + +There are a lot of services that are installed in any standard Backstage backend instance by default. You can expect these services to always exist, and do not need to take any additional steps to make them available. This is not necessarily true for services that you import from external packages, as the user of your plugin or module might not have installed a factory for that service in their backend. In order to avoid having to ask integrators of your plugin to install a service factory for a service that you depend on, it is possible to define a default factory for a service. + +Default service factories are defined as part of the service reference by passing the `defaultFactory` option to `createServiceRef`: ```ts import { createServiceFactory, - coreServices, + createServiceRef, } from '@backstage/backend-plugin-api'; -import { ExampleImpl } from './ExampleImpl'; -export interface ExampleApi { - doSomething(): Promise<void>; -} - -export const exampleServiceRef = createServiceRef<ExampleApi>({ - id: 'example', - scope: 'plugin', // can be 'root' or 'plugin' - - // The defaultFactory is optional to implement but it will be used if no - // other factory is provided to the backend. This allows for the backend - // to provide a default implementation of the service without having to wire - // it beforehand. +export const fooServiceRef = createServiceRef<FooService>({ + id: 'example.foo', defaultFactory: async service => createServiceFactory({ service, - deps: { - logger: coreServices.logger, - plugin: coreServices.pluginMetadata, - }, - // This root context method is only available for plugin scoped services. - // It's only called once per backend instance. - // Logger is available at the root context level as it's also a root - // scoped service. - createRootContext({ logger }) { - return new ExampleImplFactory({ logger }); - }, - // Plugin is available as it's a plugin scoped service and will be - // created once per plugin. The logger can be had here too if needed. - // Both this anc the root context can also be async. - factory({ logger, plugin }, rootContext) { - // This block will be executed once for every plugin that depends on - // this service - logger.info('Initializing example service plugin instance'); - return rootContext.forPlugin(plugin.getId()); + deps: {}, + factory() { + return new DefaultFooService(); }, }), }); ``` -### Overriding Services +Note that we don't use the `fooServiceRef` when creating our service factory, but instead use the `service` parameter in the default factory callback. This is because attempting to use `fooServiceRef` directly would result in a circular reference. -In this example we replace the default root logger service implementation with a custom one that streams logs to GCP. The `rootLoggerServiceRef` has a `'root'` scope, meaning there are no plugin-specific instances of this service. +If a service defines a default factory, that factory will be used if there is no explicit factory registered in the backend for that service. This allows users of your service to directly import and use a service, without worrying about whether it is installed or not. It is recommended to always define a default factory for any service that you are exporting for use in other plugins or modules. -```ts -import { - createServiceFactory, - rootLoggerServiceRef, - LoggerService, -} from '@backstage/backend-plugin-api'; - -// This custom implementation would typically live separately from -// the backend setup code, either nearby such as in -// packages/backend/src/services/logger/GoogleCloudLogger.ts -// Or you can let it live in its own library package. -class GoogleCloudLogger implements LoggerService { - static factory = createServiceFactory({ - service: rootLoggerServiceRef, - deps: {}, - factory() { - return new GoogleCloudLogger(); - }, - }); - // custom implementation here ... -} - -// packages/backend/src/index.ts -const backend = createBackend({ - services: [ - // supplies additional or replacement services to the backend - GoogleCloudLogger.factory(), - ], -}); -``` +When defining a default factory for a service, it is possible for it to end up with duplicate implementations at runtime. This applies both to any shared root context in your factory, as well as plugin specific instances of your service. This is because package dependency version ranges may not line up perfectly, causing duplicate installations of the same package. This can happen both for two different plugins using the same service, but also across a plugin and its modules. If your service would break in this scenario, you should not define a default factory for it, but instead require that users of your service explicitly install a factory in their backend instance. diff --git a/docs/backend-system/building-plugins-and-modules/01-index.md b/docs/backend-system/building-plugins-and-modules/01-index.md index 05908e59cb..01e35036aa 100644 --- a/docs/backend-system/building-plugins-and-modules/01-index.md +++ b/docs/backend-system/building-plugins-and-modules/01-index.md @@ -16,6 +16,12 @@ Backend [plugins](../architecture/04-plugins.md) and backend _features_, are the building blocks that adopters add to their [backends](../architecture/02-backends.md). +## Creating a new Plugin + +This guide assumes that you already have a Backend project set up. Even if you only want to develop a single plugin for publishing, we still recommend that you do so in a standard Backstage monorepo project, as you often end up needing multiple packages. For instructions on how to set up a new project, see our [getting started](../../getting-started/index.md#prerequisites) documentation. + +To create a Backend plugin, run `yarn new`, select `backend-plugin`, and fill out the rest of the prompts. This will create a new package at `plugins/<pluginId>-backend`, which will be the main entrypoint for your plugin. + ## Plugins A basic backend plugin might look as follows: diff --git a/docs/backend-system/index.md b/docs/backend-system/index.md index ca13bc188c..de598167ae 100644 --- a/docs/backend-system/index.md +++ b/docs/backend-system/index.md @@ -3,7 +3,7 @@ id: index title: The Backend System sidebar_label: Overview # prettier-ignore -description: The backend system +description: The Backend System --- > **DISCLAIMER: The new backend system is under active development and is not considered stable** @@ -12,4 +12,4 @@ description: The backend system The new backend system is under active development, and only a small number of plugins have been migrated so far. It is possible to try it out, but it is not recommended to use this new system in production yet. -You can find an example backend setup in [the backend-next package](https://github.com/backstage/backstage/tree/master/packages/backend-next). +You can find an example backend setup in [the `backend-next` package](https://github.com/backstage/backstage/tree/master/packages/backend-next). diff --git a/docs/features/search/how-to-guides.md b/docs/features/search/how-to-guides.md index eb162ce527..6f113630f6 100644 --- a/docs/features/search/how-to-guides.md +++ b/docs/features/search/how-to-guides.md @@ -210,3 +210,156 @@ const highlightOverride = { [obj-mode]: https://nodejs.org/dist/latest-v16.x/docs/api/stream.html#stream_object_mode [read-stream]: https://nodejs.org/dist/latest-v16.x/docs/api/stream.html#readable-streams [async-gen]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of#iterating_over_async_generators + +## How to render search results using extensions + +Extensions for search results let you customize components used to render search result items, It is possible to provide your own search result item extensions or use the ones provided by plugin packages: + +### 1. Providing an extension in your plugin package + +Using the example below, you can provide an extension to be used as a default result item: + +```tsx +// plugins/your-plugin/src/plugin.ts +import { createPlugin } from '@backstage/core-plugin-api'; +import { createSearchResultListItemExtension } from '@backstage/plugin-search-react'; + +const plugin = createPlugin({ id: 'YOUR_PLUGIN_ID' }); + +export const YourSearchResultListItemExtension = plugin.provide( + createSearchResultListItemExtension({ + name: 'YourSearchResultListItem', + component: () => + import('./components').then(m => m.YourSearchResultListItem), + }), +); +``` + +Additionally, you can define a predicate function that receives a result and returns whether your extension should be used to render it or not: + +```tsx +// plugins/your-plugin/src/plugin.ts +import { createPlugin } from '@backstage/core-plugin-api'; +import { createSearchResultListItemExtension } from '@backstage/plugin-search-react'; + +const plugin = createPlugin({ id: 'YOUR_PLUGIN_ID' }); + +export const YourSearchResultListItemExtension = plugin.provide( + createSearchResultListItemExtension({ + name: 'YourSearchResultListItem', + component: () => + import('./components').then(m => m.YourSearchResultListItem), + // Only results matching your type will be rendered by this extension + predicate: result => result.type === 'YOUR_RESULT_TYPE', + }), +); +``` + +Remember to export your new extension: + +```tsx +// plugins/your-plugin/src/index.ts +export { YourSearchResultListItem } from './plugin.ts'; +``` + +For more details, see the [createSearchResultListItemExtension](https://backstage.io/docs/reference/plugin-search-react.createsearchresultlistitemextension) API reference. + +### 2. Using an extension in your Backstage app + +Now that you know how a search result item is provided, let's finally see how they can be used, for example, to compose a page in your application: + +```tsx +// packages/app/src/components/searchPage.tsx +import React from 'react'; + +import { Grid, Paper } from '@material-ui/core'; +import BuildIcon from '@material-ui/icons/Build'; + +import { + Page, + Header, + Content, + DocsIcon, + CatalogIcon, +} from '@backstage/core-components'; +import { SearchBar, SearchResult } from '@backstage/plugin-search-react'; + +// Your search result item extension +import { YourSearchResultListItem } from '@backstage/your-plugin'; + +// Extensions provided by other plugin developers +import { ToolSearchResultListItem } from '@backstage/plugin-explore'; +import { TechDocsSearchResultListItem } from '@backstage/plugin-techdocs'; +import { CatalogSearchResultListItem } from '@internal/plugin-catalog-customized'; + +// This example omits other components, like filter and pagination +const SearchPage = () => ( + <Page themeId="home"> + <Header title="Search" /> + <Content> + <Grid container direction="row"> + <Grid item xs={12}> + <Paper> + <SearchBar /> + </Paper> + </Grid> + <Grid item xs={12}> + <SearchResult> + <YourSearchResultListItem /> + <CatalogSearchResultListItem icon={<CatalogIcon />} /> + <TechDocsSearchResultListItem icon={<DocsIcon />} /> + <ToolSearchResultListItem icon={<BuildIcon />} /> + </SearchResult> + </Grid> + </Grid> + </Content> + </Page> +); + +export const searchPage = <SearchPage />; +``` + +> **Important**: A default result item extension should be placed as the last child, so it can be used only when no other extensions match the result being rendered. If a non-default extension is specified, the `DefaultResultListItem` component will be used. + +As another example, here's a search modal that renders results with extensions: + +```tsx +// packages/app/src/components/searchModal.tsx +import React from 'react'; + +import { DialogContent, DialogTitle, Paper } from '@material-ui/core'; +import BuildIcon from '@material-ui/icons/Build'; + +import { DocsIcon, CatalogIcon } from '@backstage/core-components'; +import { SearchBar, SearchResult } from '@backstage/plugin-search-react'; + +// Your search result item extension +import { YourSearchResultListItem } from '@backstage/your-plugin'; + +// Extensions provided by other plugin developers +import { ToolSearchResultListItem } from '@backstage/plugin-explore'; +import { TechDocsSearchResultListItem } from '@backstage/plugin-techdocs'; +import { CatalogSearchResultListItem } from '@internal/plugin-catalog-customized'; + +export const SearchModal = ({ toggleModal }: { toggleModal: () => void }) => ( + <> + <DialogTitle> + <Paper> + <SearchBar /> + </Paper> + </DialogTitle> + <DialogContent> + <SearchResult onClick={toggleModal}> + <CatalogSearchResultListItem icon={<CatalogIcon />} /> + <TechDocsSearchResultListItem icon={<DocsIcon />} /> + <ToolSearchResultListItem icon={<BuildIcon />} /> + {/* As a "default" extension, it does not define a predicate function, + so it must be the last child to render results that do not match the above extensions */} + <YourSearchResultListItem /> + </SearchResult> + </DialogContent> + </> +); +``` + +There are other more specific search results layout components that also accept result item extensions, check their documentation: [SearchResultList](https://backstage.io/storybook/?path=/story/plugins-search-searchresultlist--with-result-item-extensions) and [SearchResultGroup](https://backstage.io/storybook/?path=/story/plugins-search-searchresultgroup--with-result-item-extensions). diff --git a/docs/features/software-templates/writing-custom-field-extensions.md b/docs/features/software-templates/writing-custom-field-extensions.md index be00453795..20575a0b4a 100644 --- a/docs/features/software-templates/writing-custom-field-extensions.md +++ b/docs/features/software-templates/writing-custom-field-extensions.md @@ -35,7 +35,7 @@ import FormControl from '@material-ui/core/FormControl'; /* This is the actual component that will get rendered in the form */ -export const ValidateKebabCaseExtension = ({ +export const ValidateKebabCase = ({ onChange, rawErrors, required, @@ -96,7 +96,7 @@ import { import { ValidateKebabCase, validateKebabCaseValidation, -} from './ValidateKebabCase'; +} from './ValidateKebabCase/ValidateKebabCaseExtension'; export const ValidateKebabCaseFieldExtension = scaffolderPlugin.provide( createScaffolderFieldExtension({ @@ -173,7 +173,7 @@ spec: title: Name type: string description: My custom name for the component - ui:field: ValidateKebabCaseExtension + ui:field: ValidateKebabCase steps: [...] ``` diff --git a/docs/features/techdocs/configuration.md b/docs/features/techdocs/configuration.md index 097d31f760..38a0143bea 100644 --- a/docs/features/techdocs/configuration.md +++ b/docs/features/techdocs/configuration.md @@ -49,7 +49,7 @@ techdocs: # will be broken in these scenarios. legacyCopyReadmeMdToIndexMd: false - # techdocs.builder can be either 'local' or 'external. + # techdocs.builder can be either 'local' or 'external'. # Using the default build strategy, if builder is set to 'local' and you open a TechDocs page, # techdocs-backend will try to generate the docs, publish to storage and show the generated docs afterwords. # This is the "Basic" setup of the TechDocs Architecture. diff --git a/docs/features/techdocs/using-cloud-storage.md b/docs/features/techdocs/using-cloud-storage.md index f38a806413..aaf2758241 100644 --- a/docs/features/techdocs/using-cloud-storage.md +++ b/docs/features/techdocs/using-cloud-storage.md @@ -230,7 +230,7 @@ If you are deploying Backstage to Amazon EC2, Amazon ECS, or Amazon EKS, you do not need to obtain the access keys separately. They can be made available in the environment automatically by defining appropriate IAM role with access to the bucket. Read more in the -[official AWS documentation for using IAM roles.](https://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html#use-roles). +[official AWS documentation for using IAM roles](https://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html#use-roles). **4b. Authentication using app-config.yaml** diff --git a/docs/integrations/azure/discovery.md b/docs/integrations/azure/discovery.md index 2156f60814..7d53e21a89 100644 --- a/docs/integrations/azure/discovery.md +++ b/docs/integrations/azure/discovery.md @@ -47,6 +47,11 @@ catalog: frequency: { minutes: 30 } # supports ISO duration, "human duration" as used in code timeout: { minutes: 3 } + yourSecondProviderId: # identifies your dataset / provider independent of config changes + organization: myorg + project: '*' # this will match all projects + repository: '*' # this will match all repos + path: /catalog-info.yaml anotherProviderId: # another identifier organization: myorg project: myproject @@ -62,7 +67,7 @@ The parameters available are: - **`host:`** _(optional)_ Leave empty for Cloud hosted, otherwise set to your self-hosted instance host. - **`organization:`** Your Organization slug (or Collection for on-premise users). Required. -- **`project:`** Your project slug. Required. +- **`project:`** _(optional)_ Your project slug. Wildcards are supported as show on the examples above. If not set, all projects will be searched. - **`repository:`** _(optional)_ The repository name. Wildcards are supported as show on the examples above. If not set, all repositories will be searched. - **`path:`** _(optional)_ Where to find catalog-info.yaml files. Defaults to /catalog-info.yaml. - **`schedule`** _(optional)_: @@ -144,7 +149,7 @@ When using a custom pattern, the target is composed of five parts: - The base instance URL, `https://dev.azure.com` in this case - The organization name which is required, `myorg` in this case -- The project name which is required, `myproject` in this case +- The project name which is optional, `myproject` in this case. This defaults to \*, which scans all the projects where the token has access to. - The repository blob to scan, which accepts \* wildcard tokens and must be added after `_git/`. This can simply be `*` to scan all repositories in the project. diff --git a/docs/integrations/gitlab/org.md b/docs/integrations/gitlab/org.md new file mode 100644 index 0000000000..100b2c09fd --- /dev/null +++ b/docs/integrations/gitlab/org.md @@ -0,0 +1,34 @@ +--- +id: org +title: GitLab Organizational Data +sidebar_label: Org Data +description: Importing users and groups from a GitLab organization into Backstage +--- + +The Backstage catalog can be set up to ingest organizational data - users and +teams - directly from an organization in GitLab. The result +is a hierarchy of +[`User`](../../features/software-catalog/descriptor-format.md#kind-user) and +[`Group`](../../features/software-catalog/descriptor-format.md#kind-group) kind +entities that mirror your org setup. + +```yaml +integrations: + gitlab: + - host: gitlab.com + token: ${GITLAB_TOKEN} +``` + +This will query all users and groups from your gitlab installation. Depending on the size +of the Gitlab Instance, this can take some time our resources. + +The token that is used for the Organization Integration, has to be an Admin PAT. + +```yaml +catalog: + providers: + gitlab: + yourProviderId: + host: gitlab.com + orgEnabled: true +``` diff --git a/docs/integrations/ldap/org.md b/docs/integrations/ldap/org.md index dbd3f4ff43..f8b9a18c55 100644 --- a/docs/integrations/ldap/org.md +++ b/docs/integrations/ldap/org.md @@ -37,7 +37,6 @@ schedule it: ```diff // packages/backend/src/plugins/catalog.ts -+import { Duration } from 'luxon'; +import { LdapOrgEntityProvider } from '@backstage/plugin-catalog-backend-module-ldap'; export default async function createPlugin( diff --git a/docs/overview/threat-model.md b/docs/overview/threat-model.md index 57fafd1c28..a6435f8cc5 100644 --- a/docs/overview/threat-model.md +++ b/docs/overview/threat-model.md @@ -28,6 +28,8 @@ Other responsibilities include protecting the integrity of configuration files a The integrator is ultimately responsible for auditing usage of internal and external plugins as these run on the host system and have access to configuration and secrets. When installing plugins from sources like NPM, you should vet these in the same way that you would vet any other package installed from that source. +The integrator is also responsible for maintaining the resolved NPM dependencies of their Backstage project. This involves ensuring that `yarn.lock` receives updated versions of packages that have vulnerabilities, when those fixed versions are in range of what the Backstage packages request in their respective `package.json` files. This is commonly done by employing automated tooling such as [Dependabot](https://dependabot.com/), [Snyk](https://snyk.io/), and/or [Renovate](https://docs.renovatebot.com/) on your own repository. When fixed versions exist that are _not_ in range of what Backstage packages request, or when larger operations such as switching out an entire dependency for another one is required, maintainers collaborate with contributors to try to address those dependency declarations in the main project as soon as possible. + ## Common Backend Configuration There are many common facilities that are configured centrally and available to all Backstage backend plugins. For example there is a `DatabaseManager` that provides access to a SQL database, `TaskScheduler` for scheduling long-running tasks, `Logger` as a general logging facility, and `UrlReader` for reading content from external sources. These are all configured either directly in code, or within the `backend` block of the static configuration. The appropriate care needs to be taken to ensure that any secrets remain confidential and no malicious configuration is injected. diff --git a/docs/releases/v1.11.0-next.1-changelog.md b/docs/releases/v1.11.0-next.1-changelog.md new file mode 100644 index 0000000000..aa9c447149 --- /dev/null +++ b/docs/releases/v1.11.0-next.1-changelog.md @@ -0,0 +1,2164 @@ +# Release v1.11.0-next.1 + +## @backstage/plugin-catalog@1.8.0-next.1 + +### Minor Changes + +- 0c1fc3986c: Added Markdown support in the `AboutCard` description section +- 0eaa579f89: The `CatalogSearchResultListItem` component is now a search result extension. This means that when rendered as a child of components that render search extensions, the `result`, `rank`, and `highlight` properties are optional. See the [documentation](https://backstage.io/docs/features/search/how-to-guides#how-to-render-search-results-using-extensions) for more details. + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-search-react@1.5.0-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration-react@1.1.10-next.0 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-catalog-react@1.3.0-next.1 + +### Minor Changes + +- fab93c2fe8: Aligned buttons on "Unregister entity" dialog to keep them on the same line + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-react@0.4.9 + +## @backstage/plugin-explore@0.4.0-next.1 + +### Minor Changes + +- 0eaa579f89: The `ToolSearchResultListItem` component is now a search result extension. This means that when rendered as a child of components that render search extensions, the `result`, `rank`, and `highlight` properties are optional. See the [documentation](https://backstage.io/docs/features/search/how-to-guides#how-to-render-search-results-using-extensions) for more details. + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-search-react@1.5.0-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-explore-react@0.0.25 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-scaffolder-backend@1.11.0-next.1 + +### Minor Changes + +- 127154930f: Renamed the export `scaffolderCatalogModule` to `catalogModuleTemplateKind` in order to follow the new recommended naming patterns of backend system items. This is technically a breaking change but in an alpha export, so take care to change your imports if you have already migrated to the new backend system. + +### Patch Changes + +- 66cf22fdc4: Updated dependency `esbuild` to `^0.17.0`. +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.11-next.1 + - @backstage/plugin-catalog-node@1.3.3-next.1 + - @backstage/plugin-scaffolder-common@1.2.5-next.0 + - @backstage/plugin-scaffolder-node@0.1.0-next.1 + +## @backstage/plugin-search@1.1.0-next.1 + +### Minor Changes + +- 0eaa579f89: Update `SearchModal` component to use `SearchResult` extensions. + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-search-react@1.5.0-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-search-react@1.5.0-next.0 + +### Minor Changes + +- 0eaa579f89: - Create the search results extensions, for more details see the documentation [here](https://backstage.io/docs/features/search/how-to-guides#how-to-render-search-results-using-extensions); + - Update the `SearchResult`, `SearchResultList` and `SearchResultGroup` components to use extensions and default their props to optionally accept a query, when the query is not passed, the component tries to get it from the search context. + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-tech-insights-node@0.4.0-next.1 + +### Minor Changes + +- 4024b37449: TechInsightsApi interface now has getFactSchemas() method. + TechInsightsClient now implements method getFactSchemas(). + + **BREAKING** FactSchema type moved from @backstage/plugin-tech-insights-node into @backstage/plugin-tech-insights-common + + These changes are **required** if you were importing this type directly. + + ```diff + - import { FactSchema } from '@backstage/plugin-tech-insights-node'; + + import { FactSchema } from '@backstage/plugin-tech-insights-common'; + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-tech-insights-common@0.2.10-next.0 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + +## @backstage/plugin-techdocs@1.5.0-next.1 + +### Minor Changes + +- 20840b36b4: Update DocsTable and EntityListDocsTable to accept overrides for Material Table options. +- 0eaa579f89: The `TechDocsSearchResultListItem` component is now a search result extension. This means that when rendered as a child of components that render search extensions, the `result`, `rank`, and `highlight` properties are optional. See the [documentation](https://backstage.io/docs/features/search/how-to-guides#how-to-render-search-results-using-extensions) for more details. + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-search-react@1.5.0-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/integration-react@1.1.10-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-search-common@1.2.1 + - @backstage/plugin-techdocs-react@1.1.3-next.1 + +## @backstage/app-defaults@1.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-permission-react@0.4.9 + +## @backstage/backend-app-api@0.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/cli-common@0.1.11 + - @backstage/config@1.0.6 + - @backstage/config-loader@1.1.8 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.11-next.1 + - @backstage/plugin-permission-node@0.7.5-next.1 + +## @backstage/backend-common@0.18.2-next.1 + +### Patch Changes + +- 628e2bd89a: Updated dependency `@kubernetes/client-node` to `0.18.1`. +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-app-api@0.3.2-next.1 + - @backstage/cli-common@0.1.11 + - @backstage/config@1.0.6 + - @backstage/config-loader@1.1.8 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + +## @backstage/backend-defaults@0.1.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-app-api@0.3.2-next.1 + +## @backstage/backend-plugin-api@0.3.2-next.1 + +### Patch Changes + +- ae88f61e00: The `register` methods passed to `createBackendPlugin` and `createBackendModule` + now have dedicated `BackendPluginRegistrationPoints` and + `BackendModuleRegistrationPoints` arguments, respectively. This lets us make it + clear on a type level that it's not possible to pass in extension points as + dependencies to plugins (should only ever be done for modules). This has no + practical effect on code that was already well behaved. +- Updated dependencies + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.11-next.1 + - @backstage/plugin-permission-common@0.7.3 + +## @backstage/backend-tasks@0.4.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + +## @backstage/backend-test-utils@0.1.34-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.22.2-next.0 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-app-api@0.3.2-next.1 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.11-next.1 + +## @backstage/cli@0.22.2-next.0 + +### Patch Changes + +- 561df21ea3: The `backstage-cli repo test` command now sets a default Jest `--workerIdleMemoryLimit` of 1GB. If needed to ensure that tests are not run in band, `--maxWorkers=2` is set as well. This is the recommended workaround for dealing with Jest workers leaking memory and eventually hitting the heap limit. +- 2815981057: Show module name causing error during build +- 66cf22fdc4: Updated dependency `esbuild` to `^0.17.0`. +- 6d3abfded1: Switch to inline source maps for test transpilation, simplifying editor setups. +- Updated dependencies + - @backstage/cli-common@0.1.11 + - @backstage/config@1.0.6 + - @backstage/config-loader@1.1.8 + - @backstage/errors@1.1.4 + - @backstage/release-manifests@0.0.8 + - @backstage/types@1.0.2 + +## @backstage/core-app-api@1.4.1-next.0 + +### Patch Changes + +- dff4d8ddb1: Fixed an issue where an explicit port the frontend base URL could break the app. +- Updated dependencies + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + +## @backstage/core-components@0.12.4-next.0 + +### Patch Changes + +- 910015f5b7: The Button component has been deprecated in favor of the LinkButton component +- 20840b36b4: Adds new type, TableOptions, extending Material Table Options. +- 85b04f659a: Internal refactor to not use deprecated `substr` +- Updated dependencies + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/version-bridge@1.0.3 + +## @backstage/create-app@0.4.37-next.1 + +### Patch Changes + +- 86a8dfd7b0: Added a check to ensure that Yarn v1 is used when creating new projects. +- 0eaa579f89: Update `SearchPage` template to use `SearchResult` extensions. +- Updated dependencies + - @backstage/cli-common@0.1.11 + +## @backstage/dev-utils@1.0.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/app-defaults@1.1.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration-react@1.1.10-next.0 + - @backstage/test-utils@1.2.5-next.0 + - @backstage/theme@0.2.16 + +## @backstage/integration-react@1.1.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + +## @techdocs/cli@1.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/cli-common@0.1.11 + - @backstage/config@1.0.6 + - @backstage/plugin-techdocs-node@1.4.6-next.1 + +## @backstage/test-utils@1.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-react@0.4.9 + +## @backstage/plugin-adr@0.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-search-react@1.5.0-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration-react@1.1.10-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-adr-common@0.2.6-next.0 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-adr-backend@0.2.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/plugin-adr-common@0.2.6-next.0 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-airbrake@0.3.15-next.1 + +### Patch Changes + +- 41377156d0: Adds a boolean helper function to airbrake plugin for use on the EntityPage to show/hide airbrake tab depending on whether the entity's catalog-info.yml has an airbrake id set in the metadata +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/dev-utils@1.0.12-next.1 + - @backstage/test-utils@1.2.5-next.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-airbrake-backend@0.2.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + +## @backstage/plugin-allure@0.1.31-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-analytics-module-ga@0.1.26-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-apache-airflow@0.2.8-next.0 + +### Patch Changes + +- 85b04f659a: Internal refactor to not use deprecated `substr` +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + +## @backstage/plugin-api-docs@0.8.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.8.0-next.1 + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-apollo-explorer@0.1.8-next.0 + +### Patch Changes + +- d950d3e217: Depend on `@material-ui/core` version `^4.12.2` like all other in-repo packages +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-app-backend@0.3.42-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/config@1.0.6 + - @backstage/config-loader@1.1.8 + - @backstage/types@1.0.2 + +## @backstage/plugin-auth-backend@0.17.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.11-next.1 + +## @backstage/plugin-auth-node@0.2.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + +## @backstage/plugin-azure-devops@0.2.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-azure-devops-common@0.3.0 + +## @backstage/plugin-azure-devops-backend@0.3.21-next.1 + +### Patch Changes + +- cc926a59bd: Fixed a bug where the azure devops host in URLs on the readme card was being URL encoded, breaking hosts with ports. +- 85b04f659a: Internal refactor to not use deprecated `substr` +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/plugin-azure-devops-common@0.3.0 + +## @backstage/plugin-azure-sites@0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-azure-sites-common@0.1.0 + +## @backstage/plugin-azure-sites-backend@0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/plugin-azure-sites-common@0.1.0 + +## @backstage/plugin-badges@0.2.39-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## @backstage/plugin-badges-backend@0.1.36-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + +## @backstage/plugin-bazaar@0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.22.2-next.0 + - @backstage/plugin-catalog@1.8.0-next.1 + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## @backstage/plugin-bazaar-backend@0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-test-utils@0.1.34-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.11-next.1 + +## @backstage/plugin-bitrise@0.1.42-next.1 + +### Patch Changes + +- 85b04f659a: Internal refactor to not use deprecated `substr` +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-catalog-backend@1.7.2-next.1 + +### Patch Changes + +- 2380506364: The process of adding or modifying fields in the software-catalog search index has been simplified. For more details, see [how to customize fields in the Software Catalog index](https://backstage.io/docs/features/search/how-to-guides#how-to-customize-fields-in-the-software-catalog-index). +- 9573651919: The previous migration that adds the `search.original_value` column may leave some of the entities not updated. Add a migration script to trigger a reprocessing of the entities. +- fc73f6aae5: Switched the order of reprocessing statements retroactively in migrations. This only improves the experience for those who at a later time perform a large upgrade of an old Backstage installation. +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.1 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-node@0.7.5-next.1 + - @backstage/plugin-scaffolder-common@1.2.5-next.0 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-catalog-backend-module-aws@0.1.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-node@1.3.3-next.1 + +## @backstage/plugin-catalog-backend-module-azure@0.1.13-next.1 + +### Patch Changes + +- 2890f47517: This will add the ability to use Azure DevOps with multi project with a single value which is a new feature as previously this had to be done manually for each project that you wanted to add. + + Right now you would have to fill in multiple values in the config to use multiple projects: + + yourFirstProviderId: # identifies your dataset / provider independent of config changes + organization: myorg + project: 'firstProject' # this will match the firstProject project + repository: '*' # this will match all repos + path: /catalog-info.yaml + yourSecondProviderId: # identifies your dataset / provider independent of config changes + organization: myorg + project: 'secondProject' # this will match the secondProject project + repository: '*' # this will match all repos + path: /catalog-info.yaml + + With this change you can actually have all projects available where your PAT determines which you have access to, so that includes multiple projects: + + yourFirstProviderId: # identifies your dataset / provider independent of config changes + organization: myorg + project: '*' # this will match all projects where your PAT has access to + repository: '*' # this will match all repos + path: /catalog-info.yaml + +- 85b04f659a: Internal refactor to not use deprecated `substr` + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-node@1.3.3-next.1 + +## @backstage/plugin-catalog-backend-module-bitbucket@0.2.9-next.1 + +### Patch Changes + +- 85b04f659a: Internal refactor to not use deprecated `substr` +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-bitbucket-cloud-common@0.2.3 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.1.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/integration@1.4.2 + - @backstage/plugin-bitbucket-cloud-common@0.2.3 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.1 + - @backstage/plugin-events-node@0.2.3-next.1 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.1.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/plugin-catalog-node@1.3.3-next.1 + +## @backstage/plugin-catalog-backend-module-gerrit@0.1.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/plugin-catalog-node@1.3.3-next.1 + +## @backstage/plugin-catalog-backend-module-github@0.2.5-next.1 + +### Patch Changes + +- 66158754b4: Add support for filtering out forks +- 85b04f659a: Internal refactor to not use deprecated `substr` +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.1 + - @backstage/plugin-events-node@0.2.3-next.1 + +## @backstage/plugin-catalog-backend-module-gitlab@0.1.13-next.1 + +### Patch Changes + +- 85b04f659a: Internal refactor to not use deprecated `substr` +- 52c5685ceb: Implement Group and User Catalog Provider +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-node@1.3.3-next.1 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.2.0-next.1 + +### Patch Changes + +- b7e36660d5: Return `EventSubscriber` from `addIncrementalEntityProvider` to hook up to `EventsBackend` +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/backend-test-utils@0.1.34-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-catalog-node@1.3.3-next.1 + - @backstage/plugin-events-node@0.2.3-next.1 + - @backstage/plugin-permission-common@0.7.3 + +## @backstage/plugin-catalog-backend-module-ldap@0.5.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-backend-module-msgraph@0.4.8-next.1 + +### Patch Changes + +- 4c86436fdf: Fix MS Graph provider to use target URL for fetching access token +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/plugin-catalog-node@1.3.3-next.1 + +## @backstage/plugin-catalog-backend-module-openapi@0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-node@1.3.3-next.1 + +## @backstage/plugin-catalog-graph@0.2.27-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-catalog-import@0.9.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/integration-react@1.1.10-next.0 + - @backstage/plugin-catalog-common@1.0.11-next.0 + +## @backstage/plugin-catalog-node@1.3.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.11-next.0 + +## @backstage/plugin-cicd-statistics@0.1.17-next.1 + +### Patch Changes + +- d950d3e217: Depend on `@material-ui/core` version `^4.12.2` like all other in-repo packages +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + +## @backstage/plugin-cicd-statistics-module-gitlab@0.1.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-cicd-statistics@0.1.17-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + +## @backstage/plugin-circleci@0.3.15-next.1 + +### Patch Changes + +- 85b04f659a: Internal refactor to not use deprecated `substr` +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-cloudbuild@0.3.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-code-climate@0.1.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-code-coverage@0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## @backstage/plugin-code-coverage-backend@0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + +## @backstage/plugin-codescene@0.1.10-next.0 + +### Patch Changes + +- d950d3e217: Depend on `@material-ui/core` version `^4.12.2` like all other in-repo packages +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## @backstage/plugin-config-schema@0.1.38-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + +## @backstage/plugin-cost-insights@0.12.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-cost-insights-common@0.1.1 + +## @backstage/plugin-dynatrace@2.0.0-next.1 + +### Patch Changes + +- d950d3e217: Depend on `@material-ui/core` version `^4.12.2` like all other in-repo packages +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-events-backend@0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/config@1.0.6 + - @backstage/plugin-events-node@0.2.3-next.1 + +## @backstage/plugin-events-backend-module-aws-sqs@0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + - @backstage/plugin-events-node@0.2.3-next.1 + +## @backstage/plugin-events-backend-module-azure@0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/plugin-events-node@0.2.3-next.1 + +## @backstage/plugin-events-backend-module-bitbucket-cloud@0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/plugin-events-node@0.2.3-next.1 + +## @backstage/plugin-events-backend-module-gerrit@0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/plugin-events-node@0.2.3-next.1 + +## @backstage/plugin-events-backend-module-github@0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/config@1.0.6 + - @backstage/plugin-events-node@0.2.3-next.1 + +## @backstage/plugin-events-backend-module-gitlab@0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/config@1.0.6 + - @backstage/plugin-events-node@0.2.3-next.1 + +## @backstage/plugin-events-backend-test-utils@0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.3-next.1 + +## @backstage/plugin-events-node@0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.1 + +## @backstage/plugin-explore-backend@0.0.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-firehydrant@0.1.32-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-fossa@0.2.47-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## @backstage/plugin-gcalendar@0.3.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## @backstage/plugin-gcp-projects@0.3.34-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-git-release-manager@0.3.28-next.0 + +### Patch Changes + +- 85b04f659a: Internal refactor to not use deprecated `substr` +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + +## @backstage/plugin-github-actions@0.5.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + +## @backstage/plugin-github-deployments@0.1.46-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/integration-react@1.1.10-next.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-github-issues@0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + +## @backstage/plugin-github-pull-requests-board@0.1.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + +## @backstage/plugin-gitops-profiles@0.3.33-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-gocd@0.1.21-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## @backstage/plugin-graphiql@0.2.47-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-graphql-backend@0.1.32-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/plugin-catalog-graphql@0.3.18-next.0 + +## @backstage/plugin-home@0.4.31-next.1 + +### Patch Changes + +- 3d1d867d42: Fixed regression that caused the `WelcomeTitle` to not be the right size when passed to the `title` property of the `<Header>` component. A Storybook entry was also added for the `WelcomeTitle` +- c553a625d2: remove unused plugin-stack-overflow dependency +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-ilert@0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## @backstage/plugin-jenkins@0.7.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-jenkins-common@0.1.13-next.0 + +## @backstage/plugin-jenkins-backend@0.1.32-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.11-next.1 + - @backstage/plugin-jenkins-common@0.1.13-next.0 + - @backstage/plugin-permission-common@0.7.3 + +## @backstage/plugin-kafka@0.3.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-kafka-backend@0.2.35-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + +## @backstage/plugin-kubernetes@0.7.8-next.1 + +### Patch Changes + +- 145a79a15b: Condenses kubernetes ui plugin to fit more onscreen and increase visibility +- 628e2bd89a: Updated dependency `@kubernetes/client-node` to `0.18.1`. +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-kubernetes-common@0.6.0-next.1 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-kubernetes-backend@0.9.3-next.1 + +### Patch Changes + +- 628e2bd89a: Updated dependency `@kubernetes/client-node` to `0.18.1`. +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/plugin-kubernetes-common@0.6.0-next.1 + - @backstage/backend-test-utils@0.1.34-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.11-next.1 + +## @backstage/plugin-kubernetes-common@0.6.0-next.1 + +### Patch Changes + +- 628e2bd89a: Updated dependency `@kubernetes/client-node` to `0.18.1`. +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-lighthouse@0.3.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-newrelic@0.3.33-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-newrelic-dashboard@0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + +## @backstage/plugin-org@0.6.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-org-react@0.1.4-next.1 + +### Patch Changes + +- d950d3e217: Depend on `@material-ui/core` version `^4.12.2` like all other in-repo packages +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-pagerduty@0.5.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## @backstage/plugin-periskop@0.1.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## @backstage/plugin-periskop-backend@0.1.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + +## @backstage/plugin-permission-backend@0.5.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.11-next.1 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-node@0.7.5-next.1 + +## @backstage/plugin-permission-node@0.7.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.11-next.1 + - @backstage/plugin-permission-common@0.7.3 + +## @backstage/plugin-playlist@0.1.6-next.1 + +### Patch Changes + +- d950d3e217: Depend on `@material-ui/core` version `^4.12.2` like all other in-repo packages +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-search-react@1.5.0-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-react@0.4.9 + - @backstage/plugin-playlist-common@0.1.4 + +## @backstage/plugin-playlist-backend@0.2.5-next.1 + +### Patch Changes + +- 85b04f659a: Internal refactor to not use deprecated `substr` +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-test-utils@0.1.34-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.11-next.1 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-node@0.7.5-next.1 + - @backstage/plugin-playlist-common@0.1.4 + +## @backstage/plugin-proxy-backend@0.2.36-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + +## @backstage/plugin-rollbar@0.4.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-rollbar-backend@0.1.39-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + +## @backstage/plugin-scaffolder@1.11.0-next.1 + +### Patch Changes + +- 04f717a8e1: `scaffolder/next`: bump `react-jsonschema-form` libraries to `v5-stable` +- 346d6b6630: Upgrade `@rjsf` version 5 dependencies to `beta.18` +- 0f0da2f256: Prefer schema ordering of template properties during review content generation. +- 38992bdbaf: Fixed bug in review step refactor that caused schema-based display settings for individual property values to be discarded. +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.1.0-next.1 + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/integration-react@1.1.10-next.0 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-permission-react@0.4.9 + - @backstage/plugin-scaffolder-common@1.2.5-next.0 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/plugin-scaffolder-backend@1.11.0-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-node@0.1.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-rails@0.4.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/plugin-scaffolder-backend@1.11.0-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-node@0.1.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.1.2-next.1 + +### Patch Changes + +- da418c89e4: Fix broken module exports and dependencies to match a backend module, rather than a frontend plugin. +- Updated dependencies + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-scaffolder-node@0.1.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.2.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-node@0.1.0-next.1 + +## @backstage/plugin-scaffolder-node@0.1.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-common@1.2.5-next.0 + +## @backstage/plugin-scaffolder-react@1.1.0-next.1 + +### Patch Changes + +- 04f717a8e1: `scaffolder/next`: bump `react-jsonschema-form` libraries to `v5-stable` +- 346d6b6630: Upgrade `@rjsf` version 5 dependencies to `beta.18` +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-scaffolder-common@1.2.5-next.0 + +## @backstage/plugin-search-backend@1.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.11-next.1 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-node@0.7.5-next.1 + - @backstage/plugin-search-backend-node@1.1.3-next.1 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-search-backend-module-elasticsearch@1.1.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6 + - @backstage/plugin-search-backend-node@1.1.3-next.1 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-search-backend-module-pg@0.5.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/plugin-search-backend-node@1.1.3-next.1 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-search-backend-node@1.1.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-sentry@0.4.8-next.1 + +### Patch Changes + +- 85b04f659a: Internal refactor to not use deprecated `substr` +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-shortcuts@0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + +## @backstage/plugin-sonarqube@0.6.3-next.1 + +### Patch Changes + +- 6310eacc11: Additional export added in order to bind SonarQubeClient to its apiref +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-sonarqube-react@0.1.2-next.0 + +## @backstage/plugin-sonarqube-backend@0.1.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + +## @backstage/plugin-splunk-on-call@0.4.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-stack-overflow@0.1.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-home@0.4.31-next.1 + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-search-react@1.5.0-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-stack-overflow-backend@0.1.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-tech-insights@0.3.7-next.1 + +### Patch Changes + +- 4024b37449: TechInsightsApi interface now has getFactSchemas() method. + TechInsightsClient now implements method getFactSchemas(). + + **BREAKING** FactSchema type moved from @backstage/plugin-tech-insights-node into @backstage/plugin-tech-insights-common + + These changes are **required** if you were importing this type directly. + + ```diff + - import { FactSchema } from '@backstage/plugin-tech-insights-node'; + + import { FactSchema } from '@backstage/plugin-tech-insights-common'; + ``` + +- Updated dependencies + - @backstage/plugin-tech-insights-common@0.2.10-next.0 + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + +## @backstage/plugin-tech-insights-backend@0.5.8-next.1 + +### Patch Changes + +- 4024b37449: TechInsightsApi interface now has getFactSchemas() method. + TechInsightsClient now implements method getFactSchemas(). + + **BREAKING** FactSchema type moved from @backstage/plugin-tech-insights-node into @backstage/plugin-tech-insights-common + + These changes are **required** if you were importing this type directly. + + ```diff + - import { FactSchema } from '@backstage/plugin-tech-insights-node'; + + import { FactSchema } from '@backstage/plugin-tech-insights-common'; + ``` + +- Updated dependencies + - @backstage/plugin-tech-insights-common@0.2.10-next.0 + - @backstage/plugin-tech-insights-node@0.4.0-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + +## @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.26-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-tech-insights-common@0.2.10-next.0 + - @backstage/plugin-tech-insights-node@0.4.0-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + +## @backstage/plugin-tech-insights-common@0.2.10-next.0 + +### Patch Changes + +- 4024b37449: TechInsightsApi interface now has getFactSchemas() method. + TechInsightsClient now implements method getFactSchemas(). + + **BREAKING** FactSchema type moved from @backstage/plugin-tech-insights-node into @backstage/plugin-tech-insights-common + + These changes are **required** if you were importing this type directly. + + ```diff + - import { FactSchema } from '@backstage/plugin-tech-insights-node'; + + import { FactSchema } from '@backstage/plugin-tech-insights-common'; + ``` + +- Updated dependencies + - @backstage/types@1.0.2 + +## @backstage/plugin-tech-radar@0.6.1-next.0 + +### Patch Changes + +- 18024a231c: Allow to set additional links to the entry description. +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-techdocs-addons-test-utils@1.0.10-next.1 + +### Patch Changes + +- d950d3e217: Depend on `@material-ui/core` version `^4.12.2` like all other in-repo packages +- Updated dependencies + - @backstage/plugin-techdocs@1.5.0-next.1 + - @backstage/plugin-catalog@1.8.0-next.1 + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-search-react@1.5.0-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration-react@1.1.10-next.0 + - @backstage/test-utils@1.2.5-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-techdocs-react@1.1.3-next.1 + +## @backstage/plugin-techdocs-backend@1.5.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-search-common@1.2.1 + - @backstage/plugin-techdocs-node@1.4.6-next.1 + +## @backstage/plugin-techdocs-module-addons-contrib@1.0.10-next.1 + +### Patch Changes + +- d950d3e217: Depend on `@material-ui/core` version `^4.12.2` like all other in-repo packages +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration@1.4.2 + - @backstage/integration-react@1.1.10-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-techdocs-react@1.1.3-next.1 + +## @backstage/plugin-techdocs-node@1.4.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/integration-aws-node@0.1.1 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-techdocs-react@1.1.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/version-bridge@1.0.3 + +## @backstage/plugin-todo@0.2.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## @backstage/plugin-todo-backend@0.1.39-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + +## @backstage/plugin-user-settings@0.6.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + +## @backstage/plugin-user-settings-backend@0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.11-next.1 + +## @backstage/plugin-vault@0.1.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## @backstage/plugin-vault-backend@0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/backend-test-utils@0.1.34-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + +## @backstage/plugin-xcmetrics@0.2.35-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## example-app@0.2.80-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.1.0-next.1 + - @backstage/plugin-scaffolder@1.11.0-next.1 + - @backstage/cli@0.22.2-next.0 + - @backstage/plugin-techdocs@1.5.0-next.1 + - @backstage/plugin-tech-insights@0.3.7-next.1 + - @backstage/plugin-search@1.1.0-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.10-next.1 + - @backstage/plugin-dynatrace@2.0.0-next.1 + - @backstage/plugin-playlist@0.1.6-next.1 + - @backstage/plugin-home@0.4.31-next.1 + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/plugin-kubernetes@0.7.8-next.1 + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-tech-radar@0.6.1-next.0 + - @backstage/plugin-explore@0.4.0-next.1 + - @backstage/plugin-apache-airflow@0.2.8-next.0 + - @backstage/plugin-circleci@0.3.15-next.1 + - @backstage/plugin-sentry@0.4.8-next.1 + - @backstage/plugin-search-react@1.5.0-next.0 + - @backstage/plugin-airbrake@0.3.15-next.1 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/app-defaults@1.1.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration-react@1.1.10-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-api-docs@0.8.15-next.1 + - @backstage/plugin-azure-devops@0.2.6-next.1 + - @backstage/plugin-azure-sites@0.1.4-next.1 + - @backstage/plugin-badges@0.2.39-next.1 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-catalog-graph@0.2.27-next.1 + - @backstage/plugin-catalog-import@0.9.5-next.1 + - @backstage/plugin-cloudbuild@0.3.15-next.1 + - @backstage/plugin-code-coverage@0.2.8-next.1 + - @backstage/plugin-cost-insights@0.12.4-next.1 + - @backstage/plugin-gcalendar@0.3.11-next.0 + - @backstage/plugin-gcp-projects@0.3.34-next.0 + - @backstage/plugin-github-actions@0.5.15-next.1 + - @backstage/plugin-gocd@0.1.21-next.1 + - @backstage/plugin-graphiql@0.2.47-next.0 + - @backstage/plugin-jenkins@0.7.14-next.1 + - @backstage/plugin-kafka@0.3.15-next.1 + - @backstage/plugin-lighthouse@0.3.15-next.1 + - @backstage/plugin-newrelic@0.3.33-next.0 + - @backstage/plugin-newrelic-dashboard@0.2.8-next.1 + - @backstage/plugin-org@0.6.5-next.1 + - @backstage/plugin-pagerduty@0.5.8-next.1 + - @backstage/plugin-permission-react@0.4.9 + - @backstage/plugin-rollbar@0.4.15-next.1 + - @backstage/plugin-search-common@1.2.1 + - @backstage/plugin-shortcuts@0.3.7-next.0 + - @backstage/plugin-stack-overflow@0.1.11-next.1 + - @backstage/plugin-techdocs-react@1.1.3-next.1 + - @backstage/plugin-todo@0.2.17-next.1 + - @backstage/plugin-user-settings@0.6.3-next.1 + - @internal/plugin-catalog-customized@0.0.7-next.1 + +## example-backend@0.2.80-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/plugin-tech-insights-backend@0.5.8-next.1 + - @backstage/plugin-tech-insights-node@0.4.0-next.1 + - @backstage/plugin-azure-devops-backend@0.3.21-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/plugin-kubernetes-backend@0.9.3-next.1 + - @backstage/plugin-scaffolder-backend@1.11.0-next.1 + - @backstage/plugin-playlist-backend@0.2.5-next.1 + - example-app@0.2.80-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/integration@1.4.2 + - @backstage/plugin-adr-backend@0.2.7-next.1 + - @backstage/plugin-app-backend@0.3.42-next.1 + - @backstage/plugin-auth-backend@0.17.5-next.1 + - @backstage/plugin-auth-node@0.2.11-next.1 + - @backstage/plugin-azure-sites-backend@0.1.4-next.1 + - @backstage/plugin-badges-backend@0.1.36-next.1 + - @backstage/plugin-catalog-node@1.3.3-next.1 + - @backstage/plugin-code-coverage-backend@0.2.8-next.1 + - @backstage/plugin-events-backend@0.2.3-next.1 + - @backstage/plugin-events-node@0.2.3-next.1 + - @backstage/plugin-explore-backend@0.0.4-next.1 + - @backstage/plugin-graphql-backend@0.1.32-next.1 + - @backstage/plugin-jenkins-backend@0.1.32-next.1 + - @backstage/plugin-kafka-backend@0.2.35-next.1 + - @backstage/plugin-permission-backend@0.5.17-next.1 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-node@0.7.5-next.1 + - @backstage/plugin-proxy-backend@0.2.36-next.1 + - @backstage/plugin-rollbar-backend@0.1.39-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.10-next.1 + - @backstage/plugin-search-backend@1.2.3-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.3-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.3-next.1 + - @backstage/plugin-search-backend-node@1.1.3-next.1 + - @backstage/plugin-search-common@1.2.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.26-next.1 + - @backstage/plugin-techdocs-backend@1.5.3-next.1 + - @backstage/plugin-todo-backend@0.1.39-next.1 + +## example-backend-next@0.0.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/plugin-scaffolder-backend@1.11.0-next.1 + - @backstage/backend-defaults@0.1.7-next.1 + - @backstage/plugin-app-backend@0.3.42-next.1 + +## techdocs-cli-embedded-app@0.2.79-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.22.2-next.0 + - @backstage/plugin-techdocs@1.5.0-next.1 + - @backstage/plugin-catalog@1.8.0-next.1 + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/core-components@0.12.4-next.0 + - @backstage/app-defaults@1.1.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration-react@1.1.10-next.0 + - @backstage/test-utils@1.2.5-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-techdocs-react@1.1.3-next.1 + +## @internal/plugin-catalog-customized@0.0.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.8.0-next.1 + - @backstage/plugin-catalog-react@1.3.0-next.1 + +## @internal/plugin-todo-list@1.0.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @internal/plugin-todo-list-backend@1.0.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.11-next.1 diff --git a/microsite/data/plugins/s3-viewer.yaml b/microsite/data/plugins/s3-viewer.yaml new file mode 100644 index 0000000000..23637133c8 --- /dev/null +++ b/microsite/data/plugins/s3-viewer.yaml @@ -0,0 +1,12 @@ +--- +title: S3 Viewer +author: Spreadgroup +authorUrl: https://github.com/spreadshirt +category: AWS +description: Visualization of S3 buckets and their contents in file explorer style. +documentation: https://github.com/spreadshirt/backstage-plugin-s3/ +iconUrl: img/s3-bucket.svg +npmPackageName: '@spreadshirt/backstage-plugin-s3-viewer' +tags: + - s3 +addedDate: '2023-01-18' diff --git a/microsite/data/plugins/torque.yaml b/microsite/data/plugins/torque.yaml new file mode 100644 index 0000000000..1480c3bad9 --- /dev/null +++ b/microsite/data/plugins/torque.yaml @@ -0,0 +1,12 @@ +--- +title: Torque +author: Quali +authorUrl: 'https://www.qtorque.io/' +category: Orchestration +description: | + Deploy the environments you need to keep building, testing and delivering incredible code. + Plugin includes an Entity ComponentCard, Backend API route and scaffolder actions. +documentation: https://github.com/QualiTorque/torque-backstage-plugin/tree/main/packages/torque#readme +iconUrl: https://user-images.githubusercontent.com/8643801/214640977-751bc338-6b77-40a0-a897-cba41b6f006a.png +npmPackageName: '@qtorque/backstage-plugin-torque' +addedDate: '2023-01-25' diff --git a/microsite/pages/en/on-demand.js b/microsite/pages/en/on-demand.js index 41a730205b..15059e91a1 100644 --- a/microsite/pages/en/on-demand.js +++ b/microsite/pages/en/on-demand.js @@ -20,7 +20,7 @@ const ondemandMetadata = fs .reverse() .map(file => yaml.load(fs.readFileSync(`./data/on-demand/${file}`, 'utf8'))); const truncate = text => - text.length > 170 ? text.substr(0, 170) + '...' : text; + text.length > 170 ? text.slice(0, 170) + '...' : text; const addVideoDocsLink = '/docs/overview/support'; const defaultIconUrl = 'img/logo-gradient-on-dark.svg'; diff --git a/microsite/pages/en/plugins.js b/microsite/pages/en/plugins.js index 9a0a59bd4b..237161b98a 100644 --- a/microsite/pages/en/plugins.js +++ b/microsite/pages/en/plugins.js @@ -19,7 +19,7 @@ const pluginMetadata = fs .map(file => yaml.load(fs.readFileSync(`./data/plugins/${file}`, 'utf8'))) .sort((a, b) => a.title.toLowerCase().localeCompare(b.title.toLowerCase())); const truncate = text => - text.length > 170 ? text.substr(0, 170) + '...' : text; + text.length > 170 ? text.slice(0, 170) + '...' : text; const newForDays = 100; diff --git a/microsite/sidebars.json b/microsite/sidebars.json index 02e0c82fd4..fcded5ebfb 100644 --- a/microsite/sidebars.json +++ b/microsite/sidebars.json @@ -201,7 +201,8 @@ "label": "GitLab", "ids": [ "integrations/gitlab/locations", - "integrations/gitlab/discovery" + "integrations/gitlab/discovery", + "integrations/gitlab/org" ] }, { diff --git a/microsite/siteConfig.js b/microsite/siteConfig.js index 68226b5681..5329ebb688 100644 --- a/microsite/siteConfig.js +++ b/microsite/siteConfig.js @@ -138,8 +138,9 @@ const siteConfig = { ], algolia: { - apiKey: '8d115c9875ba0f4feaee95bab55a1645', - indexName: 'backstage', + apiKey: '10b9e6c92a4513c1cf390f50e53aad1f', + indexName: 'backstage_io', + appId: 'JCMFNHCHI8', searchParameters: {}, // Optional (if provided by Algolia) }, }; diff --git a/microsite/static/img/s3-bucket.svg b/microsite/static/img/s3-bucket.svg new file mode 100644 index 0000000000..a92ac68982 --- /dev/null +++ b/microsite/static/img/s3-bucket.svg @@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'><svg enable-background="new 0 0 100 100" height="100px" version="1.1" viewBox="0 0 100 100" width="100px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Layer_1"><g><g><g enable-background="new "><g enable-background="new "><defs><path d="M77.586,28.061v2.772c0,3.559-12.344,6.433-27.578,6.433 c-15.25,0-27.594-2.874-27.594-6.433v-2.772c0,3.559,12.344,6.432,27.594,6.432C65.242,34.492,77.586,31.619,77.586,28.061z" enable-background="new " id="SVGID_5_"/></defs><clipPath id="SVGID_2_"/><g clip-path="url(#SVGID_2_)" enable-background="new "><path d="M77.586,28.061v2.772c0,0.084-0.006,0.168-0.02,0.25v-2.771C77.58,28.228,77.586,28.145,77.586,28.061 " fill="#8C3323"/><path d="M77.566,28.312v2.771c-0.018,0.098-0.039,0.193-0.074,0.289v-2.773 C77.527,28.503,77.549,28.407,77.566,28.312" fill="#8C3323"/><path d="M77.492,28.599v2.773c-0.049,0.135-0.113,0.268-0.195,0.4v-2.773 C77.379,28.866,77.443,28.734,77.492,28.599" fill="#8C3323"/><path d="M77.297,28.999v2.773c-1.945,3.111-13.42,5.493-27.289,5.493c-15.25,0-27.594-2.874-27.594-6.433 v-2.772c0,3.559,12.344,6.432,27.594,6.432C63.877,34.492,75.352,32.11,77.297,28.999" fill="#8C3323"/></g></g><g><path d="M50.008,21.628c15.234,0,27.578,2.875,27.578,6.433c0,3.559-12.344,6.432-27.578,6.432 c-15.25,0-27.594-2.873-27.594-6.432C22.414,24.503,34.758,21.628,50.008,21.628z" fill="#E15343"/></g><g><polygon fill="#8C3323" points="77.428,33.006 77.428,35.779 68.387,74.069 67.67,72.257 "/></g><g><polygon fill="#8C3323" points="31.613,71.296 31.613,74.069 22.572,35.779 22.572,33.006 "/></g><g enable-background="new "><defs><path d="M68.387,71.296v2.773c0,2.387-8.217,4.303-18.379,4.303 s-18.395-1.916-18.395-4.303v-2.773c0,2.389,8.232,4.303,18.395,4.303S68.387,73.685,68.387,71.296z" enable-background="new " id="SVGID_7_"/></defs><clipPath id="SVGID_4_"/><g clip-path="url(#SVGID_4_)" enable-background="new "><path d="M68.387,71.296v2.773c0,0.057-0.004,0.112-0.012,0.168v-2.771 C68.383,71.409,68.387,71.353,68.387,71.296" fill="#8C3323"/><path d="M68.375,71.466v2.771c-0.012,0.066-0.027,0.131-0.051,0.196v-2.772 C68.348,71.596,68.363,71.53,68.375,71.466" fill="#8C3323"/><path d="M68.324,71.661v2.772c-0.033,0.091-0.076,0.18-0.131,0.268v-2.772 C68.248,71.839,68.291,71.751,68.324,71.661" fill="#8C3323"/><path d="M68.67,71.007l-0.477,3.694c-1.301,2.084-8.939,3.671-18.186,3.671 c-10.162,0-18.395-1.916-18.395-4.303v-2.773c0,2.389,8.232,4.303,18.395,4.303c9.246,0,16.885-1.585,18.186-3.67" fill="#8C3323"/></g></g><g><path d="M50.008,38.752c14.24,0,25.951-2.515,27.42-5.746l-9.041,38.29c0,2.389-8.217,4.303-18.379,4.303 s-18.395-1.914-18.395-4.303l-9.041-38.29C24.043,36.237,35.77,38.752,50.008,38.752z" fill="#E15343"/></g></g></g><rect clip-rule="evenodd" fill="#FFFFFF" fill-rule="evenodd" height="11.398" width="11.477" x="43.762" y="42.854"/><ellipse clip-rule="evenodd" cx="40.287" cy="63.9" fill="#FFFFFF" fill-rule="evenodd" rx="5.658" ry="5.62"/><polygon clip-rule="evenodd" fill="#FFFFFF" fill-rule="evenodd" points="64.09,69.257 52.748,69.257 58.42,58.784 "/></g></g></svg> \ No newline at end of file diff --git a/package.json b/package.json index d458fadb9d..912dd53b8a 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "@types/react": "^17", "@types/react-dom": "^17" }, - "version": "1.11.0-next.0", + "version": "1.11.0-next.1", "dependencies": { "@backstage/errors": "workspace:^", "@manypkg/get-packages": "^1.1.3" diff --git a/packages/app-defaults/CHANGELOG.md b/packages/app-defaults/CHANGELOG.md index 9a492ecaf7..ecd6c448d5 100644 --- a/packages/app-defaults/CHANGELOG.md +++ b/packages/app-defaults/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/app-defaults +## 1.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-permission-react@0.4.9 + ## 1.1.0 ### Minor Changes diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json index edfad83e78..793baff253 100644 --- a/packages/app-defaults/package.json +++ b/packages/app-defaults/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/app-defaults", "description": "Provides the default wiring of a Backstage App", - "version": "1.1.0", + "version": "1.1.1-next.0", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index 308dca26c5..a541927bf4 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,69 @@ # example-app +## 0.2.80-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.1.0-next.1 + - @backstage/plugin-scaffolder@1.11.0-next.1 + - @backstage/cli@0.22.2-next.0 + - @backstage/plugin-techdocs@1.5.0-next.1 + - @backstage/plugin-tech-insights@0.3.7-next.1 + - @backstage/plugin-search@1.1.0-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.10-next.1 + - @backstage/plugin-dynatrace@2.0.0-next.1 + - @backstage/plugin-playlist@0.1.6-next.1 + - @backstage/plugin-home@0.4.31-next.1 + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/plugin-kubernetes@0.7.8-next.1 + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-tech-radar@0.6.1-next.0 + - @backstage/plugin-explore@0.4.0-next.1 + - @backstage/plugin-apache-airflow@0.2.8-next.0 + - @backstage/plugin-circleci@0.3.15-next.1 + - @backstage/plugin-sentry@0.4.8-next.1 + - @backstage/plugin-search-react@1.5.0-next.0 + - @backstage/plugin-airbrake@0.3.15-next.1 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/app-defaults@1.1.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration-react@1.1.10-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-api-docs@0.8.15-next.1 + - @backstage/plugin-azure-devops@0.2.6-next.1 + - @backstage/plugin-azure-sites@0.1.4-next.1 + - @backstage/plugin-badges@0.2.39-next.1 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-catalog-graph@0.2.27-next.1 + - @backstage/plugin-catalog-import@0.9.5-next.1 + - @backstage/plugin-cloudbuild@0.3.15-next.1 + - @backstage/plugin-code-coverage@0.2.8-next.1 + - @backstage/plugin-cost-insights@0.12.4-next.1 + - @backstage/plugin-gcalendar@0.3.11-next.0 + - @backstage/plugin-gcp-projects@0.3.34-next.0 + - @backstage/plugin-github-actions@0.5.15-next.1 + - @backstage/plugin-gocd@0.1.21-next.1 + - @backstage/plugin-graphiql@0.2.47-next.0 + - @backstage/plugin-jenkins@0.7.14-next.1 + - @backstage/plugin-kafka@0.3.15-next.1 + - @backstage/plugin-lighthouse@0.3.15-next.1 + - @backstage/plugin-newrelic@0.3.33-next.0 + - @backstage/plugin-newrelic-dashboard@0.2.8-next.1 + - @backstage/plugin-org@0.6.5-next.1 + - @backstage/plugin-pagerduty@0.5.8-next.1 + - @backstage/plugin-permission-react@0.4.9 + - @backstage/plugin-rollbar@0.4.15-next.1 + - @backstage/plugin-search-common@1.2.1 + - @backstage/plugin-shortcuts@0.3.7-next.0 + - @backstage/plugin-stack-overflow@0.1.11-next.1 + - @backstage/plugin-techdocs-react@1.1.3-next.1 + - @backstage/plugin-todo@0.2.17-next.1 + - @backstage/plugin-user-settings@0.6.3-next.1 + - @internal/plugin-catalog-customized@0.0.7-next.1 + ## 0.2.80-next.0 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index f1edc7ee0e..f6631ed05b 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "example-app", - "version": "0.2.80-next.0", + "version": "0.2.80-next.1", "private": true, "backstage": { "role": "frontend" diff --git a/packages/app/src/components/search/SearchModal.tsx b/packages/app/src/components/search/SearchModal.tsx index 527351a857..4694d56390 100644 --- a/packages/app/src/components/search/SearchModal.tsx +++ b/packages/app/src/components/search/SearchModal.tsx @@ -21,7 +21,6 @@ import { DialogContent, DialogTitle, Grid, - List, makeStyles, Paper, useTheme, @@ -44,9 +43,8 @@ import { import { ToolSearchResultListItem } from '@backstage/plugin-explore'; import { searchPlugin, SearchType } from '@backstage/plugin-search'; import { - DefaultResultListItem, - SearchFilter, SearchBar, + SearchFilter, SearchResult, SearchResultPager, useSearch, @@ -93,7 +91,7 @@ export const SearchModal = ({ toggleModal }: { toggleModal: () => void }) => { searchBarRef?.current?.focus(); }); - const handleSearchResulClick = useCallback(() => { + const handleSearchResultClick = useCallback(() => { toggleModal(); setTimeout(focusContent, transitions.duration.leavingScreen); }, [toggleModal, focusContent, transitions]); @@ -101,11 +99,11 @@ export const SearchModal = ({ toggleModal }: { toggleModal: () => void }) => { const handleSearchBarKeyDown = useCallback( (e: KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => { if (e.key === 'Enter') { + handleSearchResultClick(); navigate(searchPagePath); - toggleModal(); } }, - [navigate, toggleModal, searchPagePath], + [navigate, searchPagePath, handleSearchResultClick], ); return ( @@ -189,7 +187,7 @@ export const SearchModal = ({ toggleModal }: { toggleModal: () => void }) => { alignItems="center" > <Grid item> - <Link to={searchPagePath} onClick={handleSearchResulClick}> + <Link to={searchPagePath} onClick={handleSearchResultClick}> <Typography component="span" className={classes.viewResultsLink} @@ -202,69 +200,13 @@ export const SearchModal = ({ toggleModal }: { toggleModal: () => void }) => { </Grid> </Grid> <Grid item xs> - <SearchResult> - {({ results }) => ( - <List> - {results.map(({ type, document, highlight, rank }) => { - let resultItem; - switch (type) { - case 'software-catalog': - resultItem = ( - <CatalogSearchResultListItem - icon={<CatalogIcon />} - key={document.location} - result={document} - highlight={highlight} - rank={rank} - /> - ); - break; - case 'techdocs': - resultItem = ( - <TechDocsSearchResultListItem - icon={<DocsIcon />} - key={document.location} - result={document} - highlight={highlight} - rank={rank} - /> - ); - break; - case 'tools': - resultItem = ( - <ToolSearchResultListItem - icon={<BuildIcon />} - key={document.location} - result={document} - highlight={highlight} - rank={rank} - /> - ); - break; - default: - resultItem = ( - <DefaultResultListItem - key={document.location} - result={document} - highlight={highlight} - rank={rank} - /> - ); - } - return ( - <div - role="button" - tabIndex={0} - key={`${document.location}-btn`} - onClick={handleSearchResulClick} - onKeyDown={handleSearchResulClick} - > - {resultItem} - </div> - ); - })} - </List> - )} + <SearchResult + onClick={handleSearchResultClick} + onKeyDown={handleSearchResultClick} + > + <CatalogSearchResultListItem icon={<CatalogIcon />} /> + <TechDocsSearchResultListItem icon={<DocsIcon />} /> + <ToolSearchResultListItem icon={<BuildIcon />} /> </SearchResult> </Grid> </Grid> diff --git a/packages/app/src/components/search/SearchPage.tsx b/packages/app/src/components/search/SearchPage.tsx index b79c6a7248..8167889b02 100644 --- a/packages/app/src/components/search/SearchPage.tsx +++ b/packages/app/src/components/search/SearchPage.tsx @@ -30,16 +30,15 @@ import { } from '@backstage/plugin-catalog-react'; import { SearchType } from '@backstage/plugin-search'; import { - DefaultResultListItem, SearchBar, SearchFilter, - SearchResult, SearchPagination, + SearchResult, SearchResultPager, useSearch, } from '@backstage/plugin-search-react'; import { TechDocsSearchResultListItem } from '@backstage/plugin-techdocs'; -import { Grid, List, makeStyles, Paper, Theme } from '@material-ui/core'; +import { Grid, makeStyles, Paper, Theme } from '@material-ui/core'; import React from 'react'; import { ToolSearchResultListItem } from '@backstage/plugin-explore'; import BuildIcon from '@material-ui/icons/Build'; @@ -133,53 +132,9 @@ const SearchPage = () => { <Grid item xs> <SearchPagination /> <SearchResult> - {({ results }) => ( - <List> - {results.map(({ type, document, highlight, rank }) => { - switch (type) { - case 'software-catalog': - return ( - <CatalogSearchResultListItem - icon={<CatalogIcon />} - key={document.location} - result={document} - highlight={highlight} - rank={rank} - /> - ); - case 'techdocs': - return ( - <TechDocsSearchResultListItem - icon={<DocsIcon />} - key={document.location} - result={document} - highlight={highlight} - rank={rank} - /> - ); - case 'tools': - return ( - <ToolSearchResultListItem - icon={<BuildIcon />} - key={document.location} - result={document} - highlight={highlight} - rank={rank} - /> - ); - default: - return ( - <DefaultResultListItem - key={document.location} - result={document} - highlight={highlight} - rank={rank} - /> - ); - } - })} - </List> - )} + <CatalogSearchResultListItem icon={<CatalogIcon />} /> + <TechDocsSearchResultListItem icon={<DocsIcon />} /> + <ToolSearchResultListItem icon={<BuildIcon />} /> </SearchResult> <SearchResultPager /> </Grid> diff --git a/packages/backend-app-api/CHANGELOG.md b/packages/backend-app-api/CHANGELOG.md index 29ad23e886..6e7dcbfde5 100644 --- a/packages/backend-app-api/CHANGELOG.md +++ b/packages/backend-app-api/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/backend-app-api +## 0.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/cli-common@0.1.11 + - @backstage/config@1.0.6 + - @backstage/config-loader@1.1.8 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.11-next.1 + - @backstage/plugin-permission-node@0.7.5-next.1 + ## 0.3.2-next.0 ### Patch Changes diff --git a/packages/backend-app-api/package.json b/packages/backend-app-api/package.json index f7c574d7b6..0bd4eab227 100644 --- a/packages/backend-app-api/package.json +++ b/packages/backend-app-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-app-api", "description": "Core API used by Backstage backend apps", - "version": "0.3.2-next.0", + "version": "0.3.2-next.1", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { @@ -64,6 +64,7 @@ "winston-transport": "^4.5.0" }, "devDependencies": { + "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", "@types/compression": "^1.7.0", "@types/fs-extra": "^9.0.3", diff --git a/packages/backend-app-api/src/services/implementations/scheduler/schedulerFactory.test.ts b/packages/backend-app-api/src/services/implementations/scheduler/schedulerFactory.test.ts new file mode 100644 index 0000000000..1aaf4ec71d --- /dev/null +++ b/packages/backend-app-api/src/services/implementations/scheduler/schedulerFactory.test.ts @@ -0,0 +1,68 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + coreServices, + createBackendPlugin, +} from '@backstage/backend-plugin-api'; +import { startTestBackend } from '@backstage/backend-test-utils'; +import { schedulerFactory } from './schedulerFactory'; + +describe('schedulerFactory', () => { + it('creates sidecar database features', async () => { + expect.assertions(3); + + const subject = schedulerFactory(); + + const plugin = createBackendPlugin({ + id: 'example', + register(reg) { + reg.registerInit({ + deps: { + scheduler: subject.service, + database: coreServices.database, + }, + init: async ({ scheduler, database }) => { + await scheduler.scheduleTask({ + id: 'task1', + timeout: { seconds: 1 }, + frequency: { seconds: 1 }, + fn: async () => {}, + }); + + const client = await database.getClient(); + await expect( + client.from('backstage_backend_tasks__tasks').count(), + ).resolves.toEqual([{ 'count(*)': 1 }]); + await expect( + client.from('backstage_backend_tasks__knex_migrations').count(), + ).resolves.toEqual([{ 'count(*)': expect.any(Number) }]); + await expect( + client + .from('backstage_backend_tasks__knex_migrations_lock') + .count(), + ).resolves.toEqual([{ 'count(*)': expect.any(Number) }]); + }, + }); + }, + }); + + await startTestBackend({ + features: [plugin()], + services: [subject], + }); + }); +}); diff --git a/packages/backend-common/CHANGELOG.md b/packages/backend-common/CHANGELOG.md index d9bbd21600..f8090ae971 100644 --- a/packages/backend-common/CHANGELOG.md +++ b/packages/backend-common/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/backend-common +## 0.18.2-next.1 + +### Patch Changes + +- 628e2bd89a: Updated dependency `@kubernetes/client-node` to `0.18.1`. +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-app-api@0.3.2-next.1 + - @backstage/cli-common@0.1.11 + - @backstage/config@1.0.6 + - @backstage/config-loader@1.1.8 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + ## 0.18.2-next.0 ### Patch Changes diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index 69f48c0a82..c950950680 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.18.2-next.0", + "version": "0.18.2-next.1", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md index e91a1dede3..0824ee5655 100644 --- a/packages/backend-defaults/CHANGELOG.md +++ b/packages/backend-defaults/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/backend-defaults +## 0.1.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-app-api@0.3.2-next.1 + ## 0.1.7-next.0 ### Patch Changes diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 1d9e7823e5..6b1b173205 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-defaults", "description": "Backend defaults used by Backstage backend apps", - "version": "0.1.7-next.0", + "version": "0.1.7-next.1", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-next/CHANGELOG.md b/packages/backend-next/CHANGELOG.md index db0f44fcb2..914835b1c4 100644 --- a/packages/backend-next/CHANGELOG.md +++ b/packages/backend-next/CHANGELOG.md @@ -1,5 +1,15 @@ # example-backend-next +## 0.0.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/plugin-scaffolder-backend@1.11.0-next.1 + - @backstage/backend-defaults@0.1.7-next.1 + - @backstage/plugin-app-backend@0.3.42-next.1 + ## 0.0.8-next.0 ### Patch Changes diff --git a/packages/backend-next/package.json b/packages/backend-next/package.json index 29aad2b6b3..cc537ef514 100644 --- a/packages/backend-next/package.json +++ b/packages/backend-next/package.json @@ -1,6 +1,6 @@ { "name": "example-backend-next", - "version": "0.0.8-next.0", + "version": "0.0.8-next.1", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/backend-plugin-api/CHANGELOG.md b/packages/backend-plugin-api/CHANGELOG.md index cbdd69cd40..3ad0715538 100644 --- a/packages/backend-plugin-api/CHANGELOG.md +++ b/packages/backend-plugin-api/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/backend-plugin-api +## 0.3.2-next.1 + +### Patch Changes + +- ae88f61e00: The `register` methods passed to `createBackendPlugin` and `createBackendModule` + now have dedicated `BackendPluginRegistrationPoints` and + `BackendModuleRegistrationPoints` arguments, respectively. This lets us make it + clear on a type level that it's not possible to pass in extension points as + dependencies to plugins (should only ever be done for modules). This has no + practical effect on code that was already well behaved. +- Updated dependencies + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.11-next.1 + - @backstage/plugin-permission-common@0.7.3 + ## 0.3.2-next.0 ### Patch Changes diff --git a/packages/backend-plugin-api/api-report.md b/packages/backend-plugin-api/api-report.md index 86917dae11..a7700d81ac 100644 --- a/packages/backend-plugin-api/api-report.md +++ b/packages/backend-plugin-api/api-report.md @@ -22,27 +22,57 @@ export interface BackendFeature { register(reg: BackendRegistrationPoints): void; } -// @public (undocumented) +// @public export interface BackendModuleConfig { - // (undocumented) moduleId: string; - // (undocumented) pluginId: string; // (undocumented) - register( - reg: Omit<BackendRegistrationPoints, 'registerExtensionPoint'>, - ): void; + register(reg: BackendModuleRegistrationPoints): void; } -// @public (undocumented) -export interface BackendPluginConfig { +// @public +export interface BackendModuleRegistrationPoints { // (undocumented) + registerInit< + Deps extends { + [name in string]: unknown; + }, + >(options: { + deps: { + [name in keyof Deps]: ServiceRef<Deps[name]> | ExtensionPoint<Deps[name]>; + }; + init(deps: Deps): Promise<void>; + }): void; +} + +// @public +export interface BackendPluginConfig { id: string; // (undocumented) - register(reg: BackendRegistrationPoints): void; + register(reg: BackendPluginRegistrationPoints): void; } -// @public (undocumented) +// @public +export interface BackendPluginRegistrationPoints { + // (undocumented) + registerExtensionPoint<TExtensionPoint>( + ref: ExtensionPoint<TExtensionPoint>, + impl: TExtensionPoint, + ): void; + // (undocumented) + registerInit< + Deps extends { + [name in string]: unknown; + }, + >(options: { + deps: { + [name in keyof Deps]: ServiceRef<Deps[name]>; + }; + init(deps: Deps): Promise<void>; + }): void; +} + +// @public export interface BackendRegistrationPoints { // (undocumented) registerExtensionPoint<TExtensionPoint>( @@ -116,12 +146,12 @@ export function createBackendModule<TOptions extends [options?: object] = []>( config: BackendModuleConfig | ((...params: TOptions) => BackendModuleConfig), ): (...params: TOptions) => BackendFeature; -// @public (undocumented) +// @public export function createBackendPlugin<TOptions extends [options?: object] = []>( config: BackendPluginConfig | ((...params: TOptions) => BackendPluginConfig), ): (...params: TOptions) => BackendFeature; -// @public (undocumented) +// @public export function createExtensionPoint<T>( config: ExtensionPointConfig, ): ExtensionPoint<T>; @@ -248,9 +278,8 @@ export type ExtensionPoint<T> = { $$ref: 'extension-point'; }; -// @public (undocumented) +// @public export interface ExtensionPointConfig { - // (undocumented) id: string; } @@ -476,13 +505,13 @@ export interface ServiceRefConfig<TService, TScope extends 'root' | 'plugin'> { scope?: TScope; } -// @public (undocumented) +// @public export interface SharedBackendEnvironment { // (undocumented) $$type: 'SharedBackendEnvironment'; } -// @public (undocumented) +// @public export interface SharedBackendEnvironmentConfig { // (undocumented) services?: ServiceFactoryOrFunction[]; diff --git a/packages/backend-plugin-api/package.json b/packages/backend-plugin-api/package.json index 41164e7870..954112bc2d 100644 --- a/packages/backend-plugin-api/package.json +++ b/packages/backend-plugin-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-plugin-api", "description": "Core API used by Backstage backend plugins", - "version": "0.3.2-next.0", + "version": "0.3.2-next.1", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-plugin-api/src/wiring/createSharedEnvironment.ts b/packages/backend-plugin-api/src/wiring/createSharedEnvironment.ts index 3258188772..2eb2cdec6a 100644 --- a/packages/backend-plugin-api/src/wiring/createSharedEnvironment.ts +++ b/packages/backend-plugin-api/src/wiring/createSharedEnvironment.ts @@ -16,35 +16,47 @@ import { ServiceFactory, ServiceFactoryOrFunction } from '../services'; -/** @public */ +/** + * The configuration options passed to {@link createSharedEnvironment}. + * + * @public + */ export interface SharedBackendEnvironmentConfig { services?: ServiceFactoryOrFunction[]; } -// This type is opaque in order to allow for future API evolution without -// cluttering the external API. For example we might want to add support -// for more powerful callback based backend modifications. -// -// By making this opaque we also ensure that the type doesn't become an input -// type that we need to care about, as it would otherwise be possible to pass -// a custom environment definition to `createBackend`, which we don't want. /** + * An opaque type that represents the contents of a shared backend environment. + * * @public */ export interface SharedBackendEnvironment { $$type: 'SharedBackendEnvironment'; + + // NOTE: This type is opaque in order to allow for future API evolution without + // cluttering the external API. For example we might want to add support + // for more powerful callback based backend modifications. + // + // By making this opaque we also ensure that the type doesn't become an input + // type that we need to care about, as it would otherwise be possible to pass + // a custom environment definition to `createBackend`, which we don't want. } /** - * This type is NOT supposed to be used by anyone except internally by the backend-app-api package. - * @internal */ + * This type is NOT supposed to be used by anyone except internally by the + * backend-app-api package. + * + * @internal + */ export interface InternalSharedBackendEnvironment { version: 'v1'; services?: ServiceFactory[]; } /** - * Creates a shared backend environment which can be used to create multiple backends + * Creates a shared backend environment which can be used to create multiple + * backends. + * * @public */ export function createSharedEnvironment< diff --git a/packages/backend-plugin-api/src/wiring/factories.ts b/packages/backend-plugin-api/src/wiring/factories.ts index ad2e8edd13..d281335a8e 100644 --- a/packages/backend-plugin-api/src/wiring/factories.ts +++ b/packages/backend-plugin-api/src/wiring/factories.ts @@ -15,17 +15,35 @@ */ import { + BackendModuleRegistrationPoints, + BackendPluginRegistrationPoints, BackendRegistrationPoints, BackendFeature, ExtensionPoint, } from './types'; -/** @public */ +/** + * The configuration options passed to {@link createExtensionPoint}. + * + * @public + * @see {@link https://backstage.io/docs/backend-system/architecture/extension-points | The architecture of extension points} + * @see {@link https://backstage.io/docs/backend-system/architecture/naming-patterns | Recommended naming patterns} + */ export interface ExtensionPointConfig { + /** + * The ID of this extension point. + * + * @see {@link https://backstage.io/docs/backend-system/architecture/naming-patterns | Recommended naming patterns} + */ id: string; } -/** @public */ +/** + * Creates a new backend extension point. + * + * @public + * @see {@link https://backstage.io/docs/backend-system/architecture/extension-points | The architecture of extension points} + */ export function createExtensionPoint<T>( config: ExtensionPointConfig, ): ExtensionPoint<T> { @@ -41,13 +59,30 @@ export function createExtensionPoint<T>( }; } -/** @public */ +/** + * The configuration options passed to {@link createBackendPlugin}. + * + * @public + * @see {@link https://backstage.io/docs/backend-system/architecture/plugins | The architecture of plugins} + * @see {@link https://backstage.io/docs/backend-system/architecture/naming-patterns | Recommended naming patterns} + */ export interface BackendPluginConfig { + /** + * The ID of this plugin. + * + * @see {@link https://backstage.io/docs/backend-system/architecture/naming-patterns | Recommended naming patterns} + */ id: string; - register(reg: BackendRegistrationPoints): void; + register(reg: BackendPluginRegistrationPoints): void; } -/** @public */ +/** + * Creates a new backend plugin. + * + * @public + * @see {@link https://backstage.io/docs/backend-system/architecture/plugins | The architecture of plugins} + * @see {@link https://backstage.io/docs/backend-system/architecture/naming-patterns | Recommended naming patterns} + */ export function createBackendPlugin<TOptions extends [options?: object] = []>( config: BackendPluginConfig | ((...params: TOptions) => BackendPluginConfig), ): (...params: TOptions) => BackendFeature { @@ -58,28 +93,33 @@ export function createBackendPlugin<TOptions extends [options?: object] = []>( return () => config; } -/** @public */ +/** + * The configuration options passed to {@link createBackendModule}. + * + * @public + * @see {@link https://backstage.io/docs/backend-system/architecture/modules | The architecture of modules} + * @see {@link https://backstage.io/docs/backend-system/architecture/naming-patterns | Recommended naming patterns} + */ export interface BackendModuleConfig { + /** + * The ID of this plugin. + * + * @see {@link https://backstage.io/docs/backend-system/architecture/naming-patterns | Recommended naming patterns} + */ pluginId: string; + /** + * Should exactly match the `id` of the plugin that the module extends. + */ moduleId: string; - register( - reg: Omit<BackendRegistrationPoints, 'registerExtensionPoint'>, - ): void; + register(reg: BackendModuleRegistrationPoints): void; } /** * Creates a new backend module for a given plugin. * * @public - * - * @remarks - * - * The `moduleId` should be equal to the module-specific suffix of the exported name, such - * that the full name is `pluginId + "Module" + ModuleId`. For example, a GitHub entity - * provider module for the `catalog` plugin might have the module ID `'githubEntityProvider'`, - * and the full exported name would be `catalogModuleGithubEntityProvider`. - * - * The `pluginId` should exactly match the `id` of the plugin that the module extends. + * @see {@link https://backstage.io/docs/backend-system/architecture/modules | The architecture of modules} + * @see {@link https://backstage.io/docs/backend-system/architecture/naming-patterns | Recommended naming patterns} */ export function createBackendModule<TOptions extends [options?: object] = []>( config: BackendModuleConfig | ((...params: TOptions) => BackendModuleConfig), @@ -96,8 +136,9 @@ export function createBackendModule<TOptions extends [options?: object] = []>( return () => ({ id: `${config.pluginId}.${config.moduleId}`, register(register: BackendRegistrationPoints) { - // TODO: Hide registerExtensionPoint - return config.register(register); + return config.register({ + registerInit: register.registerInit.bind(register), + }); }, }); } diff --git a/packages/backend-plugin-api/src/wiring/index.ts b/packages/backend-plugin-api/src/wiring/index.ts index 0d5999ad12..e0c25eeb4e 100644 --- a/packages/backend-plugin-api/src/wiring/index.ts +++ b/packages/backend-plugin-api/src/wiring/index.ts @@ -30,6 +30,8 @@ export { createExtensionPoint, } from './factories'; export type { + BackendModuleRegistrationPoints, + BackendPluginRegistrationPoints, BackendRegistrationPoints, BackendFeature, ExtensionPoint, diff --git a/packages/backend-plugin-api/src/wiring/types.ts b/packages/backend-plugin-api/src/wiring/types.ts index cdb56ea2e4..6e081f57e5 100644 --- a/packages/backend-plugin-api/src/wiring/types.ts +++ b/packages/backend-plugin-api/src/wiring/types.ts @@ -35,7 +35,13 @@ export type ExtensionPoint<T> = { $$ref: 'extension-point'; }; -/** @public */ +/** + * The callbacks passed to the `register` method of a backend feature; this is + * essentially a superset of {@link BackendPluginRegistrationPoints} and + * {@link BackendModuleRegistrationPoints}. + * + * @public + */ export interface BackendRegistrationPoints { registerExtensionPoint<TExtensionPoint>( ref: ExtensionPoint<TExtensionPoint>, @@ -49,6 +55,38 @@ export interface BackendRegistrationPoints { }): void; } +/** + * The callbacks passed to the `register` method of a backend plugin. + * + * @public + */ +export interface BackendPluginRegistrationPoints { + registerExtensionPoint<TExtensionPoint>( + ref: ExtensionPoint<TExtensionPoint>, + impl: TExtensionPoint, + ): void; + registerInit<Deps extends { [name in string]: unknown }>(options: { + deps: { + [name in keyof Deps]: ServiceRef<Deps[name]>; + }; + init(deps: Deps): Promise<void>; + }): void; +} + +/** + * The callbacks passed to the `register` method of a backend module. + * + * @public + */ +export interface BackendModuleRegistrationPoints { + registerInit<Deps extends { [name in string]: unknown }>(options: { + deps: { + [name in keyof Deps]: ServiceRef<Deps[name]> | ExtensionPoint<Deps[name]>; + }; + init(deps: Deps): Promise<void>; + }): void; +} + /** @public */ export interface BackendFeature { // TODO(Rugvip): Try to get rid of the ID at this level, allowing for a feature to register multiple features as a bundle diff --git a/packages/backend-tasks/CHANGELOG.md b/packages/backend-tasks/CHANGELOG.md index a6a8b85616..04ce4e9c3b 100644 --- a/packages/backend-tasks/CHANGELOG.md +++ b/packages/backend-tasks/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/backend-tasks +## 0.4.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + ## 0.4.3-next.0 ### Patch Changes diff --git a/packages/backend-tasks/package.json b/packages/backend-tasks/package.json index e63077c1e6..574f3dc812 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.4.3-next.0", + "version": "0.4.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md index 47d6023d62..f532e08d81 100644 --- a/packages/backend-test-utils/CHANGELOG.md +++ b/packages/backend-test-utils/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/backend-test-utils +## 0.1.34-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.22.2-next.0 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-app-api@0.3.2-next.1 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.11-next.1 + ## 0.1.34-next.0 ### Patch Changes diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index 949cf9d299..a01dbaf0fa 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.34-next.0", + "version": "0.1.34-next.1", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index bcff085d0b..24b00f192c 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,53 @@ # example-backend +## 0.2.80-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/plugin-tech-insights-backend@0.5.8-next.1 + - @backstage/plugin-tech-insights-node@0.4.0-next.1 + - @backstage/plugin-azure-devops-backend@0.3.21-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/plugin-kubernetes-backend@0.9.3-next.1 + - @backstage/plugin-scaffolder-backend@1.11.0-next.1 + - @backstage/plugin-playlist-backend@0.2.5-next.1 + - example-app@0.2.80-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/integration@1.4.2 + - @backstage/plugin-adr-backend@0.2.7-next.1 + - @backstage/plugin-app-backend@0.3.42-next.1 + - @backstage/plugin-auth-backend@0.17.5-next.1 + - @backstage/plugin-auth-node@0.2.11-next.1 + - @backstage/plugin-azure-sites-backend@0.1.4-next.1 + - @backstage/plugin-badges-backend@0.1.36-next.1 + - @backstage/plugin-catalog-node@1.3.3-next.1 + - @backstage/plugin-code-coverage-backend@0.2.8-next.1 + - @backstage/plugin-events-backend@0.2.3-next.1 + - @backstage/plugin-events-node@0.2.3-next.1 + - @backstage/plugin-explore-backend@0.0.4-next.1 + - @backstage/plugin-graphql-backend@0.1.32-next.1 + - @backstage/plugin-jenkins-backend@0.1.32-next.1 + - @backstage/plugin-kafka-backend@0.2.35-next.1 + - @backstage/plugin-permission-backend@0.5.17-next.1 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-node@0.7.5-next.1 + - @backstage/plugin-proxy-backend@0.2.36-next.1 + - @backstage/plugin-rollbar-backend@0.1.39-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.10-next.1 + - @backstage/plugin-search-backend@1.2.3-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.3-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.3-next.1 + - @backstage/plugin-search-backend-node@1.1.3-next.1 + - @backstage/plugin-search-common@1.2.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.26-next.1 + - @backstage/plugin-techdocs-backend@1.5.3-next.1 + - @backstage/plugin-todo-backend@0.1.39-next.1 + ## 0.2.80-next.0 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index 27c7a60419..76a538560f 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "example-backend", - "version": "0.2.80-next.0", + "version": "0.2.80-next.1", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/catalog-model/examples/components/petstore-component.yaml b/packages/catalog-model/examples/components/petstore-component.yaml index 878fabd551..cdac4ce1ae 100644 --- a/packages/catalog-model/examples/components/petstore-component.yaml +++ b/packages/catalog-model/examples/components/petstore-component.yaml @@ -2,8 +2,11 @@ apiVersion: backstage.io/v1alpha1 kind: Component metadata: name: petstore - # This is an extra long description - description: The Petstore is an example API used to show features of the OpenAPI spec. + # This is an extra long description with Markdown + description: | + [The Petstore](http://petstore.example.com) is an example API used to show features of the OpenAPI spec. + - First item + - Second item links: - url: https://github.com/swagger-api/swagger-petstore title: GitHub Repo diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 25a0704f56..caf890a14f 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/cli +## 0.22.2-next.0 + +### Patch Changes + +- 561df21ea3: The `backstage-cli repo test` command now sets a default Jest `--workerIdleMemoryLimit` of 1GB. If needed to ensure that tests are not run in band, `--maxWorkers=2` is set as well. This is the recommended workaround for dealing with Jest workers leaking memory and eventually hitting the heap limit. +- 2815981057: Show module name causing error during build +- 66cf22fdc4: Updated dependency `esbuild` to `^0.17.0`. +- 6d3abfded1: Switch to inline source maps for test transpilation, simplifying editor setups. +- Updated dependencies + - @backstage/cli-common@0.1.11 + - @backstage/config@1.0.6 + - @backstage/config-loader@1.1.8 + - @backstage/errors@1.1.4 + - @backstage/release-manifests@0.0.8 + - @backstage/types@1.0.2 + ## 0.22.1 ### Patch Changes diff --git a/packages/cli/config/jest.js b/packages/cli/config/jest.js index 24385a6b99..0e74b00d5a 100644 --- a/packages/cli/config/jest.js +++ b/packages/cli/config/jest.js @@ -22,7 +22,6 @@ const { version } = require('../package.json'); const envOptions = { oldTests: Boolean(process.env.BACKSTAGE_OLD_TESTS), - enableSourceMaps: Boolean(process.env.ENABLE_SOURCE_MAPS), }; const transformIgnorePattern = [ @@ -130,7 +129,6 @@ async function getProjectConfig(targetPath, extraConfig) { '\\.(mjs|cjs|js)$': [ require.resolve('./jestSwcTransform'), { - sourceMaps: envOptions.enableSourceMaps || !envOptions.oldTests, jsc: { parser: { syntax: 'ecmascript', @@ -141,7 +139,6 @@ async function getProjectConfig(targetPath, extraConfig) { '\\.jsx$': [ require.resolve('./jestSwcTransform'), { - sourceMaps: envOptions.enableSourceMaps || !envOptions.oldTests, jsc: { parser: { syntax: 'ecmascript', @@ -158,7 +155,6 @@ async function getProjectConfig(targetPath, extraConfig) { '\\.ts$': [ require.resolve('./jestSwcTransform'), { - sourceMaps: envOptions.enableSourceMaps || !envOptions.oldTests, jsc: { parser: { syntax: 'typescript', @@ -169,7 +165,6 @@ async function getProjectConfig(targetPath, extraConfig) { '\\.tsx$': [ require.resolve('./jestSwcTransform'), { - sourceMaps: envOptions.enableSourceMaps || !envOptions.oldTests, jsc: { parser: { syntax: 'typescript', diff --git a/packages/cli/package.json b/packages/cli/package.json index 486a64dcdb..909ac8460c 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.22.1", + "version": "0.22.2-next.0", "publishConfig": { "access": "public" }, @@ -67,7 +67,7 @@ "commander": "^9.1.0", "css-loader": "^6.5.1", "diff": "^5.0.0", - "esbuild": "^0.16.0", + "esbuild": "^0.17.0", "esbuild-loader": "^2.18.0", "eslint": "^8.6.0", "eslint-config-prettier": "^8.3.0", diff --git a/packages/cli/src/commands/repo/test.test.ts b/packages/cli/src/commands/repo/test.test.ts new file mode 100644 index 0000000000..d2f2485717 --- /dev/null +++ b/packages/cli/src/commands/repo/test.test.ts @@ -0,0 +1,47 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { createFlagFinder } from './test'; + +describe('createFlagFinder', () => { + it('finds flags', () => { + const find = createFlagFinder([ + '--foo', + '--no-bar', + '-b', + '-c', + '--baz=1', + '--qux', + '2', + '-de', + ]); + + expect( + find('--foo', '--bar', '-b', '-c', '--baz', '--qux', '-d', '-e'), + ).toBe(true); + expect(find('--foo')).toBe(true); + expect(find('--bar')).toBe(true); + expect(find('--no-bar')).toBe(false); + expect(find('-a')).toBe(false); + expect(find('-b')).toBe(true); + expect(find('-c')).toBe(true); + expect(find('-d')).toBe(true); + expect(find('-e')).toBe(true); + expect(find('--baz')).toBe(true); + expect(find('--qux')).toBe(true); + expect(find('--qux')).toBe(true); + }); +}); diff --git a/packages/cli/src/commands/repo/test.ts b/packages/cli/src/commands/repo/test.ts index 95bfe8f449..2dd778677a 100644 --- a/packages/cli/src/commands/repo/test.ts +++ b/packages/cli/src/commands/repo/test.ts @@ -14,18 +14,36 @@ * limitations under the License. */ +import os from 'os'; import { Command, OptionValues } from 'commander'; import { PackageGraph } from '../../lib/monorepo'; import { paths } from '../../lib/paths'; import { runCheck } from '../../lib/run'; -function includesAnyOf(hayStack: string[], ...needles: string[]) { - for (const needle of needles) { - if (hayStack.includes(needle)) { - return true; +export function createFlagFinder(args: string[]) { + const flags = new Set<string>(); + + for (const arg of args) { + if (arg.startsWith('--no-')) { + flags.add(`--${arg.slice('--no-'.length)}`); + } else if (arg.startsWith('--')) { + flags.add(arg.split('=')[0]); + } else if (arg.startsWith('-')) { + const shortFlags = arg.slice(1).split(''); + for (const shortFlag of shortFlags) { + flags.add(`-${shortFlag}`); + } } } - return false; + + return (...findFlags: string[]) => { + for (const flag of findFlags) { + if (flags.has(flag)) { + return true; + } + } + return false; + }; } function removeOptionArg(args: string[], option: string) { @@ -55,24 +73,19 @@ export async function command(opts: OptionValues, cmd: Command): Promise<void> { const allArgs = parent.args as string[]; const args = allArgs.slice(allArgs.indexOf('test') + 1); + const hasFlags = createFlagFinder(args); + // Only include our config if caller isn't passing their own config - if (!includesAnyOf(args, '-c', '--config')) { + if (!hasFlags('-c', '--config')) { args.push('--config', paths.resolveOwn('config/jest.js')); } - if (!includesAnyOf(args, '--no-passWithNoTests', '--passWithNoTests=false')) { + if (!hasFlags('--passWithNoTests')) { args.push('--passWithNoTests'); } // Run in watch mode unless in CI, coverage mode, or running all tests - if ( - !process.env.CI && - !args.includes('--coverage') && - // explicitly no watching - !includesAnyOf(args, '--no-watch', '--watch=false', '--watchAll=false') && - // already watching - !includesAnyOf(args, '--watch', '--watchAll') - ) { + if (!process.env.CI && !hasFlags('--coverage', '--watch', '--watchAll')) { const isGitRepo = () => runCheck('git', 'rev-parse', '--is-inside-work-tree'); const isMercurialRepo = () => runCheck('hg', '--cwd', '.', 'root'); @@ -84,11 +97,30 @@ export async function command(opts: OptionValues, cmd: Command): Promise<void> { } } + // When running tests from the repo root in large repos you can easily hit the heap limit. + // This is because Jest workers leak a lot of memory, and the workaround is to limit worker memory. + // We set a default memory limit, but if an explicit one is supplied it will be used instead + if (!hasFlags('--workerIdleMemoryLimit')) { + args.push('--workerIdleMemoryLimit=1000M'); + } + + // In order for the above worker memory limit to work we need to make sure the worker + // count is set to at least 2, as the tests will otherwise run in-band. + // Depending on the mode tests are run with the default count is either cpus-1, or cpus/2. + // This means that if we've got at 4 or more cores we'll always get at least 2 workers, but + // otherwise we need to set the worker count explicitly unless already done. + if ( + os.cpus().length <= 3 && + !hasFlags('-i', '--runInBand', '-w', '--maxWorkers') + ) { + args.push('--maxWorkers=2'); + } + if (opts.since) { removeOptionArg(args, '--since'); } - if (opts.since && !args.some(arg => arg.startsWith('--selectProjects'))) { + if (opts.since && !hasFlags('--selectProjects')) { const packages = await PackageGraph.listTargetPackages(); const graph = PackageGraph.fromPackages(packages); const changedPackages = await graph.listChangedPackages({ diff --git a/packages/core-app-api/CHANGELOG.md b/packages/core-app-api/CHANGELOG.md index 0d059f7b46..1d682dbc4a 100644 --- a/packages/core-app-api/CHANGELOG.md +++ b/packages/core-app-api/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/core-app-api +## 1.4.1-next.0 + +### Patch Changes + +- dff4d8ddb1: Fixed an issue where an explicit port the frontend base URL could break the app. +- Updated dependencies + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + ## 1.4.0 ### Minor Changes diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json index 330405d853..391771bd5c 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.4.0", + "version": "1.4.1-next.0", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/core-app-api/src/app/AppManager.test.tsx b/packages/core-app-api/src/app/AppManager.test.tsx index 1b2ac9471a..db0d3ea9af 100644 --- a/packages/core-app-api/src/app/AppManager.test.tsx +++ b/packages/core-app-api/src/app/AppManager.test.tsx @@ -634,6 +634,28 @@ describe('Integration Test', () => { }, }, ], + [ + ['http://localhost', 'http://localhost'], + { + backend: { + baseUrl: 'http://localhost:80', + }, + app: { + baseUrl: 'http://localhost:80', + }, + }, + ], + [ + ['http://localhost', 'http://localhost'], + { + backend: { + baseUrl: 'http://localhost', + }, + app: { + baseUrl: 'http://localhost', + }, + }, + ], [ ['http://localhost/backstage', 'http://localhost/backstage'], { @@ -674,7 +696,7 @@ describe('Integration Test', () => { }, ], ])( - 'should be %p when %p', + 'should be %p when %p (%#)', async ([expectedAppUrl, expectedBackendUrl], data) => { const app = new AppManager({ apis: [], diff --git a/packages/core-app-api/src/app/AppManager.tsx b/packages/core-app-api/src/app/AppManager.tsx index d5f8210185..33d43cbca6 100644 --- a/packages/core-app-api/src/app/AppManager.tsx +++ b/packages/core-app-api/src/app/AppManager.tsx @@ -82,6 +82,17 @@ type CompatiblePlugin = output(): Array<{ type: 'feature-flag'; name: string }>; }); +/** + * Creates a base URL that uses to the current document origin. + */ +function createLocalBaseUrl(fullUrl: string): string { + const url = new URL(fullUrl); + url.protocol = document.location.protocol; + url.hostname = document.location.hostname; + url.port = document.location.port; + return url.toString().replace(/\/$/, ''); +} + function useConfigLoader( configLoader: AppConfigLoader | undefined, components: AppComponents, @@ -121,27 +132,6 @@ function useConfigLoader( if (config.value?.length) { const urlConfigReader = ConfigReader.fromConfigs(config.value); - /** - * Return the origin of the given URL. - * @param url An absolute URL. - * @returns The given URL's origin. - * @throws If fullUrl is not a correctly formatted absolute URL. - */ - const getOrigin = (url: string) => new URL(url).origin; - - /** - * Resolve an absolute URL as relative to the current document. - * @param fullUrl URL to resolve. - * @returns Absolute URL with origin as the current document origin. - * @throws If fullUrl is not a correctly formatted absolute URL. - */ - const overrideOrigin = (fullUrl: string) => { - return new URL( - fullUrl.replace(getOrigin(fullUrl), ''), - document.location.origin, - ).href.replace(/\/$/, ''); - }; - /** * Test configs may not define `app.baseUrl` or `backend.baseUrl` and we * don't want to enforce here. @@ -155,18 +145,18 @@ function useConfigLoader( context: 'relative-resolver', }; if (appBaseUrl && backendBaseUrl) { - const appOrigin = getOrigin(appBaseUrl); - const backendOrigin = getOrigin(backendBaseUrl); + const appOrigin = new URL(appBaseUrl).origin; + const backendOrigin = new URL(backendBaseUrl).origin; if (appOrigin === backendOrigin) { - const newBackendBaseUrl = overrideOrigin(backendBaseUrl); + const newBackendBaseUrl = createLocalBaseUrl(backendBaseUrl); if (backendBaseUrl !== newBackendBaseUrl) { relativeResolverConfig.data.backend = { baseUrl: newBackendBaseUrl }; } } } if (appBaseUrl) { - const newAppBaseUrl = overrideOrigin(appBaseUrl); + const newAppBaseUrl = createLocalBaseUrl(appBaseUrl); if (appBaseUrl !== newAppBaseUrl) { relativeResolverConfig.data.app = { baseUrl: newAppBaseUrl }; } diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md index a46acb0897..efded8f3c1 100644 --- a/packages/core-components/CHANGELOG.md +++ b/packages/core-components/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/core-components +## 0.12.4-next.0 + +### Patch Changes + +- 910015f5b7: The Button component has been deprecated in favor of the LinkButton component +- 20840b36b4: Adds new type, TableOptions, extending Material Table Options. +- 85b04f659a: Internal refactor to not use deprecated `substr` +- Updated dependencies + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/version-bridge@1.0.3 + ## 0.12.3 ### Patch Changes diff --git a/packages/core-components/api-report.md b/packages/core-components/api-report.md index 4cdc42ee79..721c208406 100644 --- a/packages/core-components/api-report.md +++ b/packages/core-components/api-report.md @@ -31,6 +31,7 @@ import MaterialBreadcrumbs from '@material-ui/core/Breadcrumbs'; import { MaterialTableProps } from '@material-table/core'; import { NavLinkProps } from 'react-router-dom'; import { Options } from 'react-markdown'; +import { Options as Options_2 } from '@material-table/core'; import { Overrides } from '@material-ui/core/styles/overrides'; import { ProfileInfo } from '@backstage/core-plugin-api'; import { ProfileInfoApi } from '@backstage/core-plugin-api'; @@ -129,11 +130,11 @@ export type BreadcrumbsStyledBoxClassKey = 'root'; // @public export function BrokenImageIcon(props: IconComponentProps): JSX.Element; -// @public +// @public @deprecated (undocumented) export const Button: (props: ButtonProps) => JSX.Element; -// @public -export type ButtonProps = ButtonProps_2 & Omit<LinkProps, 'variant' | 'color'>; +// @public @deprecated (undocumented) +export type ButtonProps = LinkButtonProps; // @public (undocumented) export type CardActionsTopRightClassKey = 'root'; @@ -629,6 +630,13 @@ export function LinearGauge(props: Props_11): JSX.Element | null; // @public export const Link: (props: LinkProps) => JSX.Element; +// @public +export const LinkButton: (props: ButtonProps) => JSX.Element; + +// @public +export type LinkButtonProps = ButtonProps_2 & + Omit<LinkProps, 'variant' | 'color'>; + // Warning: (ae-missing-release-tag) "LinkProps" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -1392,6 +1400,11 @@ export type TableFiltersClassKey = 'root' | 'value' | 'heder' | 'filters'; // @public (undocumented) export type TableHeaderClassKey = 'header'; +// Warning: (ae-missing-release-tag) "TableOptions" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface TableOptions<T extends object = {}> extends Options_2<T> {} + // Warning: (ae-missing-release-tag) "TableProps" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) diff --git a/packages/core-components/package.json b/packages/core-components/package.json index 72f8b069bf..dc65108d4a 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.12.3", + "version": "0.12.4-next.0", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/core-components/src/components/Avatar/utils.ts b/packages/core-components/src/components/Avatar/utils.ts index d8310f18c0..4f71d736f1 100644 --- a/packages/core-components/src/components/Avatar/utils.ts +++ b/packages/core-components/src/components/Avatar/utils.ts @@ -22,11 +22,11 @@ export function stringToColor(str: string) { let color = '#'; for (let i = 0; i < 3; i++) { const value = (hash >> (i * 8)) & 0xff; - color += `00${value.toString(16)}`.substr(-2); + color += `00${value.toString(16)}`.slice(-2); } return color; } export function extractInitials(value: string) { - return value.match(/\b\w/g)?.join('').substring(0, 2); + return value.match(/\b\w/g)?.join('').slice(0, 2); } diff --git a/packages/core-components/src/components/Button/Button.stories.tsx b/packages/core-components/src/components/LinkButton/LinkButton.stories.tsx similarity index 89% rename from packages/core-components/src/components/Button/Button.stories.tsx rename to packages/core-components/src/components/LinkButton/LinkButton.stories.tsx index ca95316ee8..3dc49abb7f 100644 --- a/packages/core-components/src/components/Button/Button.stories.tsx +++ b/packages/core-components/src/components/LinkButton/LinkButton.stories.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ import React, { ComponentType } from 'react'; -import { Button } from './Button'; +import { LinkButton } from './LinkButton'; import { useLocation } from 'react-router-dom'; import { createRouteRef, useRouteRef } from '@backstage/core-plugin-api'; import Divider from '@material-ui/core/Divider'; @@ -37,7 +37,7 @@ const Location = () => { export default { title: 'Inputs/Button', - component: Button, + component: LinkButton, decorators: [ (Story: ComponentType<{}>) => wrapInTestApp( @@ -80,9 +80,9 @@ export const Default = () => { <pre>color="primary" variant="contained"</pre> </ListItemText> - <Button to={link()} color="primary" variant="contained"> + <LinkButton to={link()} color="primary" variant="contained"> Register Component - </Button> + </LinkButton> </ListItem> <ListItem> <ListItemText> @@ -93,9 +93,9 @@ export const Default = () => { <pre>color="secondary" variant="contained"</pre> </ListItemText> - <Button to={link()} color="secondary" variant="contained"> + <LinkButton to={link()} color="secondary" variant="contained"> Cancel - </Button> + </LinkButton> </ListItem> <ListItem> <ListItemText> @@ -106,9 +106,9 @@ export const Default = () => { <pre>color="default" variant="outlined"</pre> </ListItemText> - <Button to={link()} color="default" variant="outlined"> + <LinkButton to={link()} color="default" variant="outlined"> View Details - </Button> + </LinkButton> </ListItem> </List> ); @@ -128,17 +128,17 @@ export const ButtonLinks = () => { // TODO: Refactor to use new routing mechanisms } <ListItem> - <Button to={link()} color="default" variant="outlined"> + <LinkButton to={link()} color="default" variant="outlined"> Route Ref - </Button> + </LinkButton>   has props for both Material-UI's component as well as for react-router-dom's Route object. </ListItem> <ListItem> - <Button to="/staticpath" color="default" variant="outlined"> + <LinkButton to="/staticpath" color="default" variant="outlined"> Static Path - </Button> + </LinkButton>   links to a statically defined route. In general, this should be avoided. </ListItem> diff --git a/packages/core-components/src/components/Button/Button.test.tsx b/packages/core-components/src/components/LinkButton/LinkButton.test.tsx similarity index 84% rename from packages/core-components/src/components/Button/Button.test.tsx rename to packages/core-components/src/components/LinkButton/LinkButton.test.tsx index c5942e3d78..7dbc42f9cb 100644 --- a/packages/core-components/src/components/Button/Button.test.tsx +++ b/packages/core-components/src/components/LinkButton/LinkButton.test.tsx @@ -17,17 +17,17 @@ import React from 'react'; import { render, fireEvent, act } from '@testing-library/react'; import { wrapInTestApp } from '@backstage/test-utils'; -import { Button } from './Button'; +import { LinkButton } from './LinkButton'; import { Route, Routes } from 'react-router-dom'; -describe('<Button />', () => { +describe('<LinkButton />', () => { it('navigates using react-router', async () => { const testString = 'This is test string'; - const buttonLabel = 'Navigate!'; + const linkButtonLabel = 'Navigate!'; const { getByText } = render( wrapInTestApp( <> - <Button to="/test">{buttonLabel}</Button> + <LinkButton to="/test">{linkButtonLabel}</LinkButton> <Routes> <Route path="/test" element={<p>{testString}</p>} /> </Routes> @@ -37,7 +37,7 @@ describe('<Button />', () => { expect(() => getByText(testString)).toThrow(); await act(async () => { - fireEvent.click(getByText(buttonLabel)); + fireEvent.click(getByText(linkButtonLabel)); }); expect(getByText(testString)).toBeInTheDocument(); }); diff --git a/packages/core-components/src/components/Button/Button.tsx b/packages/core-components/src/components/LinkButton/LinkButton.tsx similarity index 79% rename from packages/core-components/src/components/Button/Button.tsx rename to packages/core-components/src/components/LinkButton/LinkButton.tsx index 575f42b03c..a6ba4d67a7 100644 --- a/packages/core-components/src/components/Button/Button.tsx +++ b/packages/core-components/src/components/LinkButton/LinkButton.tsx @@ -21,14 +21,14 @@ import React from 'react'; import { Link, LinkProps } from '../Link'; /** - * Properties for {@link Button} + * Properties for {@link LinkButton} * * @public * @remarks * * See {@link https://v4.mui.com/api/button/#props | Material-UI Button Props} for all properties */ -export type ButtonProps = MaterialButtonProps & +export type LinkButtonProps = MaterialButtonProps & Omit<LinkProps, 'variant' | 'color'>; /** @@ -43,9 +43,19 @@ const LinkWrapper = React.forwardRef<any, LinkProps>((props, ref) => ( * * @public * @remarks - * - * Makes the Button to utilize react-router */ -export const Button = React.forwardRef<any, ButtonProps>((props, ref) => ( +export const LinkButton = React.forwardRef<any, ButtonProps>((props, ref) => ( <MaterialButton ref={ref} component={LinkWrapper} {...props} /> )) as (props: ButtonProps) => JSX.Element; + +/** + * @public + * @deprecated use LinkButton instead + */ +export const Button = LinkButton; + +/** + * @public + * @deprecated use LinkButtonProps instead + */ +export type ButtonProps = LinkButtonProps; diff --git a/packages/core-components/src/components/Button/index.ts b/packages/core-components/src/components/LinkButton/index.ts similarity index 76% rename from packages/core-components/src/components/Button/index.ts rename to packages/core-components/src/components/LinkButton/index.ts index b3dc40e6e7..848203c2dc 100644 --- a/packages/core-components/src/components/Button/index.ts +++ b/packages/core-components/src/components/LinkButton/index.ts @@ -13,5 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { Button } from './Button'; -export type { ButtonProps } from './Button'; +export { LinkButton } from './LinkButton'; +export type { LinkButtonProps } from './LinkButton'; + +export { Button } from './LinkButton'; +export type { ButtonProps } from './LinkButton'; diff --git a/packages/core-components/src/components/Table/Table.tsx b/packages/core-components/src/components/Table/Table.tsx index c799402cbc..89a1d69b96 100644 --- a/packages/core-components/src/components/Table/Table.tsx +++ b/packages/core-components/src/components/Table/Table.tsx @@ -240,6 +240,8 @@ export interface TableProps<T extends object = {}> onStateChange?: (state: TableState) => any; } +export interface TableOptions<T extends object = {}> extends Options<T> {} + export function TableToolbar(toolbarProps: { toolbarRef: MutableRefObject<any>; setSearch: (value: string) => void; diff --git a/packages/core-components/src/components/Table/index.ts b/packages/core-components/src/components/Table/index.ts index 7fc245d6d0..00e1ae9de5 100644 --- a/packages/core-components/src/components/Table/index.ts +++ b/packages/core-components/src/components/Table/index.ts @@ -22,6 +22,7 @@ export type { TableColumn, TableFilter, TableProps, + TableOptions, TableState, TableClassKey, FiltersContainerClassKey, diff --git a/packages/core-components/src/components/index.ts b/packages/core-components/src/components/index.ts index 473fab8444..0057847754 100644 --- a/packages/core-components/src/components/index.ts +++ b/packages/core-components/src/components/index.ts @@ -16,7 +16,7 @@ export * from './AlertDisplay'; export * from './Avatar'; -export * from './Button'; +export * from './LinkButton'; export * from './CodeSnippet'; export * from './CopyTextButton'; export * from './CreateButton'; @@ -30,6 +30,7 @@ export * from './HeaderIconLinkRow'; export * from './HorizontalScrollGrid'; export * from './Lifecycle'; export * from './Link'; +export * from './LinkButton'; export * from './LogViewer'; export * from './MarkdownContent'; export * from './OAuthRequestDialog'; diff --git a/packages/core-components/src/layout/ErrorBoundary/ErrorBoundary.tsx b/packages/core-components/src/layout/ErrorBoundary/ErrorBoundary.tsx index da430d2f88..9157b57fe2 100644 --- a/packages/core-components/src/layout/ErrorBoundary/ErrorBoundary.tsx +++ b/packages/core-components/src/layout/ErrorBoundary/ErrorBoundary.tsx @@ -16,7 +16,7 @@ import Typography from '@material-ui/core/Typography'; import React, { ComponentClass, Component, ErrorInfo } from 'react'; -import { Button } from '../../components/Button'; +import { Button } from '../../components/LinkButton'; import { ErrorPanel } from '../../components/ErrorPanel'; type SlackChannel = { diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index 6eab052028..4b757a47c9 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/create-app +## 0.4.37-next.1 + +### Patch Changes + +- 86a8dfd7b0: Added a check to ensure that Yarn v1 is used when creating new projects. +- 0eaa579f89: Update `SearchPage` template to use `SearchResult` extensions. +- Updated dependencies + - @backstage/cli-common@0.1.11 + ## 0.4.37-next.0 ### Patch Changes diff --git a/packages/create-app/package.json b/packages/create-app/package.json index 05674c9673..e87dc7b0ac 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/create-app", "description": "A CLI that helps you create your own Backstage app", - "version": "0.4.37-next.0", + "version": "0.4.37-next.1", "publishConfig": { "access": "public" }, diff --git a/packages/create-app/src/lib/tasks.test.ts b/packages/create-app/src/lib/tasks.test.ts index 2894f1ffe9..95ced49490 100644 --- a/packages/create-app/src/lib/tasks.test.ts +++ b/packages/create-app/src/lib/tasks.test.ts @@ -193,27 +193,58 @@ describe('tasks', () => { // requires callback implementation to support `promisify` wrapper // https://stackoverflow.com/a/60579617/10044859 mockExec.mockImplementation((_command, callback) => { - callback(null, 'standard out', 'standard error'); + if (_command === 'yarn --version') { + callback(null, { stdout: '1.22.5', stderr: 'standard error' }); + } else { + callback(null, { stdout: 'standard out', stderr: 'standard error' }); + } }); const appDir = 'projects/dir'; await expect(buildAppTask(appDir)).resolves.not.toThrow(); - expect(mockChdir).toHaveBeenCalledTimes(2); + expect(mockChdir).toHaveBeenCalledTimes(1); expect(mockChdir).toHaveBeenNthCalledWith(1, appDir); - expect(mockChdir).toHaveBeenNthCalledWith(2, appDir); - expect(mockExec).toHaveBeenCalledTimes(2); + expect(mockExec).toHaveBeenCalledTimes(3); expect(mockExec).toHaveBeenNthCalledWith( 1, - 'yarn install', + 'yarn --version', expect.any(Function), ); expect(mockExec).toHaveBeenNthCalledWith( 2, + 'yarn install', + expect.any(Function), + ); + expect(mockExec).toHaveBeenNthCalledWith( + 3, 'yarn tsc', expect.any(Function), ); }); + it('should error out on incorrect yarn version', async () => { + const mockChdir = jest.spyOn(process, 'chdir'); + + // requires callback implementation to support `promisify` wrapper + // https://stackoverflow.com/a/60579617/10044859 + mockExec.mockImplementation((_command, callback) => { + callback(null, { stdout: '3.2.1', stderr: 'standard error' }); + }); + + const appDir = 'projects/dir'; + await expect(buildAppTask(appDir)).rejects.toThrow( + /^@backstage\/create-app requires Yarn v1, found '3\.2\.1'/, + ); + expect(mockChdir).toHaveBeenCalledTimes(1); + expect(mockChdir).toHaveBeenNthCalledWith(1, appDir); + expect(mockExec).toHaveBeenCalledTimes(1); + expect(mockExec).toHaveBeenNthCalledWith( + 1, + 'yarn --version', + expect.any(Function), + ); + }); + it('should fail if project directory does not exist', async () => { const appDir = 'projects/missingProject'; await expect(buildAppTask(appDir)).rejects.toThrow( diff --git a/packages/create-app/src/lib/tasks.ts b/packages/create-app/src/lib/tasks.ts index 23017c8ec7..f158a2d1f1 100644 --- a/packages/create-app/src/lib/tasks.ts +++ b/packages/create-app/src/lib/tasks.ts @@ -199,9 +199,21 @@ export async function createTemporaryAppFolderTask(tempDir: string) { * @param appDir - location of application to build */ export async function buildAppTask(appDir: string) { + process.chdir(appDir); + + await Task.forItem('determining', 'yarn version', async () => { + const result = await exec('yarn --version'); + const yarnVersion = result.stdout?.trim(); + + if (yarnVersion && !yarnVersion.startsWith('1.')) { + throw new Error( + `@backstage/create-app requires Yarn v1, found '${yarnVersion}'. You can migrate the project to Yarn 3 after creation using https://backstage.io/docs/tutorials/yarn-migration`, + ); + } + }); + const runCmd = async (cmd: string) => { await Task.forItem('executing', cmd, async () => { - process.chdir(appDir); await exec(cmd).catch(error => { process.stdout.write(error.stderr); process.stdout.write(error.stdout); diff --git a/packages/create-app/templates/default-app/packages/app/src/components/search/SearchPage.tsx b/packages/create-app/templates/default-app/packages/app/src/components/search/SearchPage.tsx index 9f11d0c80c..1788dde1bd 100644 --- a/packages/create-app/templates/default-app/packages/app/src/components/search/SearchPage.tsx +++ b/packages/create-app/templates/default-app/packages/app/src/components/search/SearchPage.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { makeStyles, Theme, Grid, List, Paper } from '@material-ui/core'; +import { makeStyles, Theme, Grid, Paper } from '@material-ui/core'; import { CatalogSearchResultListItem } from '@backstage/plugin-catalog'; import { @@ -10,7 +10,6 @@ import { TechDocsSearchResultListItem } from '@backstage/plugin-techdocs'; import { SearchType } from '@backstage/plugin-search'; import { - DefaultResultListItem, SearchBar, SearchFilter, SearchResult, @@ -112,41 +111,8 @@ const SearchPage = () => { <Grid item xs={9}> <SearchPagination /> <SearchResult> - {({ results }) => ( - <List> - {results.map(({ type, document, highlight, rank }) => { - switch (type) { - case 'software-catalog': - return ( - <CatalogSearchResultListItem - key={document.location} - result={document} - highlight={highlight} - rank={rank} - /> - ); - case 'techdocs': - return ( - <TechDocsSearchResultListItem - key={document.location} - result={document} - highlight={highlight} - rank={rank} - /> - ); - default: - return ( - <DefaultResultListItem - key={document.location} - result={document} - highlight={highlight} - rank={rank} - /> - ); - } - })} - </List> - )} + <CatalogSearchResultListItem icon={<CatalogIcon />} /> + <TechDocsSearchResultListItem icon={<DocsIcon />} /> </SearchResult> </Grid> </Grid> diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md index 225f8984f4..0b66dd3019 100644 --- a/packages/dev-utils/CHANGELOG.md +++ b/packages/dev-utils/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/dev-utils +## 1.0.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/app-defaults@1.1.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration-react@1.1.10-next.0 + - @backstage/test-utils@1.2.5-next.0 + - @backstage/theme@0.2.16 + ## 1.0.12-next.0 ### Patch Changes diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index c8bcae4365..b00f5e58a2 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/dev-utils", "description": "Utilities for developing Backstage plugins.", - "version": "1.0.12-next.0", + "version": "1.0.12-next.1", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md index 27ee4dd712..5e880265f8 100644 --- a/packages/integration-react/CHANGELOG.md +++ b/packages/integration-react/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/integration-react +## 1.1.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + ## 1.1.9 ### Patch Changes diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index d0eb4e8620..8fdc8d4841 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/integration-react", "description": "Frontend package for managing integrations towards external systems", - "version": "1.1.9", + "version": "1.1.10-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md index 3f00a6a03d..f82207ff06 100644 --- a/packages/techdocs-cli-embedded-app/CHANGELOG.md +++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md @@ -1,5 +1,24 @@ # techdocs-cli-embedded-app +## 0.2.79-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.22.2-next.0 + - @backstage/plugin-techdocs@1.5.0-next.1 + - @backstage/plugin-catalog@1.8.0-next.1 + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/core-components@0.12.4-next.0 + - @backstage/app-defaults@1.1.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration-react@1.1.10-next.0 + - @backstage/test-utils@1.2.5-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-techdocs-react@1.1.3-next.1 + ## 0.2.79-next.0 ### Patch Changes diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index 8c3a970cc2..68d443db99 100644 --- a/packages/techdocs-cli-embedded-app/package.json +++ b/packages/techdocs-cli-embedded-app/package.json @@ -1,6 +1,6 @@ { "name": "techdocs-cli-embedded-app", - "version": "0.2.79-next.0", + "version": "0.2.79-next.1", "private": true, "backstage": { "role": "frontend" @@ -20,7 +20,7 @@ "@backstage/plugin-techdocs-react": "workspace:^", "@backstage/test-utils": "workspace:^", "@backstage/theme": "workspace:^", - "@material-ui/core": "^4.11.0", + "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "history": "^5.0.0", "react": "^17.0.2", diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md index 4b2566e6e2..8e0bc02dca 100644 --- a/packages/techdocs-cli/CHANGELOG.md +++ b/packages/techdocs-cli/CHANGELOG.md @@ -1,5 +1,16 @@ # @techdocs/cli +## 1.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/cli-common@0.1.11 + - @backstage/config@1.0.6 + - @backstage/plugin-techdocs-node@1.4.6-next.1 + ## 1.3.2-next.0 ### Patch Changes diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index f60a95840c..4e6bde27c2 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -1,7 +1,7 @@ { "name": "@techdocs/cli", "description": "Utility CLI for managing TechDocs sites in Backstage.", - "version": "1.3.2-next.0", + "version": "1.3.2-next.1", "publishConfig": { "access": "public" }, diff --git a/packages/test-utils/CHANGELOG.md b/packages/test-utils/CHANGELOG.md index 5738586f5c..72ef042554 100644 --- a/packages/test-utils/CHANGELOG.md +++ b/packages/test-utils/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/test-utils +## 1.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-react@0.4.9 + ## 1.2.4 ### Patch Changes diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index c3f9349390..396bbcc4ed 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/test-utils", "description": "Utilities to test Backstage plugins and apps.", - "version": "1.2.4", + "version": "1.2.5-next.0", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/plugins/adr-backend/CHANGELOG.md b/plugins/adr-backend/CHANGELOG.md index c03478eb10..c791947589 100644 --- a/plugins/adr-backend/CHANGELOG.md +++ b/plugins/adr-backend/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-adr-backend +## 0.2.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/plugin-adr-common@0.2.6-next.0 + - @backstage/plugin-search-common@1.2.1 + ## 0.2.7-next.0 ### Patch Changes diff --git a/plugins/adr-backend/package.json b/plugins/adr-backend/package.json index 17b91e62ef..0c74df5cf2 100644 --- a/plugins/adr-backend/package.json +++ b/plugins/adr-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-adr-backend", - "version": "0.2.7-next.0", + "version": "0.2.7-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/adr/CHANGELOG.md b/plugins/adr/CHANGELOG.md index a1a9592ace..6f9a6b4be6 100644 --- a/plugins/adr/CHANGELOG.md +++ b/plugins/adr/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-adr +## 0.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-search-react@1.5.0-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration-react@1.1.10-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-adr-common@0.2.6-next.0 + - @backstage/plugin-search-common@1.2.1 + ## 0.3.1-next.0 ### Patch Changes diff --git a/plugins/adr/package.json b/plugins/adr/package.json index e8e7de06e6..9d915b7af7 100644 --- a/plugins/adr/package.json +++ b/plugins/adr/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-adr", - "version": "0.3.1-next.0", + "version": "0.3.1-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/airbrake-backend/CHANGELOG.md b/plugins/airbrake-backend/CHANGELOG.md index 3bc712aed4..81a9eb4ae1 100644 --- a/plugins/airbrake-backend/CHANGELOG.md +++ b/plugins/airbrake-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-airbrake-backend +## 0.2.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + ## 0.2.15-next.0 ### Patch Changes diff --git a/plugins/airbrake-backend/package.json b/plugins/airbrake-backend/package.json index f4edd43590..9d56c6defa 100644 --- a/plugins/airbrake-backend/package.json +++ b/plugins/airbrake-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-airbrake-backend", - "version": "0.2.15-next.0", + "version": "0.2.15-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/airbrake/CHANGELOG.md b/plugins/airbrake/CHANGELOG.md index dde141d741..4132257d2e 100644 --- a/plugins/airbrake/CHANGELOG.md +++ b/plugins/airbrake/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-airbrake +## 0.3.15-next.1 + +### Patch Changes + +- 41377156d0: Adds a boolean helper function to airbrake plugin for use on the EntityPage to show/hide airbrake tab depending on whether the entity's catalog-info.yml has an airbrake id set in the metadata +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/dev-utils@1.0.12-next.1 + - @backstage/test-utils@1.2.5-next.0 + - @backstage/theme@0.2.16 + ## 0.3.15-next.0 ### Patch Changes diff --git a/plugins/airbrake/README.md b/plugins/airbrake/README.md index bc30ca7896..f37ab08b75 100644 --- a/plugins/airbrake/README.md +++ b/plugins/airbrake/README.md @@ -18,14 +18,21 @@ The Airbrake plugin provides connectivity between Backstage and Airbrake (https: yarn add --cwd packages/backend @backstage/plugin-airbrake-backend ``` -3. Add the `EntityAirbrakeContent` to `packages/app/src/components/catalog/EntityPage.tsx` for all the entity pages you want Airbrake to be in: +3. Add the `EntityAirbrakeContent` and `isAirbrakeAvailable` to `packages/app/src/components/catalog/EntityPage.tsx` for all the entity pages you want Airbrake to be in: ```typescript jsx - import { EntityAirbrakeContent } from '@backstage/plugin-airbrake'; + import { + EntityAirbrakeContent, + isAirbrakeAvailable, + } from '@backstage/plugin-airbrake'; const serviceEntityPage = ( <EntityLayoutWrapper> - <EntityLayout.Route path="/airbrake" title="Airbrake"> + <EntityLayout.Route + if={isAirbrakeAvailable} + path="/airbrake" + title="Airbrake" + > <EntityAirbrakeContent /> </EntityLayout.Route> </EntityLayoutWrapper> @@ -33,7 +40,11 @@ The Airbrake plugin provides connectivity between Backstage and Airbrake (https: const websiteEntityPage = ( <EntityLayoutWrapper> - <EntityLayout.Route path="/airbrake" title="Airbrake"> + <EntityLayout.Route + if={isAirbrakeAvailable} + path="/airbrake" + title="Airbrake" + > <EntityAirbrakeContent /> </EntityLayout.Route> </EntityLayoutWrapper> @@ -41,7 +52,11 @@ The Airbrake plugin provides connectivity between Backstage and Airbrake (https: const defaultEntityPage = ( <EntityLayoutWrapper> - <EntityLayout.Route path="/airbrake" title="Airbrake"> + <EntityLayout.Route + if={isAirbrakeAvailable} + path="/airbrake" + title="Airbrake" + > <EntityAirbrakeContent /> </EntityLayout.Route> </EntityLayoutWrapper> diff --git a/plugins/airbrake/api-report.md b/plugins/airbrake/api-report.md index e48fbf9cde..773e2a029a 100644 --- a/plugins/airbrake/api-report.md +++ b/plugins/airbrake/api-report.md @@ -6,6 +6,7 @@ /// <reference types="react" /> import { BackstagePlugin } from '@backstage/core-plugin-api'; +import { Entity } from '@backstage/catalog-model'; import { RouteRef } from '@backstage/core-plugin-api'; // @public @@ -19,4 +20,7 @@ export const airbrakePlugin: BackstagePlugin< // @public export const EntityAirbrakeContent: () => JSX.Element; + +// @public +export const isAirbrakeAvailable: (entity: Entity) => boolean; ``` diff --git a/plugins/airbrake/package.json b/plugins/airbrake/package.json index 6ff67eb3b2..d87b734674 100644 --- a/plugins/airbrake/package.json +++ b/plugins/airbrake/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-airbrake", - "version": "0.3.15-next.0", + "version": "0.3.15-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/airbrake/src/components/isAirbrakeAvailable.ts b/plugins/airbrake/src/components/isAirbrakeAvailable.ts new file mode 100644 index 0000000000..01d59668ce --- /dev/null +++ b/plugins/airbrake/src/components/isAirbrakeAvailable.ts @@ -0,0 +1,25 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Entity } from '@backstage/catalog-model'; +import { AIRBRAKE_PROJECT_ID_ANNOTATION } from './useProjectId'; + +/** + * Utility function to determine if the given entity has an Airbrake ID set in the repos catalog-info.yml . + * @public + */ +export const isAirbrakeAvailable = (entity: Entity) => + Boolean(entity.metadata.annotations?.[AIRBRAKE_PROJECT_ID_ANNOTATION]); diff --git a/plugins/airbrake/src/index.ts b/plugins/airbrake/src/index.ts index 2b2406776b..717d544dc9 100644 --- a/plugins/airbrake/src/index.ts +++ b/plugins/airbrake/src/index.ts @@ -22,3 +22,4 @@ export { airbrakePlugin } from './plugin'; export { EntityAirbrakeContent } from './extensions'; +export { isAirbrakeAvailable } from './components/isAirbrakeAvailable'; diff --git a/plugins/allure/CHANGELOG.md b/plugins/allure/CHANGELOG.md index 9936e8c727..4bc73ee469 100644 --- a/plugins/allure/CHANGELOG.md +++ b/plugins/allure/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-allure +## 0.1.31-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.1.31-next.0 ### Patch Changes diff --git a/plugins/allure/package.json b/plugins/allure/package.json index 7398ac2f54..a36762e5ac 100644 --- a/plugins/allure/package.json +++ b/plugins/allure/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-allure", "description": "A Backstage plugin that integrates with Allure", - "version": "0.1.31-next.0", + "version": "0.1.31-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/analytics-module-ga/CHANGELOG.md b/plugins/analytics-module-ga/CHANGELOG.md index d5e21c3b19..0114443617 100644 --- a/plugins/analytics-module-ga/CHANGELOG.md +++ b/plugins/analytics-module-ga/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-analytics-module-ga +## 0.1.26-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.1.25 ### Patch Changes diff --git a/plugins/analytics-module-ga/package.json b/plugins/analytics-module-ga/package.json index 01d9e78cfa..17ee33eea9 100644 --- a/plugins/analytics-module-ga/package.json +++ b/plugins/analytics-module-ga/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-analytics-module-ga", - "version": "0.1.25", + "version": "0.1.26-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/apache-airflow/CHANGELOG.md b/plugins/apache-airflow/CHANGELOG.md index 0b4287a4fb..e597c164a0 100644 --- a/plugins/apache-airflow/CHANGELOG.md +++ b/plugins/apache-airflow/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-apache-airflow +## 0.2.8-next.0 + +### Patch Changes + +- 85b04f659a: Internal refactor to not use deprecated `substr` +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + ## 0.2.7 ### Patch Changes diff --git a/plugins/apache-airflow/package.json b/plugins/apache-airflow/package.json index b22e44e7e6..c589a58557 100644 --- a/plugins/apache-airflow/package.json +++ b/plugins/apache-airflow/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-apache-airflow", - "version": "0.2.7", + "version": "0.2.8-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/apache-airflow/src/components/ScheduleIntervalLabel/ScheduleIntervalLabel.tsx b/plugins/apache-airflow/src/components/ScheduleIntervalLabel/ScheduleIntervalLabel.tsx index 14e8148b50..7bd8445766 100644 --- a/plugins/apache-airflow/src/components/ScheduleIntervalLabel/ScheduleIntervalLabel.tsx +++ b/plugins/apache-airflow/src/components/ScheduleIntervalLabel/ScheduleIntervalLabel.tsx @@ -26,7 +26,7 @@ const timeDeltaToLabel = (delta: TimeDelta): string => { let label = ''; const date = new Date(0); date.setSeconds(delta.seconds); - const time = date.toISOString().substr(11, 8); + const time = date.toISOString().slice(11, 11 + 8); if (delta.days === 0) { label = `${time}`; } else if (delta.days === 1) { diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md index ac424c63cb..b002e4c373 100644 --- a/plugins/api-docs/CHANGELOG.md +++ b/plugins/api-docs/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-api-docs +## 0.8.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.8.0-next.1 + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.8.15-next.0 ### Patch Changes diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index a7ad050db1..e6dd3d6e1f 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-api-docs", "description": "A Backstage plugin that helps represent API entities in the frontend", - "version": "0.8.15-next.0", + "version": "0.8.15-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/apollo-explorer/CHANGELOG.md b/plugins/apollo-explorer/CHANGELOG.md index a123d9c7ed..df9c9d8270 100644 --- a/plugins/apollo-explorer/CHANGELOG.md +++ b/plugins/apollo-explorer/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-apollo-explorer +## 0.1.8-next.0 + +### Patch Changes + +- d950d3e217: Depend on `@material-ui/core` version `^4.12.2` like all other in-repo packages +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.1.7 ### Patch Changes diff --git a/plugins/apollo-explorer/package.json b/plugins/apollo-explorer/package.json index 60fbb7fa7b..713ad945ad 100644 --- a/plugins/apollo-explorer/package.json +++ b/plugins/apollo-explorer/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-apollo-explorer", - "version": "0.1.7", + "version": "0.1.8-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -26,7 +26,7 @@ "@backstage/core-components": "workspace:^", "@backstage/core-plugin-api": "workspace:^", "@backstage/theme": "workspace:^", - "@material-ui/core": "^4.9.13", + "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "^4.0.0-alpha.57", "react-use": "^17.2.4", diff --git a/plugins/app-backend/CHANGELOG.md b/plugins/app-backend/CHANGELOG.md index 92b5e137fd..a8a9ca7edf 100644 --- a/plugins/app-backend/CHANGELOG.md +++ b/plugins/app-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-app-backend +## 0.3.42-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/config@1.0.6 + - @backstage/config-loader@1.1.8 + - @backstage/types@1.0.2 + ## 0.3.42-next.0 ### Patch Changes diff --git a/plugins/app-backend/package.json b/plugins/app-backend/package.json index a2c631be3c..d434749619 100644 --- a/plugins/app-backend/package.json +++ b/plugins/app-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-app-backend", "description": "A Backstage backend plugin that serves the Backstage frontend app", - "version": "0.3.42-next.0", + "version": "0.3.42-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend/CHANGELOG.md b/plugins/auth-backend/CHANGELOG.md index cd39dba0f5..a1bee43423 100644 --- a/plugins/auth-backend/CHANGELOG.md +++ b/plugins/auth-backend/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-auth-backend +## 0.17.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.11-next.1 + ## 0.17.5-next.0 ### Patch Changes diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index 1b47bd6ba5..a95465dbad 100644 --- a/plugins/auth-backend/package.json +++ b/plugins/auth-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend", "description": "A Backstage backend plugin that handles authentication", - "version": "0.17.5-next.0", + "version": "0.17.5-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-node/CHANGELOG.md b/plugins/auth-node/CHANGELOG.md index c675d75b0f..d569650cd5 100644 --- a/plugins/auth-node/CHANGELOG.md +++ b/plugins/auth-node/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-node +## 0.2.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + ## 0.2.11-next.0 ### Patch Changes diff --git a/plugins/auth-node/package.json b/plugins/auth-node/package.json index 5b1c29c7d7..5d0748cdee 100644 --- a/plugins/auth-node/package.json +++ b/plugins/auth-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-node", - "version": "0.2.11-next.0", + "version": "0.2.11-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-devops-backend/CHANGELOG.md b/plugins/azure-devops-backend/CHANGELOG.md index 7cfd680a24..2c7f39f8b3 100644 --- a/plugins/azure-devops-backend/CHANGELOG.md +++ b/plugins/azure-devops-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-azure-devops-backend +## 0.3.21-next.1 + +### Patch Changes + +- cc926a59bd: Fixed a bug where the azure devops host in URLs on the readme card was being URL encoded, breaking hosts with ports. +- 85b04f659a: Internal refactor to not use deprecated `substr` +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/plugin-azure-devops-common@0.3.0 + ## 0.3.21-next.0 ### Patch Changes diff --git a/plugins/azure-devops-backend/package.json b/plugins/azure-devops-backend/package.json index 4960d8e56a..c62602a8f5 100644 --- a/plugins/azure-devops-backend/package.json +++ b/plugins/azure-devops-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-devops-backend", - "version": "0.3.21-next.0", + "version": "0.3.21-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts index 24c13020b6..87ded2f0e9 100644 --- a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts +++ b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts @@ -434,7 +434,7 @@ export function mappedRepoBuild(build: Build): RepoBuild { queueTime: build.queueTime?.toISOString(), startTime: build.startTime?.toISOString(), finishTime: build.finishTime?.toISOString(), - source: `${build.sourceBranch} (${build.sourceVersion?.substr(0, 8)})`, + source: `${build.sourceBranch} (${build.sourceVersion?.slice(0, 8)})`, uniqueName: build.requestedFor?.uniqueName ?? 'N/A', }; } @@ -489,7 +489,7 @@ export function mappedBuildRun(build: Build): BuildRun { queueTime: build.queueTime?.toISOString(), startTime: build.startTime?.toISOString(), finishTime: build.finishTime?.toISOString(), - source: `${build.sourceBranch} (${build.sourceVersion?.substr(0, 8)})`, + source: `${build.sourceBranch} (${build.sourceVersion?.slice(0, 8)})`, uniqueName: build.requestedFor?.uniqueName ?? 'N/A', }; } diff --git a/plugins/azure-devops-backend/src/utils/azure-devops-utils.test.ts b/plugins/azure-devops-backend/src/utils/azure-devops-utils.test.ts index 4b912a8340..427980be14 100644 --- a/plugins/azure-devops-backend/src/utils/azure-devops-utils.test.ts +++ b/plugins/azure-devops-backend/src/utils/azure-devops-utils.test.ts @@ -27,6 +27,7 @@ import { getAvatarUrl, getPullRequestLink, replaceReadme, + buildEncodedUrl, } from './azure-devops-utils'; import { GitPullRequest } from 'azure-devops-node-api/interfaces/GitInterfaces'; import { UrlReader } from '@backstage/backend-common'; @@ -278,3 +279,19 @@ describe('replaceReadme', () => { expect(expected).toBe(result); }); }); + +describe('buildEncodedUrl', () => { + it('should not encode the colon between host and port', async () => { + const result = await buildEncodedUrl( + 'tfs.myorg.com:8443', + 'org', + 'project', + 'repo', + 'path', + ); + + expect(result).toBe( + 'https://tfs.myorg.com:8443/org/project/_git/repo?path=path', + ); + }); +}); diff --git a/plugins/azure-devops-backend/src/utils/azure-devops-utils.ts b/plugins/azure-devops-backend/src/utils/azure-devops-utils.ts index 0aafb54a0a..aa946e7a74 100644 --- a/plugins/azure-devops-backend/src/utils/azure-devops-utils.ts +++ b/plugins/azure-devops-backend/src/utils/azure-devops-utils.ts @@ -242,12 +242,11 @@ export function buildEncodedUrl( repo: string, path: string, ): string { - const encodedHost = encodeURIComponent(host); const encodedOrg = encodeURIComponent(org); const encodedProject = encodeURIComponent(project); const encodedRepo = encodeURIComponent(repo); const encodedPath = encodeURIComponent(path); - return `https://${encodedHost}/${encodedOrg}/${encodedProject}/_git/${encodedRepo}?path=${encodedPath}`; + return `https://${host}/${encodedOrg}/${encodedProject}/_git/${encodedRepo}?path=${encodedPath}`; } function convertReviewer( diff --git a/plugins/azure-devops/CHANGELOG.md b/plugins/azure-devops/CHANGELOG.md index 1a0d559ab1..e6ab23c37c 100644 --- a/plugins/azure-devops/CHANGELOG.md +++ b/plugins/azure-devops/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-azure-devops +## 0.2.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-azure-devops-common@0.3.0 + ## 0.2.6-next.0 ### Patch Changes diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json index 87c9521443..71ff024078 100644 --- a/plugins/azure-devops/package.json +++ b/plugins/azure-devops/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-devops", - "version": "0.2.6-next.0", + "version": "0.2.6-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-sites-backend/CHANGELOG.md b/plugins/azure-sites-backend/CHANGELOG.md index be020f508b..30e29db0ae 100644 --- a/plugins/azure-sites-backend/CHANGELOG.md +++ b/plugins/azure-sites-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-azure-sites-backend +## 0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/plugin-azure-sites-common@0.1.0 + ## 0.1.4-next.0 ### Patch Changes diff --git a/plugins/azure-sites-backend/package.json b/plugins/azure-sites-backend/package.json index 829ed89f6a..fbc98b0d5e 100644 --- a/plugins/azure-sites-backend/package.json +++ b/plugins/azure-sites-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-sites-backend", - "version": "0.1.4-next.0", + "version": "0.1.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-sites/CHANGELOG.md b/plugins/azure-sites/CHANGELOG.md index 0b7ea2a680..32c55b424c 100644 --- a/plugins/azure-sites/CHANGELOG.md +++ b/plugins/azure-sites/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-azure-sites +## 0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-azure-sites-common@0.1.0 + ## 0.1.4-next.0 ### Patch Changes diff --git a/plugins/azure-sites/package.json b/plugins/azure-sites/package.json index b636065426..a2032f9292 100644 --- a/plugins/azure-sites/package.json +++ b/plugins/azure-sites/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-sites", - "version": "0.1.4-next.0", + "version": "0.1.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/badges-backend/CHANGELOG.md b/plugins/badges-backend/CHANGELOG.md index 1a703ba72f..c3ed18ac63 100644 --- a/plugins/badges-backend/CHANGELOG.md +++ b/plugins/badges-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-badges-backend +## 0.1.36-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + ## 0.1.36-next.0 ### Patch Changes diff --git a/plugins/badges-backend/package.json b/plugins/badges-backend/package.json index bcc39f4c96..33e945bfd0 100644 --- a/plugins/badges-backend/package.json +++ b/plugins/badges-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-badges-backend", "description": "A Backstage backend plugin that generates README badges for your entities", - "version": "0.1.36-next.0", + "version": "0.1.36-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/badges/CHANGELOG.md b/plugins/badges/CHANGELOG.md index 0ee582ecea..c58757b38d 100644 --- a/plugins/badges/CHANGELOG.md +++ b/plugins/badges/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-badges +## 0.2.39-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + ## 0.2.39-next.0 ### Patch Changes diff --git a/plugins/badges/package.json b/plugins/badges/package.json index 717224216d..8e6eb3c88d 100644 --- a/plugins/badges/package.json +++ b/plugins/badges/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-badges", "description": "A Backstage plugin that generates README badges for your entities", - "version": "0.2.39-next.0", + "version": "0.2.39-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bazaar-backend/CHANGELOG.md b/plugins/bazaar-backend/CHANGELOG.md index 6c98a2125d..6fc165aebc 100644 --- a/plugins/bazaar-backend/CHANGELOG.md +++ b/plugins/bazaar-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-bazaar-backend +## 0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-test-utils@0.1.34-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.11-next.1 + ## 0.2.5-next.0 ### Patch Changes diff --git a/plugins/bazaar-backend/package.json b/plugins/bazaar-backend/package.json index fe9893dbbb..166aca7c44 100644 --- a/plugins/bazaar-backend/package.json +++ b/plugins/bazaar-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bazaar-backend", - "version": "0.2.5-next.0", + "version": "0.2.5-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bazaar/CHANGELOG.md b/plugins/bazaar/CHANGELOG.md index aab91930cb..a24a4164ce 100644 --- a/plugins/bazaar/CHANGELOG.md +++ b/plugins/bazaar/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-bazaar +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.22.2-next.0 + - @backstage/plugin-catalog@1.8.0-next.1 + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + ## 0.2.4-next.0 ### Patch Changes diff --git a/plugins/bazaar/package.json b/plugins/bazaar/package.json index c949415d13..d4d88176d8 100644 --- a/plugins/bazaar/package.json +++ b/plugins/bazaar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bazaar", - "version": "0.2.4-next.0", + "version": "0.2.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bitrise/CHANGELOG.md b/plugins/bitrise/CHANGELOG.md index a41c9ed630..be81c9f7af 100644 --- a/plugins/bitrise/CHANGELOG.md +++ b/plugins/bitrise/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-bitrise +## 0.1.42-next.1 + +### Patch Changes + +- 85b04f659a: Internal refactor to not use deprecated `substr` +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.1.42-next.0 ### Patch Changes diff --git a/plugins/bitrise/package.json b/plugins/bitrise/package.json index cf3515aa89..3f064430cc 100644 --- a/plugins/bitrise/package.json +++ b/plugins/bitrise/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-bitrise", "description": "A Backstage plugin that integrates towards Bitrise", - "version": "0.1.42-next.0", + "version": "0.1.42-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bitrise/src/components/BitriseBuildsTableComponent/BitriseBuildsTableComponent.tsx b/plugins/bitrise/src/components/BitriseBuildsTableComponent/BitriseBuildsTableComponent.tsx index 0966de3377..3f6ebf93f4 100644 --- a/plugins/bitrise/src/components/BitriseBuildsTableComponent/BitriseBuildsTableComponent.tsx +++ b/plugins/bitrise/src/components/BitriseBuildsTableComponent/BitriseBuildsTableComponent.tsx @@ -81,7 +81,7 @@ const renderSource = (build: BitriseBuildResult): React.ReactNode => { rel="noreferrer" startIcon={<GitHubIcon />} > - {build.commitHash.substr(0, 6)} + {build.commitHash.slice(0, 6)} </Button> ) : null; }; diff --git a/plugins/catalog-backend-module-aws/CHANGELOG.md b/plugins/catalog-backend-module-aws/CHANGELOG.md index 39c217fc58..bea397e7b5 100644 --- a/plugins/catalog-backend-module-aws/CHANGELOG.md +++ b/plugins/catalog-backend-module-aws/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-backend-module-aws +## 0.1.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-node@1.3.3-next.1 + ## 0.1.15-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json index 4ccc463937..083ed52fab 100644 --- a/plugins/catalog-backend-module-aws/package.json +++ b/plugins/catalog-backend-module-aws/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-aws", "description": "A Backstage catalog backend module that helps integrate towards AWS", - "version": "0.1.15-next.0", + "version": "0.1.15-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-azure/CHANGELOG.md b/plugins/catalog-backend-module-azure/CHANGELOG.md index 33d4ea499c..c71b691a7a 100644 --- a/plugins/catalog-backend-module-azure/CHANGELOG.md +++ b/plugins/catalog-backend-module-azure/CHANGELOG.md @@ -1,5 +1,49 @@ # @backstage/plugin-catalog-backend-module-azure +## 0.1.13-next.1 + +### Patch Changes + +- 2890f47517: This will add the ability to use Azure DevOps with multi project with a single value which is a new feature as previously this had to be done manually for each project that you wanted to add. + + Right now you would have to fill in multiple values in the config to use multiple projects: + + ``` + yourFirstProviderId: # identifies your dataset / provider independent of config changes + organization: myorg + project: 'firstProject' # this will match the firstProject project + repository: '*' # this will match all repos + path: /catalog-info.yaml + yourSecondProviderId: # identifies your dataset / provider independent of config changes + organization: myorg + project: 'secondProject' # this will match the secondProject project + repository: '*' # this will match all repos + path: /catalog-info.yaml + ``` + + With this change you can actually have all projects available where your PAT determines which you have access to, so that includes multiple projects: + + ``` + yourFirstProviderId: # identifies your dataset / provider independent of config changes + organization: myorg + project: '*' # this will match all projects where your PAT has access to + repository: '*' # this will match all repos + path: /catalog-info.yaml + ``` + +- 85b04f659a: Internal refactor to not use deprecated `substr` +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-node@1.3.3-next.1 + ## 0.1.13-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-azure/package.json b/plugins/catalog-backend-module-azure/package.json index 366a4e05ee..da7d1f5aa3 100644 --- a/plugins/catalog-backend-module-azure/package.json +++ b/plugins/catalog-backend-module-azure/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-azure", "description": "A Backstage catalog backend module that helps integrate towards Azure", - "version": "0.1.13-next.0", + "version": "0.1.13-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-azure/src/lib/azure.test.ts b/plugins/catalog-backend-module-azure/src/lib/azure.test.ts index 16f5067197..f26208353a 100644 --- a/plugins/catalog-backend-module-azure/src/lib/azure.test.ts +++ b/plugins/catalog-backend-module-azure/src/lib/azure.test.ts @@ -29,11 +29,11 @@ describe('azure', () => { server.use( rest.post( - `https://almsearch.dev.azure.com/shopify/engineering/_apis/search/codesearchresults`, + `https://almsearch.dev.azure.com/shopify/_apis/search/codesearchresults`, (req, res, ctx) => { expect(req.headers.get('Authorization')).toBe('Basic OkFCQw=='); expect(req.body).toEqual({ - searchText: 'path:/catalog-info.yaml repo:*', + searchText: 'path:/catalog-info.yaml repo:* proj:engineering', $skip: 0, $top: 1000, }); @@ -64,6 +64,9 @@ describe('azure', () => { repository: { name: 'backstage', }, + project: { + name: 'backstage', + }, }, { fileName: 'catalog-info.yaml', @@ -71,17 +74,20 @@ describe('azure', () => { repository: { name: 'ios-app', }, + project: { + name: 'backstage', + }, }, ], }; server.use( rest.post( - `https://almsearch.dev.azure.com/shopify/engineering/_apis/search/codesearchresults`, + `https://almsearch.dev.azure.com/shopify/_apis/search/codesearchresults`, (req, res, ctx) => { expect(req.headers.get('Authorization')).toBe('Basic OkFCQw=='); expect(req.body).toEqual({ - searchText: 'path:/catalog-info.yaml repo:*', + searchText: 'path:/catalog-info.yaml repo:* proj:engineering', $skip: 0, $top: 1000, }); @@ -108,6 +114,9 @@ describe('azure', () => { { fileName: 'catalog-info.yaml', path: '/catalog-info.yaml', + project: { + name: '*', + }, repository: { name: 'backstage', }, @@ -117,11 +126,12 @@ describe('azure', () => { server.use( rest.post( - `https://almsearch.dev.azure.com/shopify/engineering/_apis/search/codesearchresults`, + `https://almsearch.dev.azure.com/shopify/_apis/search/codesearchresults`, (req, res, ctx) => { expect(req.headers.get('Authorization')).toBe('Basic OkFCQw=='); expect(req.body).toEqual({ - searchText: 'path:/catalog-info.yaml repo:backstage', + searchText: + 'path:/catalog-info.yaml repo:backstage proj:engineering', $skip: 0, $top: 1000, }); @@ -151,17 +161,20 @@ describe('azure', () => { repository: { name: 'backstage', }, + project: { + name: '*', + }, }, ], }; server.use( rest.post( - `https://azuredevops.mycompany.com/shopify/engineering/_apis/search/codesearchresults`, + `https://azuredevops.mycompany.com/shopify/_apis/search/codesearchresults`, (req, res, ctx) => { expect(req.headers.get('Authorization')).toBe('Basic OkFCQw=='); expect(req.body).toEqual({ - searchText: 'path:/catalog-info.yaml repo:*', + searchText: 'path:/catalog-info.yaml repo:* proj:engineering', $skip: 0, $top: 1000, }); @@ -190,16 +203,20 @@ describe('azure', () => { repository: { name: 'backstage', }, + project: { + name: 'engineering', + }, })); }; server.use( rest.post( - `https://almsearch.dev.azure.com/shopify/engineering/_apis/search/codesearchresults`, + `https://almsearch.dev.azure.com/shopify/_apis/search/codesearchresults`, (req, res, ctx) => { expect(req.headers.get('Authorization')).toBe('Basic OkFCQw=='); expect(req.body).toMatchObject({ - searchText: 'path:/catalog-info.yaml repo:backstage', + searchText: + 'path:/catalog-info.yaml repo:backstage proj:engineering', $top: 1000, }); diff --git a/plugins/catalog-backend-module-azure/src/lib/azure.ts b/plugins/catalog-backend-module-azure/src/lib/azure.ts index 316c9b0b8c..0c96d133d3 100644 --- a/plugins/catalog-backend-module-azure/src/lib/azure.ts +++ b/plugins/catalog-backend-module-azure/src/lib/azure.ts @@ -31,6 +31,9 @@ export interface CodeSearchResultItem { repository: { name: string; }; + project: { + name: string; + }; } const isCloud = (host: string) => host === 'dev.azure.com'; @@ -47,7 +50,7 @@ export async function codeSearch( const searchBaseUrl = isCloud(azureConfig.host) ? 'https://almsearch.dev.azure.com' : `https://${azureConfig.host}`; - const searchUrl = `${searchBaseUrl}/${org}/${project}/_apis/search/codesearchresults?api-version=6.0-preview.1`; + const searchUrl = `${searchBaseUrl}/${org}/_apis/search/codesearchresults?api-version=6.0-preview.1`; let items: CodeSearchResultItem[] = []; let hasMorePages = true; @@ -59,7 +62,7 @@ export async function codeSearch( }), method: 'POST', body: JSON.stringify({ - searchText: `path:${path} repo:${repo || '*'}`, + searchText: `path:${path} repo:${repo || '*'} proj:${project || '*'}`, $skip: items.length, $top: PAGE_SIZE, }), diff --git a/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.test.ts b/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.test.ts index 9000b177fa..38df737179 100644 --- a/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.test.ts +++ b/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.test.ts @@ -135,6 +135,9 @@ describe('AzureDevOpsDiscoveryProcessor', () => { { fileName: 'catalog-info.yaml', path: '/catalog-info.yaml', + project: { + name: '*', + }, repository: { name: 'backstage', }, @@ -142,6 +145,9 @@ describe('AzureDevOpsDiscoveryProcessor', () => { { fileName: 'catalog-info.yaml', path: '/src/catalog-info.yaml', + project: { + name: '*', + }, repository: { name: 'ios-app', }, @@ -191,6 +197,9 @@ describe('AzureDevOpsDiscoveryProcessor', () => { repository: { name: 'backstage', }, + project: { + name: '*', + }, }, ]); const emitter = jest.fn(); @@ -229,6 +238,9 @@ describe('AzureDevOpsDiscoveryProcessor', () => { repository: { name: 'backstage', }, + project: { + name: '*', + }, }, ]); const emitter = jest.fn(); diff --git a/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.ts b/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.ts index ad63fef810..4852edbb03 100644 --- a/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.ts +++ b/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.ts @@ -132,7 +132,7 @@ export function parseUrl(urlString: string): { catalogPath: string; } { const url = new URL(urlString); - const path = url.pathname.substr(1).split('/'); + const path = url.pathname.slice(1).split('/'); const catalogPath = url.searchParams.get('path') || '/catalog-info.yaml'; diff --git a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.test.ts b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.test.ts index f7a63f259e..dff1164899 100644 --- a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.test.ts +++ b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.test.ts @@ -164,6 +164,9 @@ describe('AzureDevOpsEntityProvider', () => { repository: { name: 'myrepo', }, + project: { + name: 'myproject', + }, }, ], 'https://dev.azure.com/myorganization/myproject', @@ -189,6 +192,9 @@ describe('AzureDevOpsEntityProvider', () => { repository: { name: 'myrepo', }, + project: { + name: 'myproject', + }, }, { fileName: 'catalog-info.yaml', @@ -196,6 +202,9 @@ describe('AzureDevOpsEntityProvider', () => { repository: { name: 'myotherrepo', }, + project: { + name: 'myproject', + }, }, ], 'https://dev.azure.com/myorganization/myproject', @@ -277,6 +286,9 @@ describe('AzureDevOpsEntityProvider', () => { repository: { name: 'myrepo', }, + project: { + name: 'myproject', + }, }, { fileName: 'catalog-info.yaml', @@ -284,6 +296,9 @@ describe('AzureDevOpsEntityProvider', () => { repository: { name: 'myotherrepo', }, + project: { + name: 'myproject', + }, }, ], 'https://dev.azure.com/myorganization/myproject', diff --git a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts index 98b951bd46..788b9c2f05 100644 --- a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts +++ b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts @@ -166,15 +166,17 @@ export class AzureDevOpsEntityProvider implements EntityProvider { } private createLocationSpec(file: CodeSearchResultItem): LocationSpec { + const target = this.createObjectUrl(file); + return { type: 'url', - target: this.createObjectUrl(file), + target: target, presence: 'required', }; } private createObjectUrl(file: CodeSearchResultItem): string { - const baseUrl = `https://${this.config.host}/${this.config.organization}/${this.config.project}`; + const baseUrl = `https://${this.config.host}/${this.config.organization}/${file.project.name}`; return encodeURI( `${baseUrl}/_git/${file.repository.name}?path=${file.path}`, ); diff --git a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md index 71a876e98a..4cd4b6565c 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-catalog-backend-module-bitbucket-cloud +## 0.1.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/integration@1.4.2 + - @backstage/plugin-bitbucket-cloud-common@0.2.3 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.1 + - @backstage/plugin-events-node@0.2.3-next.1 + ## 0.1.9-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-cloud/package.json b/plugins/catalog-backend-module-bitbucket-cloud/package.json index 9b1c18ddb2..1e1f94ac38 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/package.json +++ b/plugins/catalog-backend-module-bitbucket-cloud/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-cloud", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket Cloud", - "version": "0.1.9-next.0", + "version": "0.1.9-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md index 1290c701b6..ef7755cf0d 100644 --- a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-catalog-backend-module-bitbucket-server +## 0.1.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/plugin-catalog-node@1.3.3-next.1 + ## 0.1.7-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-server/package.json b/plugins/catalog-backend-module-bitbucket-server/package.json index b9b1eff3d4..eba6a276ad 100644 --- a/plugins/catalog-backend-module-bitbucket-server/package.json +++ b/plugins/catalog-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-server", - "version": "0.1.7-next.0", + "version": "0.1.7-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-bitbucket/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket/CHANGELOG.md index 390601b255..455abd3f2b 100644 --- a/plugins/catalog-backend-module-bitbucket/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-catalog-backend-module-bitbucket +## 0.2.9-next.1 + +### Patch Changes + +- 85b04f659a: Internal refactor to not use deprecated `substr` +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-bitbucket-cloud-common@0.2.3 + ## 0.2.9-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket/package.json b/plugins/catalog-backend-module-bitbucket/package.json index e5bb59e93d..646f9af81e 100644 --- a/plugins/catalog-backend-module-bitbucket/package.json +++ b/plugins/catalog-backend-module-bitbucket/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket", - "version": "0.2.9-next.0", + "version": "0.2.9-next.1", "deprecated": true, "main": "src/index.ts", "types": "src/index.ts", diff --git a/plugins/catalog-backend-module-bitbucket/src/BitbucketDiscoveryProcessor.ts b/plugins/catalog-backend-module-bitbucket/src/BitbucketDiscoveryProcessor.ts index 6924765483..78aa3eacfd 100644 --- a/plugins/catalog-backend-module-bitbucket/src/BitbucketDiscoveryProcessor.ts +++ b/plugins/catalog-backend-module-bitbucket/src/BitbucketDiscoveryProcessor.ts @@ -342,7 +342,7 @@ function parseUrl(urlString: string): { const url = new URL(urlString); const indexOfProjectSegment = url.pathname.toLowerCase().indexOf('/projects/') + 1; - const path = url.pathname.substr(indexOfProjectSegment).split('/'); + const path = url.pathname.slice(indexOfProjectSegment).split('/'); // /projects/backstage/repos/techdocs-*/catalog-info.yaml if (path.length > 3 && path[1].length && path[3].length) { @@ -373,7 +373,7 @@ function parseBitbucketCloudUrl(urlString: string): { searchEnabled: boolean; } { const url = new URL(urlString); - const pathMap = readPathParameters(url.pathname.substr(1).split('/')); + const pathMap = readPathParameters(url.pathname.slice(1).split('/')); const query = url.searchParams; if (!pathMap.has('workspaces')) { diff --git a/plugins/catalog-backend-module-gerrit/CHANGELOG.md b/plugins/catalog-backend-module-gerrit/CHANGELOG.md index 80723a0f97..f048780bb7 100644 --- a/plugins/catalog-backend-module-gerrit/CHANGELOG.md +++ b/plugins/catalog-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-catalog-backend-module-gerrit +## 0.1.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/plugin-catalog-node@1.3.3-next.1 + ## 0.1.10-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json index 0ab3e69749..f2327ed216 100644 --- a/plugins/catalog-backend-module-gerrit/package.json +++ b/plugins/catalog-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gerrit", - "version": "0.1.10-next.0", + "version": "0.1.10-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-github/CHANGELOG.md b/plugins/catalog-backend-module-github/CHANGELOG.md index d8d457c0c4..430615eabd 100644 --- a/plugins/catalog-backend-module-github/CHANGELOG.md +++ b/plugins/catalog-backend-module-github/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-catalog-backend-module-github +## 0.2.5-next.1 + +### Patch Changes + +- 66158754b4: Add support for filtering out forks +- 85b04f659a: Internal refactor to not use deprecated `substr` +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.1 + - @backstage/plugin-events-node@0.2.3-next.1 + ## 0.2.5-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-github/config.d.ts b/plugins/catalog-backend-module-github/config.d.ts index 691caedc46..37852223c1 100644 --- a/plugins/catalog-backend-module-github/config.d.ts +++ b/plugins/catalog-backend-module-github/config.d.ts @@ -86,6 +86,10 @@ export interface Config { /** * (Optional) GitHub topic-based filters. */ + allowForks?: boolean; + /** + * (Optional) Allow Forks to be evaluated. + */ topic?: { /** * (Optional) An array of strings used to filter in results based on their associated GitHub topics. @@ -143,6 +147,10 @@ export interface Config { /** * (Optional) GitHub topic-based filters. */ + allowForks?: boolean; + /** + * (Optional) Allow Forks to be evaluated. + */ topic?: { /** * (Optional) An array of strings used to filter in results based on their associated GitHub topics. diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json index ae485f101f..d72d520f6a 100644 --- a/plugins/catalog-backend-module-github/package.json +++ b/plugins/catalog-backend-module-github/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-github", "description": "A Backstage catalog backend module that helps integrate towards GitHub", - "version": "0.2.5-next.0", + "version": "0.2.5-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-github/src/lib/github.test.ts b/plugins/catalog-backend-module-github/src/lib/github.test.ts index 387dc8a2ee..624ea5c3c9 100644 --- a/plugins/catalog-backend-module-github/src/lib/github.test.ts +++ b/plugins/catalog-backend-module-github/src/lib/github.test.ts @@ -488,6 +488,7 @@ describe('github', () => { name: 'backstage', url: 'https://github.com/backstage/backstage', isArchived: false, + isFork: false, repositoryTopics: { nodes: [{ topic: { name: 'blah' } }], }, @@ -500,6 +501,7 @@ describe('github', () => { name: 'demo', url: 'https://github.com/backstage/demo', isArchived: true, + isFork: true, repositoryTopics: { nodes: [] }, defaultBranchRef: { name: 'main', @@ -524,6 +526,7 @@ describe('github', () => { name: 'backstage', url: 'https://github.com/backstage/backstage', isArchived: false, + isFork: false, repositoryTopics: { nodes: [{ topic: { name: 'blah' } }], }, @@ -536,6 +539,7 @@ describe('github', () => { name: 'demo', url: 'https://github.com/backstage/demo', isArchived: true, + isFork: true, repositoryTopics: { nodes: [] }, defaultBranchRef: { name: 'main', diff --git a/plugins/catalog-backend-module-github/src/lib/github.ts b/plugins/catalog-backend-module-github/src/lib/github.ts index f719e3d506..ae6e14fc23 100644 --- a/plugins/catalog-backend-module-github/src/lib/github.ts +++ b/plugins/catalog-backend-module-github/src/lib/github.ts @@ -89,6 +89,7 @@ export type RepositoryResponse = { name: string; url: string; isArchived: boolean; + isFork: boolean; repositoryTopics: RepositoryTopics; defaultBranchRef: { name: string; @@ -435,6 +436,7 @@ export async function getOrganizationRepositories( } url isArchived + isFork repositoryTopics(first: 100) { nodes { ... on RepositoryTopic { diff --git a/plugins/catalog-backend-module-github/src/lib/util.test.ts b/plugins/catalog-backend-module-github/src/lib/util.test.ts index 7aca6839ea..0de1d24bbf 100644 --- a/plugins/catalog-backend-module-github/src/lib/util.test.ts +++ b/plugins/catalog-backend-module-github/src/lib/util.test.ts @@ -15,7 +15,11 @@ */ import { GithubTopicFilters } from '../providers/GithubEntityProviderConfig'; -import { parseGithubOrgUrl, satisfiesTopicFilter } from './util'; +import { + parseGithubOrgUrl, + satisfiesTopicFilter, + satisfiesForkFilter, +} from './util'; describe('parseGithubOrgUrl', () => { it('only supports clean org urls, and decodes them', () => { @@ -87,3 +91,21 @@ describe('satisfiesTopicFilter', () => { ).toEqual(false); }); }); + +describe('satisfiesForkFilter', () => { + it('handles cases where forks are not allowed and a fork is evaluated', () => { + expect(satisfiesForkFilter(false, true)).toEqual(false); + }); + + it('handles cases where forks are not allowed and a fork is not evaluated', () => { + expect(satisfiesForkFilter(false, false)).toEqual(true); + }); + + it('handles cases where forks are allowed and a fork is evaluated', () => { + expect(satisfiesForkFilter(true, true)).toEqual(true); + }); + + it('handles cases where forks are allowed and a fork is not evaluated', () => { + expect(satisfiesForkFilter(true, false)).toEqual(true); + }); +}); diff --git a/plugins/catalog-backend-module-github/src/lib/util.ts b/plugins/catalog-backend-module-github/src/lib/util.ts index ece463bb40..d284fdabde 100644 --- a/plugins/catalog-backend-module-github/src/lib/util.ts +++ b/plugins/catalog-backend-module-github/src/lib/util.ts @@ -17,7 +17,7 @@ import { GithubTopicFilters } from '../providers/GithubEntityProviderConfig'; export function parseGithubOrgUrl(urlString: string): { org: string } { - const path = new URL(urlString).pathname.substr(1).split('/'); + const path = new URL(urlString).pathname.slice(1).split('/'); // /backstage if (path.length === 1 && path[0].length) { @@ -77,3 +77,14 @@ export function satisfiesTopicFilter( // not configured at all. return true; } + +export function satisfiesForkFilter( + allowForks: boolean | true, + isFork: boolean | false, +): Boolean { + // we don't want to include forks if forks are not allowed + if (!allowForks && isFork) return false; + + // if forks are allowed, allow all repos through + return true; +} diff --git a/plugins/catalog-backend-module-github/src/processors/GithubDiscoveryProcessor.test.ts b/plugins/catalog-backend-module-github/src/processors/GithubDiscoveryProcessor.test.ts index b69728cc62..f30007c677 100644 --- a/plugins/catalog-backend-module-github/src/processors/GithubDiscoveryProcessor.test.ts +++ b/plugins/catalog-backend-module-github/src/processors/GithubDiscoveryProcessor.test.ts @@ -150,6 +150,7 @@ describe('GithubDiscoveryProcessor', () => { url: 'https://github.com/backstage/backstage', repositoryTopics: { nodes: [] }, isArchived: false, + isFork: false, defaultBranchRef: { name: 'master', }, @@ -160,6 +161,7 @@ describe('GithubDiscoveryProcessor', () => { url: 'https://github.com/backstage/demo', repositoryTopics: { nodes: [] }, isArchived: false, + isFork: false, defaultBranchRef: { name: 'main', }, @@ -202,6 +204,7 @@ describe('GithubDiscoveryProcessor', () => { url: 'https://github.com/backstage/tech-docs', repositoryTopics: { nodes: [] }, isArchived: false, + isFork: false, defaultBranchRef: { name: 'main', }, @@ -236,6 +239,7 @@ describe('GithubDiscoveryProcessor', () => { url: 'https://github.com/backstage/tech-docs', repositoryTopics: { nodes: [] }, isArchived: false, + isFork: false, defaultBranchRef: null, catalogInfoFile: null, }, @@ -260,6 +264,7 @@ describe('GithubDiscoveryProcessor', () => { url: 'https://github.com/backstage/backstage', repositoryTopics: { nodes: [] }, isArchived: false, + isFork: false, defaultBranchRef: { name: 'master', }, @@ -295,6 +300,7 @@ describe('GithubDiscoveryProcessor', () => { url: 'https://github.com/backstage/backstage', repositoryTopics: { nodes: [] }, isArchived: false, + isFork: false, defaultBranchRef: { name: 'main', }, @@ -305,6 +311,7 @@ describe('GithubDiscoveryProcessor', () => { url: 'https://github.com/backstage/techdocs-cli', repositoryTopics: { nodes: [] }, isArchived: false, + isFork: false, defaultBranchRef: { name: 'main', }, @@ -315,6 +322,7 @@ describe('GithubDiscoveryProcessor', () => { url: 'https://github.com/backstage/techdocs-container', repositoryTopics: { nodes: [] }, isArchived: false, + isFork: false, defaultBranchRef: { name: 'main', }, @@ -325,6 +333,7 @@ describe('GithubDiscoveryProcessor', () => { url: 'https://github.com/backstage/techdocs-durp', repositoryTopics: { nodes: [] }, isArchived: false, + isFork: false, defaultBranchRef: null, catalogInfoFile: null, }, @@ -365,6 +374,7 @@ describe('GithubDiscoveryProcessor', () => { name: 'abstest', url: 'https://github.com/backstage/abctest', isArchived: false, + isFork: false, repositoryTopics: { nodes: [] }, defaultBranchRef: { name: 'main', @@ -375,6 +385,7 @@ describe('GithubDiscoveryProcessor', () => { name: 'test', url: 'https://github.com/backstage/test', isArchived: false, + isFork: false, repositoryTopics: { nodes: [] }, defaultBranchRef: { name: 'main', @@ -386,6 +397,7 @@ describe('GithubDiscoveryProcessor', () => { url: 'https://github.com/backstage/test', repositoryTopics: { nodes: [] }, isArchived: true, + isFork: false, defaultBranchRef: { name: 'main', }, @@ -396,6 +408,7 @@ describe('GithubDiscoveryProcessor', () => { url: 'https://github.com/backstage/testxyz', repositoryTopics: { nodes: [] }, isArchived: false, + isFork: false, defaultBranchRef: { name: 'main', }, diff --git a/plugins/catalog-backend-module-github/src/processors/GithubDiscoveryProcessor.ts b/plugins/catalog-backend-module-github/src/processors/GithubDiscoveryProcessor.ts index 593f5f72f1..3fec87d0b2 100644 --- a/plugins/catalog-backend-module-github/src/processors/GithubDiscoveryProcessor.ts +++ b/plugins/catalog-backend-module-github/src/processors/GithubDiscoveryProcessor.ts @@ -176,7 +176,7 @@ export function parseUrl(urlString: string): { host: string; } { const url = new URL(urlString); - const path = url.pathname.substr(1).split('/'); + const path = url.pathname.slice(1).split('/'); // /backstage/techdocs-*/blob/master/catalog-info.yaml // can also be diff --git a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.test.ts b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.test.ts index 9916825cdc..2be5df09fe 100644 --- a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.test.ts +++ b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.test.ts @@ -172,6 +172,7 @@ describe('GithubEntityProvider', () => { url: 'https://github.com/test-org/test-repo', repositoryTopics: { nodes: [] }, isArchived: false, + isFork: false, defaultBranchRef: { name: 'main', }, @@ -274,6 +275,7 @@ describe('GithubEntityProvider', () => { ], }, isArchived: false, + isFork: false, defaultBranchRef: { name: 'main', }, @@ -353,6 +355,7 @@ describe('GithubEntityProvider', () => { ], }, isArchived: false, + isFork: false, defaultBranchRef: { name: 'main', }, @@ -445,6 +448,7 @@ describe('GithubEntityProvider', () => { nodes: [], }, isArchived: false, + isFork: false, defaultBranchRef: { name: 'main', }, @@ -457,6 +461,7 @@ describe('GithubEntityProvider', () => { nodes: [], }, isArchived: false, + isFork: false, defaultBranchRef: { name: 'main', }, @@ -557,6 +562,7 @@ describe('GithubEntityProvider', () => { ], }, isArchived: false, + isFork: false, defaultBranchRef: { name: 'main', }, @@ -580,6 +586,7 @@ describe('GithubEntityProvider', () => { ], }, isArchived: false, + isFork: false, defaultBranchRef: { name: 'main', }, @@ -600,6 +607,7 @@ describe('GithubEntityProvider', () => { ], }, isArchived: false, + isFork: false, defaultBranchRef: { name: 'main', }, diff --git a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts index 1344e2f5d1..3c6fd43bd0 100644 --- a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts +++ b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts @@ -40,7 +40,7 @@ import { GithubEntityProviderConfig, } from './GithubEntityProviderConfig'; import { getOrganizationRepositories } from '../lib/github'; -import { satisfiesTopicFilter } from '../lib/util'; +import { satisfiesTopicFilter, satisfiesForkFilter } from '../lib/util'; import { EventParams, EventSubscriber } from '@backstage/plugin-events-node'; import { PushEvent, Commit } from '@octokit/webhooks-types'; @@ -52,6 +52,7 @@ type Repository = { name: string; url: string; isArchived: boolean; + isFork: boolean; repositoryTopics: string[]; defaultBranchRef?: string; isCatalogInfoFilePresent: boolean; @@ -216,6 +217,7 @@ export class GithubEntityProvider implements EntityProvider, EventSubscriber { defaultBranchRef: r.defaultBranchRef?.name, repositoryTopics: r.repositoryTopics.nodes.map(t => t.topic.name), isArchived: r.isArchived, + isFork: r.isFork, isCatalogInfoFilePresent: r.catalogInfoFile?.__typename === 'Blob' && r.catalogInfoFile.text !== '', @@ -234,6 +236,7 @@ export class GithubEntityProvider implements EntityProvider, EventSubscriber { private matchesFilters(repositories: Repository[]) { const repositoryFilter = this.config.filters?.repository; const topicFilters = this.config.filters?.topic; + const allowForks = this.config.filters?.allowForks ?? true; const matchingRepositories = repositories.filter(r => { const repoTopics: string[] = r.repositoryTopics; @@ -241,6 +244,7 @@ export class GithubEntityProvider implements EntityProvider, EventSubscriber { !r.isArchived && (!repositoryFilter || repositoryFilter.test(r.name)) && satisfiesTopicFilter(repoTopics, topicFilters) && + satisfiesForkFilter(allowForks, r.isFork) && r.defaultBranchRef ); }); @@ -302,6 +306,7 @@ export class GithubEntityProvider implements EntityProvider, EventSubscriber { defaultBranchRef: event.repository.default_branch, repositoryTopics: event.repository.topics, isArchived: event.repository.archived, + isFork: event.repository.fork, // we can consider this file present because // only the catalog file will be recovered from the commits isCatalogInfoFilePresent: true, @@ -423,7 +428,7 @@ export function parseUrl(urlString: string): { host: string; } { const url = new URL(urlString); - const path = url.pathname.substr(1).split('/'); + const path = url.pathname.slice(1).split('/'); // /backstage/techdocs-*/blob/master/catalog-info.yaml // can also be diff --git a/plugins/catalog-backend-module-github/src/providers/GithubEntityProviderConfig.test.ts b/plugins/catalog-backend-module-github/src/providers/GithubEntityProviderConfig.test.ts index 0d9b5ce65b..a597e9dbe0 100644 --- a/plugins/catalog-backend-module-github/src/providers/GithubEntityProviderConfig.test.ts +++ b/plugins/catalog-backend-module-github/src/providers/GithubEntityProviderConfig.test.ts @@ -78,6 +78,12 @@ describe('readProviderConfigs', () => { }, }, }, + providerWithForkFilter: { + organization: 'test-org6', + filters: { + allowForks: false, + }, + }, providerWithHost: { organization: 'test-org1', host: 'ghe.internal.com', @@ -97,7 +103,7 @@ describe('readProviderConfigs', () => { }); const providerConfigs = readProviderConfigs(config); - expect(providerConfigs).toHaveLength(7); + expect(providerConfigs).toHaveLength(8); expect(providerConfigs[0]).toEqual({ id: 'providerOrganizationOnly', organization: 'test-org1', @@ -106,6 +112,7 @@ describe('readProviderConfigs', () => { filters: { repository: undefined, branch: undefined, + allowForks: true, topic: { include: undefined, exclude: undefined, @@ -122,6 +129,7 @@ describe('readProviderConfigs', () => { filters: { repository: undefined, branch: undefined, + allowForks: true, topic: { include: undefined, exclude: undefined, @@ -138,6 +146,7 @@ describe('readProviderConfigs', () => { filters: { repository: /^repository.*filter$/, // repo branch: undefined, // branch + allowForks: true, topic: { include: undefined, exclude: undefined, @@ -154,6 +163,7 @@ describe('readProviderConfigs', () => { filters: { repository: undefined, branch: 'branch-name', + allowForks: true, topic: { include: undefined, exclude: undefined, @@ -170,6 +180,7 @@ describe('readProviderConfigs', () => { filters: { repository: undefined, branch: undefined, + allowForks: true, topic: { include: ['backstage-include'], exclude: ['backstage-exclude'], @@ -179,6 +190,23 @@ describe('readProviderConfigs', () => { validateLocationsExist: false, }); expect(providerConfigs[5]).toEqual({ + id: 'providerWithForkFilter', + organization: 'test-org6', + catalogPath: '/catalog-info.yaml', + host: 'github.com', + filters: { + repository: undefined, + branch: undefined, + allowForks: false, + topic: { + include: undefined, + exclude: undefined, + }, + }, + schedule: undefined, + validateLocationsExist: false, + }); + expect(providerConfigs[6]).toEqual({ id: 'providerWithHost', organization: 'test-org1', catalogPath: '/catalog-info.yaml', @@ -186,6 +214,7 @@ describe('readProviderConfigs', () => { filters: { repository: undefined, branch: undefined, + allowForks: true, topic: { include: undefined, exclude: undefined, @@ -194,7 +223,7 @@ describe('readProviderConfigs', () => { validateLocationsExist: false, schedule: undefined, }); - expect(providerConfigs[6]).toEqual({ + expect(providerConfigs[7]).toEqual({ id: 'providerWithSchedule', organization: 'test-org1', catalogPath: '/catalog-info.yaml', @@ -202,6 +231,7 @@ describe('readProviderConfigs', () => { filters: { repository: undefined, branch: undefined, + allowForks: true, topic: { include: undefined, exclude: undefined, diff --git a/plugins/catalog-backend-module-github/src/providers/GithubEntityProviderConfig.ts b/plugins/catalog-backend-module-github/src/providers/GithubEntityProviderConfig.ts index e888743258..a79a557ebf 100644 --- a/plugins/catalog-backend-module-github/src/providers/GithubEntityProviderConfig.ts +++ b/plugins/catalog-backend-module-github/src/providers/GithubEntityProviderConfig.ts @@ -32,6 +32,7 @@ export type GithubEntityProviderConfig = { repository?: RegExp; branch?: string; topic?: GithubTopicFilters; + allowForks?: boolean; }; validateLocationsExist: boolean; schedule?: TaskScheduleDefinition; @@ -72,6 +73,7 @@ function readProviderConfig( const host = config.getOptionalString('host') ?? 'github.com'; const repositoryPattern = config.getOptionalString('filters.repository'); const branchPattern = config.getOptionalString('filters.branch'); + const allowForks = config.getOptionalBoolean('filters.allowForks') ?? true; const topicFilterInclude = config?.getOptionalStringArray( 'filters.topic.include', ); @@ -103,6 +105,7 @@ function readProviderConfig( ? compileRegExp(repositoryPattern) : undefined, branch: branchPattern || undefined, + allowForks: allowForks, topic: { include: topicFilterInclude, exclude: topicFilterExclude, diff --git a/plugins/catalog-backend-module-gitlab/CHANGELOG.md b/plugins/catalog-backend-module-gitlab/CHANGELOG.md index 36696fc777..9da2c77fdf 100644 --- a/plugins/catalog-backend-module-gitlab/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-catalog-backend-module-gitlab +## 0.1.13-next.1 + +### Patch Changes + +- 85b04f659a: Internal refactor to not use deprecated `substr` +- 52c5685ceb: Implement Group and User Catalog Provider +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-node@1.3.3-next.1 + ## 0.1.13-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitlab/api-report.md b/plugins/catalog-backend-module-gitlab/api-report.md index 36713d2427..0195975d4b 100644 --- a/plugins/catalog-backend-module-gitlab/api-report.md +++ b/plugins/catalog-backend-module-gitlab/api-report.md @@ -55,4 +55,21 @@ export class GitLabDiscoveryProcessor implements CatalogProcessor { emit: CatalogProcessorEmit, ): Promise<boolean>; } + +// @public +export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { + // (undocumented) + connect(connection: EntityProviderConnection): Promise<void>; + // (undocumented) + static fromConfig( + config: Config, + options: { + logger: Logger; + schedule?: TaskRunner; + scheduler?: PluginTaskScheduler; + }, + ): GitlabOrgDiscoveryEntityProvider[]; + // (undocumented) + getProviderName(): string; +} ``` diff --git a/plugins/catalog-backend-module-gitlab/config.d.ts b/plugins/catalog-backend-module-gitlab/config.d.ts index ac75a04c2a..4f51867efc 100644 --- a/plugins/catalog-backend-module-gitlab/config.d.ts +++ b/plugins/catalog-backend-module-gitlab/config.d.ts @@ -48,6 +48,18 @@ export interface Config { * (Optional) TaskScheduleDefinition for the refresh. */ schedule?: TaskScheduleDefinitionConfig; + /** + * (Optional) RegExp for the Project Name Pattern + */ + projectPattern?: RegExp; + /** + * (Optional) RegExp for the User Name Pattern + */ + userPattern?: RegExp; + /** + * (Optional) RegExp for the Group Name Pattern + */ + groupPattern?: RegExp; } >; }; diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json index dc9f7c9d3a..44aadec29b 100644 --- a/plugins/catalog-backend-module-gitlab/package.json +++ b/plugins/catalog-backend-module-gitlab/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-gitlab", "description": "A Backstage catalog backend module that helps integrate towards GitLab", - "version": "0.1.13-next.0", + "version": "0.1.13-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.ts b/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.ts index b03c665ebc..756093bc56 100644 --- a/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.ts +++ b/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.ts @@ -193,7 +193,7 @@ export function parseUrl(urlString: string): { catalogPath: string; } { const url = new URL(urlString); - const path = url.pathname.substr(1).split('/'); + const path = url.pathname.slice(1).split('/'); // (/group/subgroup)/blob/branch|*/filepath const blobIndex = path.findIndex(p => p === 'blob'); diff --git a/plugins/catalog-backend-module-gitlab/src/index.ts b/plugins/catalog-backend-module-gitlab/src/index.ts index 27aac9e78f..30efac4924 100644 --- a/plugins/catalog-backend-module-gitlab/src/index.ts +++ b/plugins/catalog-backend-module-gitlab/src/index.ts @@ -21,5 +21,8 @@ */ export { GitLabDiscoveryProcessor } from './GitLabDiscoveryProcessor'; -export { GitlabDiscoveryEntityProvider } from './providers'; +export { + GitlabDiscoveryEntityProvider, + GitlabOrgDiscoveryEntityProvider, +} from './providers'; export { gitlabDiscoveryEntityProviderCatalogModule } from './service/GitlabDiscoveryEntityProviderCatalogModule'; diff --git a/plugins/catalog-backend-module-gitlab/src/lib/client.ts b/plugins/catalog-backend-module-gitlab/src/lib/client.ts index adf0a78e8f..bad0eb2a86 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/client.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/client.ts @@ -20,14 +20,24 @@ import { GitLabIntegrationConfig, } from '@backstage/integration'; import { Logger } from 'winston'; +import { GitLabGroup, GitLabMembership, GitLabUser } from './types'; -export type ListOptions = { +export type CommonListOptions = { [key: string]: string | number | boolean | undefined; - group?: string; per_page?: number | undefined; page?: number | undefined; + active?: boolean; }; +interface ListProjectOptions extends CommonListOptions { + group?: string; +} + +interface UserListOptions extends CommonListOptions { + without_project_bots?: boolean | undefined; + exclude_internal?: boolean | undefined; +} + export type PagedResponse<T> = { items: T[]; nextPage?: number; @@ -49,7 +59,9 @@ export class GitLabClient { return this.config.host !== 'gitlab.com'; } - async listProjects(options?: ListOptions): Promise<PagedResponse<any>> { + async listProjects( + options?: ListProjectOptions, + ): Promise<PagedResponse<any>> { if (options?.group) { return this.pagedRequest( `/groups/${encodeURIComponent(options?.group)}/projects`, @@ -63,6 +75,53 @@ export class GitLabClient { return this.pagedRequest(`/projects`, options); } + async listUsers( + options?: UserListOptions, + ): Promise<PagedResponse<GitLabUser>> { + let requestOptions = options; + + if (!requestOptions) { + requestOptions = {}; + } + + requestOptions.without_project_bots = true; + requestOptions.exclude_internal = true; + + return this.pagedRequest(`/users?`, requestOptions); + } + + async listGroups( + options?: CommonListOptions, + ): Promise<PagedResponse<GitLabGroup>> { + return this.pagedRequest(`/groups`, options); + } + + async getUserMemberships(userId: number): Promise<GitLabMembership[]> { + const endpoint: string = `/users/${encodeURIComponent(userId)}/memberships`; + const request = new URL(`${this.config.apiBaseUrl}${endpoint}`); + request.searchParams.append('per_page', '100'); + + const response = await fetch(request.toString(), { + headers: getGitLabRequestOptions(this.config).headers, + method: 'GET', + }); + + if (!response.ok) { + if (response.status >= 500) { + this.logger.debug( + `Unexpected response when fetching ${request.toString()}. Expected 200 but got ${ + response.status + } - ${response.statusText}`, + ); + } + return []; + } + + return response.json().then(items => { + return items as GitLabMembership[]; + }); + } + /** * General existence check. * @@ -114,7 +173,7 @@ export class GitLabClient { */ async pagedRequest<T = any>( endpoint: string, - options?: ListOptions, + options?: CommonListOptions, ): Promise<PagedResponse<T>> { const request = new URL(`${this.config.apiBaseUrl}${endpoint}`); for (const key in options) { @@ -159,8 +218,8 @@ export class GitLabClient { * @param options - Initial ListOptions for the request function. */ export async function* paginated<T = any>( - request: (options: ListOptions) => Promise<PagedResponse<T>>, - options: ListOptions, + request: (options: CommonListOptions) => Promise<PagedResponse<T>>, + options: CommonListOptions, ) { let res; do { diff --git a/plugins/catalog-backend-module-gitlab/src/lib/types.ts b/plugins/catalog-backend-module-gitlab/src/lib/types.ts index 86fe1aa385..2b2b888851 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/types.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/types.ts @@ -31,6 +31,32 @@ export type GitLabProject = { path_with_namespace?: string; }; +export type GitLabUser = { + id: number; + username: string; + email: string; + name: string; + state: string; + web_url: string; + avatar_url: string; + groups?: GitLabGroup[]; +}; + +export type GitLabGroup = { + id: number; + name: string; + full_path: string; + description?: string; + parent_id?: number; +}; + +export type GitLabMembership = { + source_id: number; + source_name: string; + source_type: string; + access_level: number; +}; + export type GitlabProviderConfig = { host: string; group: string; @@ -38,5 +64,8 @@ export type GitlabProviderConfig = { branch: string; catalogFile: string; projectPattern: RegExp; + userPattern: RegExp; + groupPattern: RegExp; + orgEnabled?: boolean; schedule?: TaskScheduleDefinition; }; diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts new file mode 100644 index 0000000000..74649f41da --- /dev/null +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts @@ -0,0 +1,514 @@ +/* + * 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 { getVoidLogger } from '@backstage/backend-common'; +import { + PluginTaskScheduler, + TaskInvocationDefinition, + TaskRunner, +} from '@backstage/backend-tasks'; +import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; +import { ConfigReader } from '@backstage/config'; +import { EntityProviderConnection } from '@backstage/plugin-catalog-backend'; +import { rest } from 'msw'; +import { setupServer } from 'msw/node'; +import { GitlabOrgDiscoveryEntityProvider } from './GitlabOrgDiscoveryEntityProvider'; + +class PersistingTaskRunner implements TaskRunner { + private tasks: TaskInvocationDefinition[] = []; + + getTasks() { + return this.tasks; + } + + run(task: TaskInvocationDefinition): Promise<void> { + this.tasks.push(task); + return Promise.resolve(undefined); + } +} + +const logger = getVoidLogger(); + +const server = setupServer(); + +describe('GitlabOrgDiscoveryEntityProvider', () => { + setupRequestMockHandlers(server); + afterEach(() => jest.resetAllMocks()); + + it('no provider config', () => { + const schedule = new PersistingTaskRunner(); + const config = new ConfigReader({}); + const providers = GitlabOrgDiscoveryEntityProvider.fromConfig(config, { + logger, + schedule, + }); + + expect(providers).toHaveLength(0); + }); + + it('single simple discovery config with org disabled', () => { + const schedule = new PersistingTaskRunner(); + const config = new ConfigReader({ + integrations: { + gitlab: [ + { + host: 'test-gitlab', + apiBaseUrl: 'https://api.gitlab.example/api/v4', + token: '1234', + }, + ], + }, + catalog: { + providers: { + gitlab: { + 'test-id': { + host: 'test-gitlab', + group: 'test-group', + }, + }, + }, + }, + }); + const providers = GitlabOrgDiscoveryEntityProvider.fromConfig(config, { + logger, + schedule, + }); + + expect(providers).toHaveLength(0); + }); + + it('single simple discovery config with org enabled', () => { + const schedule = new PersistingTaskRunner(); + const config = new ConfigReader({ + integrations: { + gitlab: [ + { + host: 'test-gitlab', + apiBaseUrl: 'https://api.gitlab.example/api/v4', + token: '1234', + }, + ], + }, + catalog: { + providers: { + gitlab: { + 'test-id': { + host: 'test-gitlab', + group: 'test-group', + orgEnabled: true, + }, + }, + }, + }, + }); + const providers = GitlabOrgDiscoveryEntityProvider.fromConfig(config, { + logger, + schedule, + }); + + expect(providers).toHaveLength(1); + expect(providers[0].getProviderName()).toEqual( + 'GitlabOrgDiscoveryEntityProvider:test-id', + ); + }); + + it('multiple discovery configs', () => { + const schedule = new PersistingTaskRunner(); + const config = new ConfigReader({ + integrations: { + gitlab: [ + { + host: 'test-gitlab', + apiBaseUrl: 'https://api.gitlab.example/api/v4', + token: '1234', + }, + ], + }, + catalog: { + providers: { + gitlab: { + 'test-id': { + host: 'test-gitlab', + group: 'test-group', + orgEnabled: true, + }, + 'second-test': { + host: 'test-gitlab', + group: 'second-group', + orgEnabled: true, + }, + }, + }, + }, + }); + const providers = GitlabOrgDiscoveryEntityProvider.fromConfig(config, { + logger, + schedule, + }); + + expect(providers).toHaveLength(2); + expect(providers[0].getProviderName()).toEqual( + 'GitlabOrgDiscoveryEntityProvider:test-id', + ); + expect(providers[1].getProviderName()).toEqual( + 'GitlabOrgDiscoveryEntityProvider:second-test', + ); + }); + + it('apply full update on scheduled execution', async () => { + const config = new ConfigReader({ + integrations: { + gitlab: [ + { + host: 'test-gitlab', + apiBaseUrl: 'https://api.gitlab.example/api/v4', + token: '1234', + }, + ], + }, + catalog: { + providers: { + gitlab: { + 'test-id': { + host: 'test-gitlab', + group: 'test-group', + orgEnabled: true, + }, + }, + }, + }, + }); + const schedule = new PersistingTaskRunner(); + const entityProviderConnection: EntityProviderConnection = { + applyMutation: jest.fn(), + refresh: jest.fn(), + }; + const provider = GitlabOrgDiscoveryEntityProvider.fromConfig(config, { + logger, + schedule, + })[0]; + expect(provider.getProviderName()).toEqual( + 'GitlabOrgDiscoveryEntityProvider:test-id', + ); + + server.use( + rest.get( + `https://api.gitlab.example/api/v4/groups/test-group/projects`, + (_req, res, ctx) => { + const response = [ + { + id: 123, + default_branch: 'master', + archived: false, + last_activity_at: new Date().toString(), + web_url: 'https://api.gitlab.example/test-group/test-repo', + path_with_namespace: 'test-group/test-repo', + }, + ]; + return res(ctx.json(response)); + }, + ), + rest.get(`https://api.gitlab.example/api/v4/users`, (_req, res, ctx) => { + const response = [ + { + id: 1, + username: 'test1', + name: 'Test Testit', + state: 'active', + avatar_url: 'https://secure.gravatar.com/', + web_url: 'https://gitlab.example/test1', + created_at: '2023-01-19T07:27:03.333Z', + bio: '', + location: null, + public_email: null, + skype: '', + linkedin: '', + twitter: '', + website_url: '', + organization: null, + job_title: '', + pronouns: null, + bot: false, + work_information: null, + followers: 0, + following: 0, + is_followed: false, + local_time: null, + last_sign_in_at: '2023-01-19T07:27:49.601Z', + confirmed_at: '2023-01-19T07:27:02.905Z', + last_activity_on: '2023-01-19', + email: 'test@example.com', + theme_id: 1, + color_scheme_id: 1, + projects_limit: 100000, + current_sign_in_at: '2023-01-19T09:09:10.676Z', + identities: [], + can_create_group: true, + can_create_project: true, + two_factor_enabled: false, + external: false, + private_profile: false, + commit_email: 'test@example.com', + is_admin: false, + note: '', + }, + ]; + return res(ctx.json(response)); + }), + rest.get(`https://api.gitlab.example/api/v4/groups`, (_req, res, ctx) => { + const response = [ + { + id: 1, + web_url: 'https://gitlab.example/groups/group1', + name: 'group1', + path: 'group1', + description: '', + visibility: 'internal', + share_with_group_lock: false, + require_two_factor_authentication: false, + two_factor_grace_period: 48, + project_creation_level: 'developer', + auto_devops_enabled: null, + subgroup_creation_level: 'owner', + emails_disabled: null, + mentions_disabled: null, + lfs_enabled: true, + default_branch_protection: 2, + avatar_url: null, + request_access_enabled: false, + full_name: '8020', + full_path: '8020', + created_at: '2017-06-19T06:42:34.160Z', + parent_id: null, + }, + { + id: 2, + web_url: 'https://gitlab.example/groups/group1/group2', + name: 'group2', + path: 'group1/group2', + description: 'Group2', + visibility: 'internal', + share_with_group_lock: false, + require_two_factor_authentication: false, + two_factor_grace_period: 48, + project_creation_level: 'developer', + auto_devops_enabled: null, + subgroup_creation_level: 'owner', + emails_disabled: null, + mentions_disabled: null, + lfs_enabled: true, + request_access_enabled: false, + full_name: 'group2', + full_path: 'group1/group2', + created_at: '2017-12-07T13:20:40.675Z', + parent_id: null, + }, + ]; + return res(ctx.json(response)); + }), + rest.get( + `https://api.gitlab.example/api/v4/users/1/memberships`, + (_req, res, ctx) => { + const response = [ + { + source_id: 2, + source_name: 'Group 2', + source_type: 'Namespace', + access_level: 50, + }, + ]; + return res(ctx.json(response)); + }, + ), + ); + + await provider.connect(entityProviderConnection); + + const taskDef = schedule.getTasks()[0]; + expect(taskDef.id).toEqual( + 'GitlabOrgDiscoveryEntityProvider:test-id:refresh', + ); + await (taskDef.fn as () => Promise<void>)(); + + const expectedEntities = [ + { + entity: { + apiVersion: 'backstage.io/v1alpha1', + kind: 'User', + metadata: { + annotations: { + 'backstage.io/managed-by-location': 'url:test-gitlab/test1', + 'backstage.io/managed-by-origin-location': + 'url:test-gitlab/test1', + 'test-gitlab/user-login': 'https://gitlab.example/test1', + }, + name: 'test1', + }, + spec: { + memberOf: ['group1-group2'], + profile: { + displayName: 'Test Testit', + email: 'test@example.com', + picture: 'https://secure.gravatar.com/', + }, + }, + }, + locationKey: 'GitlabOrgDiscoveryEntityProvider:test-id', + }, + { + entity: { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Group', + metadata: { + annotations: { + 'backstage.io/managed-by-location': + 'url:test-gitlab/teams/group1-group2', + 'backstage.io/managed-by-origin-location': + 'url:test-gitlab/teams/group1-group2', + 'test-gitlab/team-path': 'group1/group2', + }, + description: 'Group2', + name: 'group1-group2', + }, + spec: { + children: [], + profile: { + displayName: 'group2', + }, + type: 'team', + }, + }, + locationKey: 'GitlabOrgDiscoveryEntityProvider:test-id', + }, + ]; + + expect(entityProviderConnection.applyMutation).toHaveBeenCalledTimes(1); + expect(entityProviderConnection.applyMutation).toHaveBeenCalledWith({ + type: 'full', + entities: expectedEntities, + }); + }); + + it('fail without schedule and scheduler', () => { + const config = new ConfigReader({ + integrations: { + gitlab: [ + { + host: 'test-gitlab', + apiBaseUrl: 'https://api.gitlab.example/api/v4', + token: '1234', + }, + ], + }, + catalog: { + providers: { + gitlab: { + 'test-id': { + host: 'test-gitlab', + group: 'test-group', + orgEnabled: true, + }, + }, + }, + }, + }); + + expect(() => + GitlabOrgDiscoveryEntityProvider.fromConfig(config, { + logger, + }), + ).toThrow('Either schedule or scheduler must be provided'); + }); + + it('fail with scheduler but no schedule config', () => { + const scheduler = { + createScheduledTaskRunner: (_: any) => jest.fn(), + } as unknown as PluginTaskScheduler; + const config = new ConfigReader({ + integrations: { + gitlab: [ + { + host: 'test-gitlab', + apiBaseUrl: 'https://api.gitlab.example/api/v4', + token: '1234', + }, + ], + }, + catalog: { + providers: { + gitlab: { + 'test-id': { + host: 'test-gitlab', + group: 'test-group', + orgEnabled: true, + }, + }, + }, + }, + }); + + expect(() => + GitlabOrgDiscoveryEntityProvider.fromConfig(config, { + logger, + scheduler, + }), + ).toThrow( + 'No schedule provided neither via code nor config for GitlabOrgDiscoveryEntityProvider:test-id', + ); + }); + + it('single simple provider config with schedule in config', async () => { + const schedule = new PersistingTaskRunner(); + const scheduler = { + createScheduledTaskRunner: (_: any) => schedule, + } as unknown as PluginTaskScheduler; + const config = new ConfigReader({ + integrations: { + gitlab: [ + { + host: 'test-gitlab', + apiBaseUrl: 'https://api.gitlab.example/api/v4', + token: '1234', + }, + ], + }, + catalog: { + providers: { + gitlab: { + 'test-id': { + host: 'test-gitlab', + group: 'test-group', + orgEnabled: true, + schedule: { + frequency: 'PT30M', + timeout: 'PT3M', + }, + }, + }, + }, + }, + }); + const providers = GitlabOrgDiscoveryEntityProvider.fromConfig(config, { + logger, + scheduler, + }); + + expect(providers).toHaveLength(1); + expect(providers[0].getProviderName()).toEqual( + 'GitlabOrgDiscoveryEntityProvider:test-id', + ); + }); +}); diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts new file mode 100644 index 0000000000..f90a61f9e9 --- /dev/null +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts @@ -0,0 +1,375 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { PluginTaskScheduler, TaskRunner } from '@backstage/backend-tasks'; +import { Config } from '@backstage/config'; +import { GitLabIntegration, ScmIntegrations } from '@backstage/integration'; +import { + EntityProvider, + EntityProviderConnection, +} from '@backstage/plugin-catalog-backend'; +import * as uuid from 'uuid'; +import { Logger } from 'winston'; +import { + GitLabClient, + GitlabProviderConfig, + paginated, + readGitlabConfigs, +} from '../lib'; +import { GitLabGroup, GitLabUser } from '../lib/types'; +import { + ANNOTATION_LOCATION, + ANNOTATION_ORIGIN_LOCATION, + Entity, + UserEntity, + GroupEntity, +} from '@backstage/catalog-model'; +import { merge } from 'lodash'; + +type Result = { + scanned: number; + matches: GitLabUser[]; +}; + +type GroupResult = { + scanned: number; + matches: GitLabGroup[]; +}; + +/** + * Discovers users and groups from a Gitlab instance. + * @public + */ +export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { + private readonly config: GitlabProviderConfig; + private readonly integration: GitLabIntegration; + private readonly logger: Logger; + private readonly scheduleFn: () => Promise<void>; + private connection?: EntityProviderConnection; + + static fromConfig( + config: Config, + options: { + logger: Logger; + schedule?: TaskRunner; + scheduler?: PluginTaskScheduler; + }, + ): GitlabOrgDiscoveryEntityProvider[] { + if (!options.schedule && !options.scheduler) { + throw new Error('Either schedule or scheduler must be provided.'); + } + + const providerConfigs = readGitlabConfigs(config); + const integrations = ScmIntegrations.fromConfig(config).gitlab; + const providers: GitlabOrgDiscoveryEntityProvider[] = []; + + providerConfigs.forEach(providerConfig => { + const integration = integrations.byHost(providerConfig.host); + + if (!providerConfig.orgEnabled) { + return; + } + + if (!integration) { + throw new Error( + `No gitlab integration found that matches host ${providerConfig.host}`, + ); + } + + if (!options.schedule && !providerConfig.schedule) { + throw new Error( + `No schedule provided neither via code nor config for GitlabOrgDiscoveryEntityProvider:${providerConfig.id}.`, + ); + } + + const taskRunner = + options.schedule ?? + options.scheduler!.createScheduledTaskRunner(providerConfig.schedule!); + + providers.push( + new GitlabOrgDiscoveryEntityProvider({ + ...options, + config: providerConfig, + integration, + taskRunner, + }), + ); + }); + return providers; + } + + private constructor(options: { + config: GitlabProviderConfig; + integration: GitLabIntegration; + logger: Logger; + taskRunner: TaskRunner; + }) { + this.config = options.config; + this.integration = options.integration; + this.logger = options.logger.child({ + target: this.getProviderName(), + }); + this.scheduleFn = this.createScheduleFn(options.taskRunner); + } + + getProviderName(): string { + return `GitlabOrgDiscoveryEntityProvider:${this.config.id}`; + } + + async connect(connection: EntityProviderConnection): Promise<void> { + this.connection = connection; + await this.scheduleFn(); + } + + private createScheduleFn(taskRunner: TaskRunner): () => Promise<void> { + return async () => { + const taskId = `${this.getProviderName()}:refresh`; + return taskRunner.run({ + id: taskId, + fn: async () => { + const logger = this.logger.child({ + class: GitlabOrgDiscoveryEntityProvider.prototype.constructor.name, + taskId, + taskInstanceId: uuid.v4(), + }); + + try { + await this.refresh(logger); + } catch (error) { + logger.error(`${this.getProviderName()} refresh failed`, error); + } + }, + }); + }; + } + + private async refresh(logger: Logger): Promise<void> { + if (!this.connection) { + throw new Error( + `Gitlab discovery connection not initialized for ${this.getProviderName()}`, + ); + } + + const client = new GitLabClient({ + config: this.integration.config, + logger: logger, + }); + + const users = paginated<GitLabUser>(options => client.listUsers(options), { + page: 1, + per_page: 100, + active: true, + }); + + const groups = paginated<GitLabGroup>( + options => client.listGroups(options), + { + page: 1, + per_page: 100, + }, + ); + + const idMappedGroup: { [groupId: number]: GitLabGroup } = {}; + + const res: Result = { + scanned: 0, + matches: [], + }; + + const groupRes: GroupResult = { + scanned: 0, + matches: [], + }; + + for await (const group of groups) { + if (!this.config.groupPattern.test(group.full_path ?? '')) { + continue; + } + + groupRes.scanned++; + groupRes.matches.push(group); + + idMappedGroup[group.id] = group; + } + + for await (const user of users) { + if (!this.config.userPattern.test(user.email ?? user.username ?? '')) { + continue; + } + + res.scanned++; + + if (user.state !== 'active') { + continue; + } + + const memberships = await client.getUserMemberships(user.id); + const userGroups: GitLabGroup[] = []; + + for (const i of memberships) { + if ( + i.source_type === 'Namespace' && + idMappedGroup.hasOwnProperty(i.source_id) + ) { + userGroups.push(idMappedGroup[i.source_id]); + } + } + + user.groups = userGroups; + + res.matches.push(user); + } + + const groupsWithUsers = groupRes.matches.filter(group => { + return ( + res.matches.filter(x => { + return !!x.groups?.find(y => y.id === group.id); + }).length > 0 + ); + }); + + const userEntities = res.matches.map(p => + this.createUserEntity(p, this.integration.config.host), + ); + const groupEntities = this.createGroupEntities( + groupsWithUsers, + this.integration.config.host, + ); + + await this.connection.applyMutation({ + type: 'full', + entities: [...userEntities, ...groupEntities].map(entity => ({ + locationKey: this.getProviderName(), + entity: this.withLocations(this.integration.config.host, entity), + })), + }); + } + + private createGroupEntities( + groupResult: GitLabGroup[], + host: string, + ): GroupEntity[] { + const idMapped: { [groupId: number]: GitLabGroup } = {}; + const entities: GroupEntity[] = []; + + for (const group of groupResult) { + idMapped[group.id] = group; + } + + for (const group of groupResult) { + const entity = this.createGroupEntity(group, host); + + if (group.parent_id && idMapped.hasOwnProperty(group.parent_id)) { + entity.spec.parent = idMapped[group.parent_id].full_path; + } + + entities.push(entity); + } + + return entities; + } + + private withLocations(host: string, entity: Entity): Entity { + const location = + entity.kind === 'Group' + ? `url:${host}/teams/${entity.metadata.name}` + : `url:${host}/${entity.metadata.name}`; + return merge( + { + metadata: { + annotations: { + [ANNOTATION_LOCATION]: location, + [ANNOTATION_ORIGIN_LOCATION]: location, + }, + }, + }, + entity, + ) as Entity; + } + + private createUserEntity(user: GitLabUser, host: string): UserEntity { + const annotations: { [annotationName: string]: string } = {}; + + annotations[`${host}/user-login`] = user.web_url; + + const entity: UserEntity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'User', + metadata: { + name: user.username, + annotations: annotations, + }, + spec: { + profile: { + displayName: user.name, + picture: user.avatar_url, + }, + memberOf: [], + }, + }; + + if (user.email) { + if (!entity.spec) { + entity.spec = {}; + } + + if (!entity.spec.profile) { + entity.spec.profile = {}; + } + + entity.spec.profile.email = user.email; + } + + if (user.groups) { + for (const group of user.groups) { + if (!entity.spec.memberOf) { + entity.spec.memberOf = []; + } + entity.spec.memberOf.push(group.full_path.replace('/', '-')); + } + } + + return entity; + } + + private createGroupEntity(group: GitLabGroup, host: string): GroupEntity { + const annotations: { [annotationName: string]: string } = {}; + + annotations[`${host}/team-path`] = group.full_path; + + const entity: GroupEntity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Group', + metadata: { + name: group.full_path.replace('/', '-'), + annotations: annotations, + }, + spec: { + type: 'team', + children: [], + profile: { + displayName: group.name, + }, + }, + }; + + if (group.description) { + entity.metadata.description = group.description; + } + + return entity; + } +} diff --git a/plugins/catalog-backend-module-gitlab/src/providers/config.test.ts b/plugins/catalog-backend-module-gitlab/src/providers/config.test.ts index 6b337bf7cd..e72c38e9d1 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/config.test.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/config.test.ts @@ -54,6 +54,9 @@ describe('config', () => { host: 'host', catalogFile: 'catalog-info.yaml', projectPattern: /[\s\S]*/, + groupPattern: /[\s\S]*/, + userPattern: /[\s\S]*/, + orgEnabled: false, schedule: undefined, }), ); @@ -85,6 +88,9 @@ describe('config', () => { host: 'host', catalogFile: 'custom-file.yaml', projectPattern: /[\s\S]*/, + groupPattern: /[\s\S]*/, + userPattern: /[\s\S]*/, + orgEnabled: false, schedule: undefined, }), ); @@ -120,6 +126,9 @@ describe('config', () => { host: 'host', catalogFile: 'catalog-info.yaml', projectPattern: /[\s\S]*/, + groupPattern: /[\s\S]*/, + userPattern: /[\s\S]*/, + orgEnabled: false, schedule: { frequency: Duration.fromISO('PT30M'), timeout: { diff --git a/plugins/catalog-backend-module-gitlab/src/providers/config.ts b/plugins/catalog-backend-module-gitlab/src/providers/config.ts index 3dfc00745e..cd856f97da 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/config.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/config.ts @@ -35,6 +35,13 @@ function readGitlabConfig(id: string, config: Config): GitlabProviderConfig { const projectPattern = new RegExp( config.getOptionalString('projectPattern') ?? /[\s\S]*/, ); + const userPattern = new RegExp( + config.getOptionalString('userPattern') ?? /[\s\S]*/, + ); + const groupPattern = new RegExp( + config.getOptionalString('groupPattern') ?? /[\s\S]*/, + ); + const orgEnabled: boolean = config.getOptionalBoolean('orgEnabled') ?? false; const schedule = config.has('schedule') ? readTaskScheduleDefinitionFromConfig(config.getConfig('schedule')) @@ -47,7 +54,10 @@ function readGitlabConfig(id: string, config: Config): GitlabProviderConfig { host, catalogFile, projectPattern, + userPattern, + groupPattern, schedule, + orgEnabled, }; } diff --git a/plugins/catalog-backend-module-gitlab/src/providers/index.ts b/plugins/catalog-backend-module-gitlab/src/providers/index.ts index e7cb00a73f..2091b3f47a 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/index.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/index.ts @@ -15,3 +15,4 @@ */ export { GitlabDiscoveryEntityProvider } from './GitlabDiscoveryEntityProvider'; +export { GitlabOrgDiscoveryEntityProvider } from './GitlabOrgDiscoveryEntityProvider'; diff --git a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md index 1380f51750..b52760e185 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md +++ b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-catalog-backend-module-incremental-ingestion +## 0.2.0-next.1 + +### Patch Changes + +- b7e36660d5: Return `EventSubscriber` from `addIncrementalEntityProvider` to hook up to `EventsBackend` +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/backend-test-utils@0.1.34-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-catalog-node@1.3.3-next.1 + - @backstage/plugin-events-node@0.2.3-next.1 + - @backstage/plugin-permission-common@0.7.3 + ## 0.2.0-next.0 ### Minor Changes diff --git a/plugins/catalog-backend-module-incremental-ingestion/package.json b/plugins/catalog-backend-module-incremental-ingestion/package.json index c7bb13425a..ec50c44311 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/package.json +++ b/plugins/catalog-backend-module-incremental-ingestion/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-incremental-ingestion", "description": "An entity provider for streaming large asset sources into the catalog", - "version": "0.2.0-next.0", + "version": "0.2.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-ldap/CHANGELOG.md b/plugins/catalog-backend-module-ldap/CHANGELOG.md index 2ae5a8c2b4..f64a4460ea 100644 --- a/plugins/catalog-backend-module-ldap/CHANGELOG.md +++ b/plugins/catalog-backend-module-ldap/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-ldap +## 0.5.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + ## 0.5.9-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-ldap/package.json b/plugins/catalog-backend-module-ldap/package.json index 6553080d2c..aed68ebdf9 100644 --- a/plugins/catalog-backend-module-ldap/package.json +++ b/plugins/catalog-backend-module-ldap/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-ldap", "description": "A Backstage catalog backend module that helps integrate towards LDAP", - "version": "0.5.9-next.0", + "version": "0.5.9-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-msgraph/CHANGELOG.md b/plugins/catalog-backend-module-msgraph/CHANGELOG.md index 6a93a81c5b..e53d159d1d 100644 --- a/plugins/catalog-backend-module-msgraph/CHANGELOG.md +++ b/plugins/catalog-backend-module-msgraph/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-msgraph +## 0.4.8-next.1 + +### Patch Changes + +- 4c86436fdf: Fix MS Graph provider to use target URL for fetching access token +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/plugin-catalog-node@1.3.3-next.1 + ## 0.4.8-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json index 615dfc366f..7be2678bc6 100644 --- a/plugins/catalog-backend-module-msgraph/package.json +++ b/plugins/catalog-backend-module-msgraph/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-msgraph", "description": "A Backstage catalog backend module that helps integrate towards Microsoft Graph", - "version": "0.4.8-next.0", + "version": "0.4.8-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/client.test.ts b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/client.test.ts index f621b4d924..f7d98f12c6 100644 --- a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/client.test.ts +++ b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/client.test.ts @@ -53,7 +53,7 @@ describe('MicrosoftGraphClient', () => { expect(await response.json()).toEqual({ value: 'example' }); expect(tokenCredential.getToken).toHaveBeenCalledTimes(1); expect(tokenCredential.getToken).toHaveBeenCalledWith( - 'https://graph.microsoft.com/.default', + 'https://example.com/.default', ); }); diff --git a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/client.ts b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/client.ts index c644e545d6..7a685b258d 100644 --- a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/client.ts +++ b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/client.ts @@ -219,7 +219,7 @@ export class MicrosoftGraphClient { ): Promise<Response> { // Make sure that we always have a valid access token (might be cached) const token = await this.tokenCredential.getToken( - 'https://graph.microsoft.com/.default', + `${this.baseUrl}/.default`, ); if (!token) { diff --git a/plugins/catalog-backend-module-openapi/CHANGELOG.md b/plugins/catalog-backend-module-openapi/CHANGELOG.md index 0f9b04f997..5dd91ecd63 100644 --- a/plugins/catalog-backend-module-openapi/CHANGELOG.md +++ b/plugins/catalog-backend-module-openapi/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-backend-module-openapi +## 0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-node@1.3.3-next.1 + ## 0.1.8-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-openapi/package.json b/plugins/catalog-backend-module-openapi/package.json index 798a6d9008..6ccc4971b0 100644 --- a/plugins/catalog-backend-module-openapi/package.json +++ b/plugins/catalog-backend-module-openapi/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-openapi", "description": "A Backstage catalog backend module that helps with OpenAPI specifications", - "version": "0.1.8-next.0", + "version": "0.1.8-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend/CHANGELOG.md b/plugins/catalog-backend/CHANGELOG.md index 06583f2e9b..1ee436c075 100644 --- a/plugins/catalog-backend/CHANGELOG.md +++ b/plugins/catalog-backend/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-catalog-backend +## 1.7.2-next.1 + +### Patch Changes + +- 2380506364: The process of adding or modifying fields in the software-catalog search index has been simplified. For more details, see [how to customize fields in the Software Catalog index](https://backstage.io/docs/features/search/how-to-guides#how-to-customize-fields-in-the-software-catalog-index). +- 9573651919: The previous migration that adds the `search.original_value` column may leave some of the entities not updated. Add a migration script to trigger a reprocessing of the entities. +- fc73f6aae5: Switched the order of reprocessing statements retroactively in migrations. This only improves the experience for those who at a later time perform a large upgrade of an old Backstage installation. +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.1 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-node@0.7.5-next.1 + - @backstage/plugin-scaffolder-common@1.2.5-next.0 + - @backstage/plugin-search-common@1.2.1 + ## 1.7.2-next.0 ### Patch Changes diff --git a/plugins/catalog-backend/migrations/20220222164811_reprocess_for_relation_refs.js b/plugins/catalog-backend/migrations/20220222164811_reprocess_for_relation_refs.js index f4be2172a0..0679d5cbdb 100644 --- a/plugins/catalog-backend/migrations/20220222164811_reprocess_for_relation_refs.js +++ b/plugins/catalog-backend/migrations/20220222164811_reprocess_for_relation_refs.js @@ -21,11 +21,11 @@ */ exports.up = async function up(knex) { // Make sure to reprocess everything, to make sure that relations have a targetRef produced + await knex('final_entities').update({ hash: '' }); await knex('refresh_state').update({ result_hash: '', next_update_at: knex.fn.now(), }); - await knex('final_entities').update({ hash: '' }); }; exports.down = async function down() {}; diff --git a/plugins/catalog-backend/migrations/20221109192547_search_add_original_value_column.js b/plugins/catalog-backend/migrations/20221109192547_search_add_original_value_column.js index fff7955530..597006e6f5 100644 --- a/plugins/catalog-backend/migrations/20221109192547_search_add_original_value_column.js +++ b/plugins/catalog-backend/migrations/20221109192547_search_add_original_value_column.js @@ -34,11 +34,11 @@ exports.up = async function up(knex) { // not enough to just reset the final_entities hash, since stitching is driven // only by processing resulting in data that isn't matching the refresh_state // hash. + await knex('final_entities').update({ hash: '' }); await knex('refresh_state').update({ result_hash: '', next_update_at: knex.fn.now(), }); - await knex('final_entities').update({ hash: '' }); }; /** diff --git a/plugins/catalog-backend/migrations/20230125085746_trigger_reprocessing.js b/plugins/catalog-backend/migrations/20230125085746_trigger_reprocessing.js new file mode 100644 index 0000000000..9bd30723cd --- /dev/null +++ b/plugins/catalog-backend/migrations/20230125085746_trigger_reprocessing.js @@ -0,0 +1,33 @@ +/* + * 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. + */ + +// @ts-check + +/** + * @param { import("knex").Knex } knex + */ +exports.up = async function up(knex) { + await knex('final_entities').update({ hash: '' }); + await knex('refresh_state').update({ + result_hash: '', + next_update_at: knex.fn.now(), + }); +}; + +/** + * @param { import("knex").Knex } _knex + */ +exports.down = async function down(_knex) {}; diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index 45628825c4..2bf0429932 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend", "description": "The Backstage backend plugin that provides the Backstage catalog", - "version": "1.7.2-next.0", + "version": "1.7.2-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-customized/CHANGELOG.md b/plugins/catalog-customized/CHANGELOG.md index 6f03f91b9f..13b1364d66 100644 --- a/plugins/catalog-customized/CHANGELOG.md +++ b/plugins/catalog-customized/CHANGELOG.md @@ -1,5 +1,13 @@ # @internal/plugin-catalog-customized +## 0.0.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.8.0-next.1 + - @backstage/plugin-catalog-react@1.3.0-next.1 + ## 0.0.7-next.0 ### Patch Changes diff --git a/plugins/catalog-customized/package.json b/plugins/catalog-customized/package.json index 27cf26f3f2..e72331539d 100644 --- a/plugins/catalog-customized/package.json +++ b/plugins/catalog-customized/package.json @@ -1,7 +1,7 @@ { "name": "@internal/plugin-catalog-customized", "description": "The internal Backstage Customizable plugin for browsing the Backstage catalog", - "version": "0.0.7-next.0", + "version": "0.0.7-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-graph/CHANGELOG.md b/plugins/catalog-graph/CHANGELOG.md index 417fe6ae95..dcdbe96b91 100644 --- a/plugins/catalog-graph/CHANGELOG.md +++ b/plugins/catalog-graph/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-graph +## 0.2.27-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.2.27-next.0 ### Patch Changes diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index 61d517c1dd..9ff0c8e92a 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-graph", - "version": "0.2.27-next.0", + "version": "0.2.27-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-import/CHANGELOG.md b/plugins/catalog-import/CHANGELOG.md index 51c8ccd448..3f0711c721 100644 --- a/plugins/catalog-import/CHANGELOG.md +++ b/plugins/catalog-import/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-import +## 0.9.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/integration-react@1.1.10-next.0 + - @backstage/plugin-catalog-common@1.0.11-next.0 + ## 0.9.5-next.0 ### Patch Changes diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index 7fb456a311..36351746e5 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-import", "description": "A Backstage plugin the helps you import entities into your catalog", - "version": "0.9.5-next.0", + "version": "0.9.5-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-node/CHANGELOG.md b/plugins/catalog-node/CHANGELOG.md index 7c133e34c2..b01d88ae26 100644 --- a/plugins/catalog-node/CHANGELOG.md +++ b/plugins/catalog-node/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-node +## 1.3.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.11-next.0 + ## 1.3.3-next.0 ### Patch Changes diff --git a/plugins/catalog-node/package.json b/plugins/catalog-node/package.json index ead9801888..7874e36072 100644 --- a/plugins/catalog-node/package.json +++ b/plugins/catalog-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-node", "description": "The plugin-catalog-node module for @backstage/plugin-catalog-backend", - "version": "1.3.3-next.0", + "version": "1.3.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-react/CHANGELOG.md b/plugins/catalog-react/CHANGELOG.md index d1a878b434..7f657f418f 100644 --- a/plugins/catalog-react/CHANGELOG.md +++ b/plugins/catalog-react/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-catalog-react +## 1.3.0-next.1 + +### Minor Changes + +- fab93c2fe8: Aligned buttons on "Unregister entity" dialog to keep them on the same line + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-react@0.4.9 + ## 1.3.0-next.0 ### Minor Changes diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index 871107e104..705c1b544a 100644 --- a/plugins/catalog-react/package.json +++ b/plugins/catalog-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-react", "description": "A frontend library that helps other Backstage plugins interact with the catalog", - "version": "1.3.0-next.0", + "version": "1.3.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-react/src/components/UnregisterEntityDialog/UnregisterEntityDialog.test.tsx b/plugins/catalog-react/src/components/UnregisterEntityDialog/UnregisterEntityDialog.test.tsx index 4173ca85b2..baa4b3732c 100644 --- a/plugins/catalog-react/src/components/UnregisterEntityDialog/UnregisterEntityDialog.test.tsx +++ b/plugins/catalog-react/src/components/UnregisterEntityDialog/UnregisterEntityDialog.test.tsx @@ -80,7 +80,11 @@ describe('UnregisterEntityDialog', () => { it('can cancel', async () => { const onClose = jest.fn(); - stateSpy.mockImplementation(() => ({ type: 'loading' })); + stateSpy.mockImplementation(() => ({ + type: 'bootstrap', + location: '', + deleteEntity: jest.fn(), + })); await renderInTestApp( <Wrapper> diff --git a/plugins/catalog-react/src/components/UnregisterEntityDialog/UnregisterEntityDialog.tsx b/plugins/catalog-react/src/components/UnregisterEntityDialog/UnregisterEntityDialog.tsx index 48aa2f4012..6c4984129e 100644 --- a/plugins/catalog-react/src/components/UnregisterEntityDialog/UnregisterEntityDialog.tsx +++ b/plugins/catalog-react/src/components/UnregisterEntityDialog/UnregisterEntityDialog.tsx @@ -39,14 +39,19 @@ const useStyles = makeStyles({ advancedButton: { fontSize: '0.7em', }, + dialogActions: { + display: 'inline-block', + }, }); const Contents = ({ entity, onConfirm, + onClose, }: { entity: Entity; onConfirm: () => any; + onClose: () => any; }) => { const alertApi = useApi(alertApiRef); const configApi = useApi(configApiRef); @@ -92,6 +97,14 @@ const Contents = ({ [alertApi, onConfirm, state], ); + const DialogActionsPanel = () => ( + <DialogActions className={classes.dialogActions}> + <Button onClick={onClose} color="primary"> + Cancel + </Button> + </DialogActions> + ); + if (state.type === 'loading') { return <Progress />; } @@ -112,15 +125,18 @@ const Contents = ({ <Box marginTop={2}> {!showDelete && ( - <Button - variant="text" - size="small" - color="primary" - className={classes.advancedButton} - onClick={() => setShowDelete(true)} - > - Advanced Options - </Button> + <> + <Button + variant="text" + size="small" + color="primary" + className={classes.advancedButton} + onClick={() => setShowDelete(true)} + > + Advanced Options + </Button> + <DialogActionsPanel /> + </> )} {showDelete && ( @@ -140,6 +156,7 @@ const Contents = ({ > Delete Entity </Button> + <DialogActionsPanel /> </> )} </Box> @@ -162,6 +179,7 @@ const Contents = ({ > Delete Entity </Button> + <DialogActionsPanel /> </> ); } @@ -258,13 +276,8 @@ export const UnregisterEntityDialog = (props: UnregisterEntityDialogProps) => { Are you sure you want to unregister this entity? </DialogTitle> <DialogContent> - <Contents entity={entity} onConfirm={onConfirm} /> + <Contents entity={entity} onConfirm={onConfirm} onClose={onClose} /> </DialogContent> - <DialogActions> - <Button onClick={onClose} color="primary"> - Cancel - </Button> - </DialogActions> </Dialog> ); }; diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md index 4c79fb57a4..588bfd40cd 100644 --- a/plugins/catalog/CHANGELOG.md +++ b/plugins/catalog/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-catalog +## 1.8.0-next.1 + +### Minor Changes + +- 0c1fc3986c: Added Markdown support in the `AboutCard` description section +- 0eaa579f89: The `CatalogSearchResultListItem` component is now a search result extension. This means that when rendered as a child of components that render search extensions, the `result`, `rank`, and `highlight` properties are optional. See the [documentation](https://backstage.io/docs/features/search/how-to-guides#how-to-render-search-results-using-extensions) for more details. + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-search-react@1.5.0-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration-react@1.1.10-next.0 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-search-common@1.2.1 + ## 1.7.3-next.0 ### Patch Changes diff --git a/plugins/catalog/api-report.md b/plugins/catalog/api-report.md index 82df851239..901120bd22 100644 --- a/plugins/catalog/api-report.md +++ b/plugins/catalog/api-report.md @@ -107,9 +107,9 @@ export const catalogPlugin: BackstagePlugin< >; // @public (undocumented) -export function CatalogSearchResultListItem( +export const CatalogSearchResultListItem: ( props: CatalogSearchResultListItemProps, -): JSX.Element; +) => JSX.Element | null; // @public export interface CatalogSearchResultListItemProps { @@ -120,7 +120,7 @@ export interface CatalogSearchResultListItemProps { // (undocumented) rank?: number; // (undocumented) - result: IndexableDocument; + result?: IndexableDocument; } // @public (undocumented) diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index 11231894a3..333d621d40 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog", "description": "The Backstage plugin for browsing the Backstage catalog", - "version": "1.7.3-next.0", + "version": "1.8.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog/src/apis/StarredEntitiesApi/migration.test.ts b/plugins/catalog/src/apis/StarredEntitiesApi/migration.test.ts index b3bc5400d5..c9083969ee 100644 --- a/plugins/catalog/src/apis/StarredEntitiesApi/migration.test.ts +++ b/plugins/catalog/src/apis/StarredEntitiesApi/migration.test.ts @@ -46,7 +46,7 @@ describe('performMigrationToTheNewBucket', () => { await performMigrationToTheNewBucket({ storageApi: mockStorage }); // read NEW bucket - expect(await newBucket.snapshot('entityRefs').value).toEqual([ + expect(newBucket.snapshot('entityRefs').value).toEqual([ 'component:default/c', 'component:default/a', 'template:custom/b', @@ -72,7 +72,7 @@ describe('performMigrationToTheNewBucket', () => { await performMigrationToTheNewBucket({ storageApi: mockStorage }); // read NEW bucket - expect(await newBucket.snapshot('entityRefs').value).toEqual([ + expect(newBucket.snapshot('entityRefs').value).toEqual([ 'component:default/a', ]); diff --git a/plugins/catalog/src/components/AboutCard/AboutContent.tsx b/plugins/catalog/src/components/AboutCard/AboutContent.tsx index 260a0eccbf..245308cee2 100644 --- a/plugins/catalog/src/components/AboutCard/AboutContent.tsx +++ b/plugins/catalog/src/components/AboutCard/AboutContent.tsx @@ -25,7 +25,8 @@ import { getEntityRelations, } from '@backstage/plugin-catalog-react'; import { JsonArray } from '@backstage/types'; -import { Chip, Grid, makeStyles, Typography } from '@material-ui/core'; +import { Chip, Grid, makeStyles } from '@material-ui/core'; +import { MarkdownContent } from '@backstage/core-components'; import React from 'react'; import { AboutField } from './AboutField'; import { LinksGridList } from '../EntityLinksCard/LinksGridList'; @@ -111,9 +112,10 @@ export function AboutContent(props: AboutContentProps) { return ( <Grid container> <AboutField label="Description" gridSizes={{ xs: 12 }}> - <Typography variant="body2" paragraph className={classes.description}> - {entity?.metadata?.description || 'No description'} - </Typography> + <MarkdownContent + className={classes.description} + content={entity?.metadata?.description || 'No description'} + /> </AboutField> <AboutField label="Owner" diff --git a/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.test.tsx b/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.test.tsx index a2b26b87e1..10f06ca09e 100644 --- a/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.test.tsx +++ b/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.test.tsx @@ -198,10 +198,12 @@ describe('DefaultCatalogPage', () => { it('should render the default actions of an item in the grid', async () => { await renderWrapped(<DefaultCatalogPage />); fireEvent.click(screen.getByTestId('user-picker-owned')); - expect(await screen.findByText(/Owned \(1\)/)).toBeInTheDocument(); - expect(await screen.findByTitle(/View/)).toBeInTheDocument(); - expect(await screen.findByTitle(/Edit/)).toBeInTheDocument(); - expect(await screen.findByTitle(/Add to favorites/)).toBeInTheDocument(); + await expect(screen.findByText(/Owned \(1\)/)).resolves.toBeInTheDocument(); + await expect(screen.findByTitle(/View/)).resolves.toBeInTheDocument(); + await expect(screen.findByTitle(/Edit/)).resolves.toBeInTheDocument(); + await expect( + screen.findByTitle(/Add to favorites/), + ).resolves.toBeInTheDocument(); }, 20_000); it('should render the custom actions of an item passed as prop', async () => { @@ -226,10 +228,12 @@ describe('DefaultCatalogPage', () => { await renderWrapped(<DefaultCatalogPage actions={actions} />); fireEvent.click(screen.getByTestId('user-picker-owned')); - expect(await screen.findByText(/Owned \(1\)/)).toBeInTheDocument(); - expect(await screen.findByTitle(/Foo Action/)).toBeInTheDocument(); - expect(await screen.findByTitle(/Bar Action/)).toBeInTheDocument(); - expect((await screen.findByTitle(/Bar Action/)).firstChild).toBeDisabled(); + await expect(screen.findByText(/Owned \(1\)/)).resolves.toBeInTheDocument(); + await expect(screen.findByTitle(/Foo Action/)).resolves.toBeInTheDocument(); + await expect(screen.findByTitle(/Bar Action/)).resolves.toBeInTheDocument(); + await expect( + screen.findByTitle(/Bar Action/).then(e => e.firstChild), + ).resolves.toBeDisabled(); }, 20_000); // this test right now causes some red lines in the log output when running tests @@ -256,7 +260,7 @@ describe('DefaultCatalogPage', () => { await expect(screen.findByText(/Owned \(1\)/)).resolves.toBeInTheDocument(); // The "Starred" menu option should initially be disabled, since there // aren't any starred entities. - await expect(screen.getByTestId('user-picker-starred')).toHaveAttribute( + expect(screen.getByTestId('user-picker-starred')).toHaveAttribute( 'aria-disabled', 'true', ); @@ -269,7 +273,7 @@ describe('DefaultCatalogPage', () => { // Now that we've starred an entity, the "Starred" menu option should be // enabled. - await expect(screen.getByTestId('user-picker-starred')).not.toHaveAttribute( + expect(screen.getByTestId('user-picker-starred')).not.toHaveAttribute( 'aria-disabled', 'true', ); diff --git a/plugins/catalog/src/components/CatalogSearchResultListItem/CatalogSearchResultListItem.tsx b/plugins/catalog/src/components/CatalogSearchResultListItem/CatalogSearchResultListItem.tsx index 2e5cbe2899..cf60138d99 100644 --- a/plugins/catalog/src/components/CatalogSearchResultListItem/CatalogSearchResultListItem.tsx +++ b/plugins/catalog/src/components/CatalogSearchResultListItem/CatalogSearchResultListItem.tsx @@ -25,7 +25,6 @@ import { makeStyles, } from '@material-ui/core'; import { Link } from '@backstage/core-components'; -import { useAnalytics } from '@backstage/core-plugin-api'; import { IndexableDocument, ResultHighlight, @@ -50,7 +49,7 @@ const useStyles = makeStyles({ */ export interface CatalogSearchResultListItemProps { icon?: ReactNode; - result: IndexableDocument; + result?: IndexableDocument; highlight?: ResultHighlight; rank?: number; } @@ -63,13 +62,8 @@ export function CatalogSearchResultListItem( const highlight = props.highlight as ResultHighlight; const classes = useStyles(); - const analytics = useAnalytics(); - const handleClick = () => { - analytics.captureEvent('discover', result.title, { - attributes: { to: result.location }, - value: props.rank, - }); - }; + + if (!result) return null; return ( <> @@ -80,7 +74,7 @@ export function CatalogSearchResultListItem( className={classes.itemText} primaryTypographyProps={{ variant: 'h6' }} primary={ - <Link noTrack to={result.location} onClick={handleClick}> + <Link noTrack to={result.location}> {highlight?.fields.title ? ( <HighlightedSearchResultText text={highlight.fields.title} diff --git a/plugins/catalog/src/components/CatalogTable/CatalogTable.test.tsx b/plugins/catalog/src/components/CatalogTable/CatalogTable.test.tsx index 652c9f3873..f8a655413e 100644 --- a/plugins/catalog/src/components/CatalogTable/CatalogTable.test.tsx +++ b/plugins/catalog/src/components/CatalogTable/CatalogTable.test.tsx @@ -78,10 +78,9 @@ describe('CatalogTable component', () => { }, }, ); - const errorMessage = await screen.findByText( - /Could not fetch catalog entities./, - ); - expect(errorMessage).toBeInTheDocument(); + await expect( + screen.findByText(/Could not fetch catalog entities./), + ).resolves.toBeInTheDocument(); }); it('should display entity names when loading has finished and no error occurred', async () => { @@ -306,6 +305,7 @@ describe('CatalogTable component', () => { }, 20_000, ); + it('should render the subtitle when it is specified', async () => { const entity = { apiVersion: 'backstage.io/v1alpha1', diff --git a/plugins/catalog/src/index.ts b/plugins/catalog/src/index.ts index 7de332cf51..42150dfd66 100644 --- a/plugins/catalog/src/index.ts +++ b/plugins/catalog/src/index.ts @@ -29,7 +29,6 @@ export type { } from './components/AboutCard'; export { AboutContent, AboutField } from './components/AboutCard'; export * from './components/CatalogKindHeader'; -export * from './components/CatalogSearchResultListItem'; export * from './components/CatalogTable'; export * from './components/EntityLayout'; export * from './components/EntityOrphanWarning'; @@ -53,6 +52,7 @@ export { EntityLinksCard, EntityLabelsCard, RelatedEntitiesCard, + CatalogSearchResultListItem, } from './plugin'; export type { DependencyOfComponentsCardProps } from './components/DependencyOfComponentsCard'; @@ -72,3 +72,4 @@ export type { HasResourcesCardProps } from './components/HasResourcesCard'; export type { HasSubcomponentsCardProps } from './components/HasSubcomponentsCard'; export type { HasSystemsCardProps } from './components/HasSystemsCard'; export type { RelatedEntitiesCardProps } from './components/RelatedEntitiesCard'; +export type { CatalogSearchResultListItemProps } from './components/CatalogSearchResultListItem'; diff --git a/plugins/catalog/src/plugin.ts b/plugins/catalog/src/plugin.ts index c83657b85a..12c22eb537 100644 --- a/plugins/catalog/src/plugin.ts +++ b/plugins/catalog/src/plugin.ts @@ -31,6 +31,7 @@ import { fetchApiRef, storageApiRef, } from '@backstage/core-plugin-api'; +import { createSearchResultListItemExtension } from '@backstage/plugin-search-react'; import { DefaultStarredEntitiesApi } from './apis'; import { AboutCardProps } from './components/AboutCard'; import { DefaultCatalogPageProps } from './components/CatalogPage'; @@ -42,6 +43,7 @@ import { HasResourcesCardProps } from './components/HasResourcesCard'; import { HasSubcomponentsCardProps } from './components/HasSubcomponentsCard'; import { HasSystemsCardProps } from './components/HasSystemsCard'; import { RelatedEntitiesCardProps } from './components/RelatedEntitiesCard'; +import { CatalogSearchResultListItemProps } from './components/CatalogSearchResultListItem'; import { rootRouteRef } from './routes'; import { CatalogInputPluginOptions, CatalogPluginOptions } from './options'; @@ -249,3 +251,17 @@ export const RelatedEntitiesCard: <T extends Entity>( }, }), ); + +/** @public */ +export const CatalogSearchResultListItem: ( + props: CatalogSearchResultListItemProps, +) => JSX.Element | null = catalogPlugin.provide( + createSearchResultListItemExtension({ + name: 'CatalogSearchResultListItem', + component: () => + import('./components/CatalogSearchResultListItem').then( + m => m.CatalogSearchResultListItem, + ), + predicate: result => result.type === 'software-catalog', + }), +); diff --git a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md index 3d1dbae39d..811df4adcb 100644 --- a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md +++ b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-cicd-statistics-module-gitlab +## 0.1.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-cicd-statistics@0.1.17-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + ## 0.1.11-next.0 ### Patch Changes diff --git a/plugins/cicd-statistics-module-gitlab/package.json b/plugins/cicd-statistics-module-gitlab/package.json index e3ffb0aa15..32c33e207a 100644 --- a/plugins/cicd-statistics-module-gitlab/package.json +++ b/plugins/cicd-statistics-module-gitlab/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cicd-statistics-module-gitlab", "description": "CI/CD Statistics plugin module; Gitlab CICD", - "version": "0.1.11-next.0", + "version": "0.1.11-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cicd-statistics/CHANGELOG.md b/plugins/cicd-statistics/CHANGELOG.md index 09a9d200d2..a09c2b3339 100644 --- a/plugins/cicd-statistics/CHANGELOG.md +++ b/plugins/cicd-statistics/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-cicd-statistics +## 0.1.17-next.1 + +### Patch Changes + +- d950d3e217: Depend on `@material-ui/core` version `^4.12.2` like all other in-repo packages +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + ## 0.1.17-next.0 ### Patch Changes diff --git a/plugins/cicd-statistics/package.json b/plugins/cicd-statistics/package.json index d660c758ff..09ff03a4c7 100644 --- a/plugins/cicd-statistics/package.json +++ b/plugins/cicd-statistics/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cicd-statistics", "description": "A frontend plugin visualizing CI/CD pipeline statistics (build time)", - "version": "0.1.17-next.0", + "version": "0.1.17-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -41,7 +41,7 @@ "@backstage/core-plugin-api": "workspace:^", "@backstage/plugin-catalog-react": "workspace:^", "@date-io/luxon": "^1.3.13", - "@material-ui/core": "^4.9.13", + "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.57", "@material-ui/pickers": "^3.3.10", diff --git a/plugins/circleci/CHANGELOG.md b/plugins/circleci/CHANGELOG.md index 0221219b27..c3b50931e8 100644 --- a/plugins/circleci/CHANGELOG.md +++ b/plugins/circleci/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-circleci +## 0.3.15-next.1 + +### Patch Changes + +- 85b04f659a: Internal refactor to not use deprecated `substr` +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.3.15-next.0 ### Patch Changes diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json index 7a8c82c7ad..6e370c5def 100644 --- a/plugins/circleci/package.json +++ b/plugins/circleci/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-circleci", "description": "A Backstage plugin that integrates towards Circle CI", - "version": "0.3.15-next.0", + "version": "0.3.15-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/circleci/src/state/useBuilds.ts b/plugins/circleci/src/state/useBuilds.ts index 760c57d764..1e199cfd34 100644 --- a/plugins/circleci/src/state/useBuilds.ts +++ b/plugins/circleci/src/state/useBuilds.ts @@ -64,7 +64,7 @@ const mapSourceDetails = (buildData: BuildSummary) => { branchName: String(buildData.branch), commit: { hash: String(buildData.vcs_revision), - shortHash: String(buildData.vcs_revision).substr(0, 7), + shortHash: String(buildData.vcs_revision).slice(0, 7), committerName: buildData.committer_name, url: commitDetails.commit_url, }, diff --git a/plugins/cloudbuild/CHANGELOG.md b/plugins/cloudbuild/CHANGELOG.md index 23c6373e43..e69f59d9bf 100644 --- a/plugins/cloudbuild/CHANGELOG.md +++ b/plugins/cloudbuild/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-cloudbuild +## 0.3.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.3.15-next.0 ### Patch Changes diff --git a/plugins/cloudbuild/package.json b/plugins/cloudbuild/package.json index 3be78201a9..f80944b683 100644 --- a/plugins/cloudbuild/package.json +++ b/plugins/cloudbuild/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cloudbuild", "description": "A Backstage plugin that integrates towards Google Cloud Build", - "version": "0.3.15-next.0", + "version": "0.3.15-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-climate/CHANGELOG.md b/plugins/code-climate/CHANGELOG.md index b6eae04858..84c51e3f43 100644 --- a/plugins/code-climate/CHANGELOG.md +++ b/plugins/code-climate/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-code-climate +## 0.1.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.1.15-next.0 ### Patch Changes diff --git a/plugins/code-climate/package.json b/plugins/code-climate/package.json index 9bf655af53..9783ee7583 100644 --- a/plugins/code-climate/package.json +++ b/plugins/code-climate/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-code-climate", - "version": "0.1.15-next.0", + "version": "0.1.15-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-coverage-backend/CHANGELOG.md b/plugins/code-coverage-backend/CHANGELOG.md index cff23e1e44..4d6a69c494 100644 --- a/plugins/code-coverage-backend/CHANGELOG.md +++ b/plugins/code-coverage-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-code-coverage-backend +## 0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + ## 0.2.8-next.0 ### Patch Changes diff --git a/plugins/code-coverage-backend/package.json b/plugins/code-coverage-backend/package.json index d9966078c9..1d3ae89cc3 100644 --- a/plugins/code-coverage-backend/package.json +++ b/plugins/code-coverage-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-code-coverage-backend", "description": "A Backstage backend plugin that helps you keep track of your code coverage", - "version": "0.2.8-next.0", + "version": "0.2.8-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-coverage/CHANGELOG.md b/plugins/code-coverage/CHANGELOG.md index 70831e5842..f787ac85aa 100644 --- a/plugins/code-coverage/CHANGELOG.md +++ b/plugins/code-coverage/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-code-coverage +## 0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + ## 0.2.8-next.0 ### Patch Changes diff --git a/plugins/code-coverage/package.json b/plugins/code-coverage/package.json index b5a0bc93d3..d336d9324f 100644 --- a/plugins/code-coverage/package.json +++ b/plugins/code-coverage/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-code-coverage", "description": "A Backstage plugin that helps you keep track of your code coverage", - "version": "0.2.8-next.0", + "version": "0.2.8-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/codescene/CHANGELOG.md b/plugins/codescene/CHANGELOG.md index deb3feb593..a89f49dc62 100644 --- a/plugins/codescene/CHANGELOG.md +++ b/plugins/codescene/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-codescene +## 0.1.10-next.0 + +### Patch Changes + +- d950d3e217: Depend on `@material-ui/core` version `^4.12.2` like all other in-repo packages +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + ## 0.1.9 ### Patch Changes diff --git a/plugins/codescene/package.json b/plugins/codescene/package.json index 8d2e91b0fd..6f763d529c 100644 --- a/plugins/codescene/package.json +++ b/plugins/codescene/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-codescene", - "version": "0.1.9", + "version": "0.1.10-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -27,7 +27,7 @@ "@backstage/core-plugin-api": "workspace:^", "@backstage/errors": "workspace:^", "@backstage/theme": "workspace:^", - "@material-ui/core": "^4.9.10", + "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "^4.0.0-alpha.57", "rc-progress": "3.4.1", diff --git a/plugins/config-schema/CHANGELOG.md b/plugins/config-schema/CHANGELOG.md index 0c9889e2ae..a8b4640584 100644 --- a/plugins/config-schema/CHANGELOG.md +++ b/plugins/config-schema/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-config-schema +## 0.1.38-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + ## 0.1.37 ### Patch Changes diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json index 436a2c8ca5..f7bb416f22 100644 --- a/plugins/config-schema/package.json +++ b/plugins/config-schema/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-config-schema", "description": "A Backstage plugin that lets you browse the configuration schema of your app", - "version": "0.1.37", + "version": "0.1.38-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cost-insights/CHANGELOG.md b/plugins/cost-insights/CHANGELOG.md index 0828647aac..7c69958dde 100644 --- a/plugins/cost-insights/CHANGELOG.md +++ b/plugins/cost-insights/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-cost-insights +## 0.12.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-cost-insights-common@0.1.1 + ## 0.12.4-next.0 ### Patch Changes diff --git a/plugins/cost-insights/package.json b/plugins/cost-insights/package.json index 449338c32d..6e2bb01ef9 100644 --- a/plugins/cost-insights/package.json +++ b/plugins/cost-insights/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cost-insights", "description": "A Backstage plugin that helps you keep track of your cloud spend", - "version": "0.12.4-next.0", + "version": "0.12.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/dynatrace/CHANGELOG.md b/plugins/dynatrace/CHANGELOG.md index a201886305..60be881c47 100644 --- a/plugins/dynatrace/CHANGELOG.md +++ b/plugins/dynatrace/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-dynatrace +## 2.0.0-next.1 + +### Patch Changes + +- d950d3e217: Depend on `@material-ui/core` version `^4.12.2` like all other in-repo packages +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 2.0.0-next.0 ### Patch Changes diff --git a/plugins/dynatrace/package.json b/plugins/dynatrace/package.json index 0a2006f1ad..c7656c52de 100644 --- a/plugins/dynatrace/package.json +++ b/plugins/dynatrace/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-dynatrace", - "version": "2.0.0-next.0", + "version": "2.0.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -31,7 +31,7 @@ "@backstage/core-components": "workspace:^", "@backstage/core-plugin-api": "workspace:^", "@backstage/theme": "workspace:^", - "@material-ui/core": "^4.9.13", + "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.57", "react-use": "^17.2.4" diff --git a/plugins/events-backend-module-aws-sqs/CHANGELOG.md b/plugins/events-backend-module-aws-sqs/CHANGELOG.md index 4086a1f7a2..b3431b3510 100644 --- a/plugins/events-backend-module-aws-sqs/CHANGELOG.md +++ b/plugins/events-backend-module-aws-sqs/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-events-backend-module-aws-sqs +## 0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + - @backstage/plugin-events-node@0.2.3-next.1 + ## 0.1.4-next.0 ### Patch Changes diff --git a/plugins/events-backend-module-aws-sqs/package.json b/plugins/events-backend-module-aws-sqs/package.json index e76e71ecfe..1925781020 100644 --- a/plugins/events-backend-module-aws-sqs/package.json +++ b/plugins/events-backend-module-aws-sqs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-aws-sqs", - "version": "0.1.4-next.0", + "version": "0.1.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-azure/CHANGELOG.md b/plugins/events-backend-module-azure/CHANGELOG.md index 6b76965e00..12bc4a0798 100644 --- a/plugins/events-backend-module-azure/CHANGELOG.md +++ b/plugins/events-backend-module-azure/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-azure +## 0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/plugin-events-node@0.2.3-next.1 + ## 0.1.4-next.0 ### Patch Changes diff --git a/plugins/events-backend-module-azure/package.json b/plugins/events-backend-module-azure/package.json index 68d3b0a2ad..6520ed83ca 100644 --- a/plugins/events-backend-module-azure/package.json +++ b/plugins/events-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-azure", - "version": "0.1.4-next.0", + "version": "0.1.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md index 2141562a13..182d5633ed 100644 --- a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-bitbucket-cloud +## 0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/plugin-events-node@0.2.3-next.1 + ## 0.1.4-next.0 ### Patch Changes diff --git a/plugins/events-backend-module-bitbucket-cloud/package.json b/plugins/events-backend-module-bitbucket-cloud/package.json index 7a2b599885..6a18b548e8 100644 --- a/plugins/events-backend-module-bitbucket-cloud/package.json +++ b/plugins/events-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-bitbucket-cloud", - "version": "0.1.4-next.0", + "version": "0.1.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-gerrit/CHANGELOG.md b/plugins/events-backend-module-gerrit/CHANGELOG.md index 11b37dd443..4d1857f4d6 100644 --- a/plugins/events-backend-module-gerrit/CHANGELOG.md +++ b/plugins/events-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-gerrit +## 0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/plugin-events-node@0.2.3-next.1 + ## 0.1.4-next.0 ### Patch Changes diff --git a/plugins/events-backend-module-gerrit/package.json b/plugins/events-backend-module-gerrit/package.json index 199077d990..8765f7777d 100644 --- a/plugins/events-backend-module-gerrit/package.json +++ b/plugins/events-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gerrit", - "version": "0.1.4-next.0", + "version": "0.1.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-github/CHANGELOG.md b/plugins/events-backend-module-github/CHANGELOG.md index 3ece4590aa..d15c3c82ce 100644 --- a/plugins/events-backend-module-github/CHANGELOG.md +++ b/plugins/events-backend-module-github/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-events-backend-module-github +## 0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/config@1.0.6 + - @backstage/plugin-events-node@0.2.3-next.1 + ## 0.1.4-next.0 ### Patch Changes diff --git a/plugins/events-backend-module-github/package.json b/plugins/events-backend-module-github/package.json index 9975107d17..aa2f6b26fb 100644 --- a/plugins/events-backend-module-github/package.json +++ b/plugins/events-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-github", - "version": "0.1.4-next.0", + "version": "0.1.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-gitlab/CHANGELOG.md b/plugins/events-backend-module-gitlab/CHANGELOG.md index 87e478b56a..4e7598b084 100644 --- a/plugins/events-backend-module-gitlab/CHANGELOG.md +++ b/plugins/events-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-events-backend-module-gitlab +## 0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/config@1.0.6 + - @backstage/plugin-events-node@0.2.3-next.1 + ## 0.1.4-next.0 ### Patch Changes diff --git a/plugins/events-backend-module-gitlab/package.json b/plugins/events-backend-module-gitlab/package.json index a09577ae0e..bfca24f6bc 100644 --- a/plugins/events-backend-module-gitlab/package.json +++ b/plugins/events-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gitlab", - "version": "0.1.4-next.0", + "version": "0.1.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-test-utils/CHANGELOG.md b/plugins/events-backend-test-utils/CHANGELOG.md index c786d4540e..d495725662 100644 --- a/plugins/events-backend-test-utils/CHANGELOG.md +++ b/plugins/events-backend-test-utils/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-events-backend-test-utils +## 0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.3-next.1 + ## 0.1.4-next.0 ### Patch Changes diff --git a/plugins/events-backend-test-utils/package.json b/plugins/events-backend-test-utils/package.json index fa99c54da1..8032c98031 100644 --- a/plugins/events-backend-test-utils/package.json +++ b/plugins/events-backend-test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-events-backend-test-utils", "description": "The plugin-events-backend-test-utils for @backstage/plugin-events-node", - "version": "0.1.4-next.0", + "version": "0.1.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend/CHANGELOG.md b/plugins/events-backend/CHANGELOG.md index ea8e4a2c47..1d5927c387 100644 --- a/plugins/events-backend/CHANGELOG.md +++ b/plugins/events-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-events-backend +## 0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/config@1.0.6 + - @backstage/plugin-events-node@0.2.3-next.1 + ## 0.2.3-next.0 ### Patch Changes diff --git a/plugins/events-backend/package.json b/plugins/events-backend/package.json index 375fdd9034..d120ae892b 100644 --- a/plugins/events-backend/package.json +++ b/plugins/events-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend", - "version": "0.2.3-next.0", + "version": "0.2.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-node/CHANGELOG.md b/plugins/events-node/CHANGELOG.md index 61e19f995b..ef0d97ad18 100644 --- a/plugins/events-node/CHANGELOG.md +++ b/plugins/events-node/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-events-node +## 0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.1 + ## 0.2.3-next.0 ### Patch Changes diff --git a/plugins/events-node/package.json b/plugins/events-node/package.json index 9be7706e1e..2cfff749e3 100644 --- a/plugins/events-node/package.json +++ b/plugins/events-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-events-node", "description": "The plugin-events-node module for @backstage/plugin-events-backend", - "version": "0.2.3-next.0", + "version": "0.2.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/example-todo-list-backend/CHANGELOG.md b/plugins/example-todo-list-backend/CHANGELOG.md index b3db395424..e3379a0082 100644 --- a/plugins/example-todo-list-backend/CHANGELOG.md +++ b/plugins/example-todo-list-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @internal/plugin-todo-list-backend +## 1.0.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.11-next.1 + ## 1.0.10-next.0 ### Patch Changes diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json index 123f2c78ad..eec3b47b67 100644 --- a/plugins/example-todo-list-backend/package.json +++ b/plugins/example-todo-list-backend/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list-backend", - "version": "1.0.10-next.0", + "version": "1.0.10-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/example-todo-list/CHANGELOG.md b/plugins/example-todo-list/CHANGELOG.md index 66c920d08b..17c56cc5d1 100644 --- a/plugins/example-todo-list/CHANGELOG.md +++ b/plugins/example-todo-list/CHANGELOG.md @@ -1,5 +1,14 @@ # @internal/plugin-todo-list +## 1.0.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 1.0.9 ### Patch Changes diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json index ce8197bc6e..fe4ac8d1c3 100644 --- a/plugins/example-todo-list/package.json +++ b/plugins/example-todo-list/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list", - "version": "1.0.9", + "version": "1.0.10-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore-backend/CHANGELOG.md b/plugins/explore-backend/CHANGELOG.md index b2465ea308..e9a25933de 100644 --- a/plugins/explore-backend/CHANGELOG.md +++ b/plugins/explore-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-explore-backend +## 0.0.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.1 + ## 0.0.4-next.0 ### Patch Changes diff --git a/plugins/explore-backend/package.json b/plugins/explore-backend/package.json index 399f4df018..8356240641 100644 --- a/plugins/explore-backend/package.json +++ b/plugins/explore-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-explore-backend", - "version": "0.0.4-next.0", + "version": "0.0.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore/CHANGELOG.md b/plugins/explore/CHANGELOG.md index e6d5dd2ecc..dfa262e63d 100644 --- a/plugins/explore/CHANGELOG.md +++ b/plugins/explore/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-explore +## 0.4.0-next.1 + +### Minor Changes + +- 0eaa579f89: The `ToolSearchResultListItem` component is now a search result extension. This means that when rendered as a child of components that render search extensions, the `result`, `rank`, and `highlight` properties are optional. See the [documentation](https://backstage.io/docs/features/search/how-to-guides#how-to-render-search-results-using-extensions) for more details. + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-search-react@1.5.0-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-explore-react@0.0.25 + - @backstage/plugin-search-common@1.2.1 + ## 0.3.46-next.0 ### Patch Changes diff --git a/plugins/explore/api-report.md b/plugins/explore/api-report.md index d184ce01a4..e7adde4b77 100644 --- a/plugins/explore/api-report.md +++ b/plugins/explore/api-report.md @@ -125,9 +125,9 @@ export const ToolExplorerContent: (props: { }) => JSX.Element; // @public (undocumented) -export function ToolSearchResultListItem( +export const ToolSearchResultListItem: ( props: ToolSearchResultListItemProps, -): JSX.Element; +) => JSX.Element | null; // @public export interface ToolSearchResultListItemProps { @@ -138,6 +138,6 @@ export interface ToolSearchResultListItemProps { // (undocumented) rank?: number; // (undocumented) - result: IndexableDocument; + result?: IndexableDocument; } ``` diff --git a/plugins/explore/package.json b/plugins/explore/package.json index 6700ba09e8..8a6b856262 100644 --- a/plugins/explore/package.json +++ b/plugins/explore/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-explore", "description": "A Backstage plugin for building an exploration page of your software ecosystem", - "version": "0.3.46-next.0", + "version": "0.4.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore/src/components/ToolSearchResultListItem/ToolSearchResultListItem.tsx b/plugins/explore/src/components/ToolSearchResultListItem/ToolSearchResultListItem.tsx index 3f5a515efb..c9e8946f26 100644 --- a/plugins/explore/src/components/ToolSearchResultListItem/ToolSearchResultListItem.tsx +++ b/plugins/explore/src/components/ToolSearchResultListItem/ToolSearchResultListItem.tsx @@ -25,7 +25,6 @@ import { makeStyles, } from '@material-ui/core'; import { Link } from '@backstage/core-components'; -import { useAnalytics } from '@backstage/core-plugin-api'; import { IndexableDocument, ResultHighlight, @@ -50,23 +49,18 @@ const useStyles = makeStyles({ */ export interface ToolSearchResultListItemProps { icon?: ReactNode; - result: IndexableDocument; + result?: IndexableDocument; highlight?: ResultHighlight; rank?: number; } -/** @public */ +/** @public */ export function ToolSearchResultListItem(props: ToolSearchResultListItemProps) { const result = props.result as any; const classes = useStyles(); - const analytics = useAnalytics(); - const handleClick = () => { - analytics.captureEvent('discover', result.title, { - attributes: { to: result.location }, - value: props.rank, - }); - }; + + if (!result) return null; return ( <> @@ -77,7 +71,7 @@ export function ToolSearchResultListItem(props: ToolSearchResultListItemProps) { className={classes.itemText} primaryTypographyProps={{ variant: 'h6' }} primary={ - <Link noTrack to={result.location} onClick={handleClick}> + <Link noTrack to={result.location}> {props.highlight?.fields.title ? ( <HighlightedSearchResultText text={props.highlight.fields.title} diff --git a/plugins/explore/src/components/index.ts b/plugins/explore/src/components/index.ts index d3af1b99c2..f8fba16910 100644 --- a/plugins/explore/src/components/index.ts +++ b/plugins/explore/src/components/index.ts @@ -16,4 +16,3 @@ export * from './DomainCard'; export * from './ExploreLayout'; -export * from './ToolSearchResultListItem'; diff --git a/plugins/explore/src/index.ts b/plugins/explore/src/index.ts index 24591211f7..ec910640cd 100644 --- a/plugins/explore/src/index.ts +++ b/plugins/explore/src/index.ts @@ -23,5 +23,11 @@ export * from './api'; export * from './components'; export * from './extensions'; -export { explorePlugin, explorePlugin as plugin } from './plugin'; +export { + ToolSearchResultListItem, + explorePlugin, + explorePlugin as plugin, +} from './plugin'; export * from './routes'; + +export type { ToolSearchResultListItemProps } from './components/ToolSearchResultListItem'; diff --git a/plugins/explore/src/plugin.ts b/plugins/explore/src/plugin.ts index ab8eedf7ef..5a4bec53c5 100644 --- a/plugins/explore/src/plugin.ts +++ b/plugins/explore/src/plugin.ts @@ -22,7 +22,9 @@ import { discoveryApiRef, fetchApiRef, } from '@backstage/core-plugin-api'; +import { createSearchResultListItemExtension } from '@backstage/plugin-search-react'; import { ExploreClient, exploreApiRef } from './api'; +import { ToolSearchResultListItemProps } from './components/ToolSearchResultListItem'; // import { exampleTools } from './util/examples'; /** @public */ @@ -65,3 +67,17 @@ export const explorePlugin = createPlugin({ catalogEntity: catalogEntityRouteRef, }, }); + +/** @public */ +export const ToolSearchResultListItem: ( + props: ToolSearchResultListItemProps, +) => JSX.Element | null = explorePlugin.provide( + createSearchResultListItemExtension({ + name: 'ToolSearchResultListItem', + component: () => + import('./components/ToolSearchResultListItem').then( + m => m.ToolSearchResultListItem, + ), + predicate: result => result.type === 'tools', + }), +); diff --git a/plugins/firehydrant/CHANGELOG.md b/plugins/firehydrant/CHANGELOG.md index 60d4bad35f..73f7de642f 100644 --- a/plugins/firehydrant/CHANGELOG.md +++ b/plugins/firehydrant/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-firehydrant +## 0.1.32-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.1.32-next.0 ### Patch Changes diff --git a/plugins/firehydrant/package.json b/plugins/firehydrant/package.json index bd1536d76f..4b40c86c3c 100644 --- a/plugins/firehydrant/package.json +++ b/plugins/firehydrant/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-firehydrant", "description": "A Backstage plugin that integrates towards FireHydrant", - "version": "0.1.32-next.0", + "version": "0.1.32-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/fossa/CHANGELOG.md b/plugins/fossa/CHANGELOG.md index d91bd1e0b2..c0987cd461 100644 --- a/plugins/fossa/CHANGELOG.md +++ b/plugins/fossa/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-fossa +## 0.2.47-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + ## 0.2.47-next.0 ### Patch Changes diff --git a/plugins/fossa/package.json b/plugins/fossa/package.json index 131ea2f747..444471315c 100644 --- a/plugins/fossa/package.json +++ b/plugins/fossa/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-fossa", "description": "A Backstage plugin that integrates towards FOSSA", - "version": "0.2.47-next.0", + "version": "0.2.47-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gcalendar/CHANGELOG.md b/plugins/gcalendar/CHANGELOG.md index 8155123f67..a1f2b5a0c7 100644 --- a/plugins/gcalendar/CHANGELOG.md +++ b/plugins/gcalendar/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-gcalendar +## 0.3.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + ## 0.3.10 ### Patch Changes diff --git a/plugins/gcalendar/package.json b/plugins/gcalendar/package.json index dd6c804f98..48e78f175a 100644 --- a/plugins/gcalendar/package.json +++ b/plugins/gcalendar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-gcalendar", - "version": "0.3.10", + "version": "0.3.11-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gcp-projects/CHANGELOG.md b/plugins/gcp-projects/CHANGELOG.md index 67ac992174..0a8693a233 100644 --- a/plugins/gcp-projects/CHANGELOG.md +++ b/plugins/gcp-projects/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-gcp-projects +## 0.3.34-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.3.33 ### Patch Changes diff --git a/plugins/gcp-projects/package.json b/plugins/gcp-projects/package.json index 193ab0af28..a3894760cf 100644 --- a/plugins/gcp-projects/package.json +++ b/plugins/gcp-projects/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-gcp-projects", "description": "A Backstage plugin that helps you manage projects in GCP", - "version": "0.3.33", + "version": "0.3.34-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/git-release-manager/CHANGELOG.md b/plugins/git-release-manager/CHANGELOG.md index 6d59cae145..707f7be510 100644 --- a/plugins/git-release-manager/CHANGELOG.md +++ b/plugins/git-release-manager/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-git-release-manager +## 0.3.28-next.0 + +### Patch Changes + +- 85b04f659a: Internal refactor to not use deprecated `substr` +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + ## 0.3.27 ### Patch Changes diff --git a/plugins/git-release-manager/package.json b/plugins/git-release-manager/package.json index d3273e686d..7ec7d5806c 100644 --- a/plugins/git-release-manager/package.json +++ b/plugins/git-release-manager/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-git-release-manager", "description": "A Backstage plugin that helps you manage releases in git", - "version": "0.3.27", + "version": "0.3.28-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/git-release-manager/src/helpers/getShortCommitHash.ts b/plugins/git-release-manager/src/helpers/getShortCommitHash.ts index fd53ac7941..3b7a9cc310 100644 --- a/plugins/git-release-manager/src/helpers/getShortCommitHash.ts +++ b/plugins/git-release-manager/src/helpers/getShortCommitHash.ts @@ -17,7 +17,7 @@ import { GitReleaseManagerError } from '../errors/GitReleaseManagerError'; export function getShortCommitHash(hash: string) { - const shortCommitHash = hash.substr(0, 7); + const shortCommitHash = hash.slice(0, 7); if (shortCommitHash.length < 7) { throw new GitReleaseManagerError( diff --git a/plugins/github-actions/CHANGELOG.md b/plugins/github-actions/CHANGELOG.md index 4f291714f6..160a0f8a22 100644 --- a/plugins/github-actions/CHANGELOG.md +++ b/plugins/github-actions/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-github-actions +## 0.5.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + ## 0.5.15-next.0 ### Patch Changes diff --git a/plugins/github-actions/package.json b/plugins/github-actions/package.json index 2fd5234847..509255d343 100644 --- a/plugins/github-actions/package.json +++ b/plugins/github-actions/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-actions", "description": "A Backstage plugin that integrates towards GitHub Actions", - "version": "0.5.15-next.0", + "version": "0.5.15-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-deployments/CHANGELOG.md b/plugins/github-deployments/CHANGELOG.md index f76d88bda7..68156abda2 100644 --- a/plugins/github-deployments/CHANGELOG.md +++ b/plugins/github-deployments/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-github-deployments +## 0.1.46-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/integration-react@1.1.10-next.0 + - @backstage/theme@0.2.16 + ## 0.1.46-next.0 ### Patch Changes diff --git a/plugins/github-deployments/package.json b/plugins/github-deployments/package.json index c673adc712..ec596194c7 100644 --- a/plugins/github-deployments/package.json +++ b/plugins/github-deployments/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-deployments", "description": "A Backstage plugin that integrates towards GitHub Deployments", - "version": "0.1.46-next.0", + "version": "0.1.46-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-issues/CHANGELOG.md b/plugins/github-issues/CHANGELOG.md index f87eef712c..38c0387429 100644 --- a/plugins/github-issues/CHANGELOG.md +++ b/plugins/github-issues/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-github-issues +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + ## 0.2.4-next.0 ### Patch Changes diff --git a/plugins/github-issues/package.json b/plugins/github-issues/package.json index 8a12fd2153..284518bad3 100644 --- a/plugins/github-issues/package.json +++ b/plugins/github-issues/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-github-issues", - "version": "0.2.4-next.0", + "version": "0.2.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-pull-requests-board/CHANGELOG.md b/plugins/github-pull-requests-board/CHANGELOG.md index 5c71016753..fa4123887b 100644 --- a/plugins/github-pull-requests-board/CHANGELOG.md +++ b/plugins/github-pull-requests-board/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-github-pull-requests-board +## 0.1.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + ## 0.1.9-next.0 ### Patch Changes diff --git a/plugins/github-pull-requests-board/package.json b/plugins/github-pull-requests-board/package.json index 7558d60649..e947557825 100644 --- a/plugins/github-pull-requests-board/package.json +++ b/plugins/github-pull-requests-board/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-pull-requests-board", "description": "A Backstage plugin that allows you to see all open Pull Requests for all the repositories owned by your team", - "version": "0.1.9-next.0", + "version": "0.1.9-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gitops-profiles/CHANGELOG.md b/plugins/gitops-profiles/CHANGELOG.md index c7e895315a..fa835e2131 100644 --- a/plugins/gitops-profiles/CHANGELOG.md +++ b/plugins/gitops-profiles/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-gitops-profiles +## 0.3.33-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.3.32 ### Patch Changes diff --git a/plugins/gitops-profiles/package.json b/plugins/gitops-profiles/package.json index b485aea867..3f0f3614cd 100644 --- a/plugins/gitops-profiles/package.json +++ b/plugins/gitops-profiles/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-gitops-profiles", "description": "A Backstage plugin that helps you manage GitOps profiles", - "version": "0.3.32", + "version": "0.3.33-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gocd/CHANGELOG.md b/plugins/gocd/CHANGELOG.md index a030870317..adecc5b5f1 100644 --- a/plugins/gocd/CHANGELOG.md +++ b/plugins/gocd/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-gocd +## 0.1.21-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + ## 0.1.21-next.0 ### Patch Changes diff --git a/plugins/gocd/package.json b/plugins/gocd/package.json index 8988f26b93..f659fe4525 100644 --- a/plugins/gocd/package.json +++ b/plugins/gocd/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-gocd", "description": "A Backstage plugin that integrates towards GoCD", - "version": "0.1.21-next.0", + "version": "0.1.21-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/graphiql/CHANGELOG.md b/plugins/graphiql/CHANGELOG.md index f14c0602d0..1be4fe30b5 100644 --- a/plugins/graphiql/CHANGELOG.md +++ b/plugins/graphiql/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-graphiql +## 0.2.47-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.2.46 ### Patch Changes diff --git a/plugins/graphiql/package.json b/plugins/graphiql/package.json index 92c89dda60..b5c868d86d 100644 --- a/plugins/graphiql/package.json +++ b/plugins/graphiql/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphiql", "description": "Backstage plugin for browsing GraphQL APIs", - "version": "0.2.46", + "version": "0.2.47-next.0", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/plugins/graphql-backend/CHANGELOG.md b/plugins/graphql-backend/CHANGELOG.md index 7467f7a0bf..4686d4b103 100644 --- a/plugins/graphql-backend/CHANGELOG.md +++ b/plugins/graphql-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-graphql-backend +## 0.1.32-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/plugin-catalog-graphql@0.3.18-next.0 + ## 0.1.32-next.0 ### Patch Changes diff --git a/plugins/graphql-backend/package.json b/plugins/graphql-backend/package.json index 7e351e5db0..d3b4fc8707 100644 --- a/plugins/graphql-backend/package.json +++ b/plugins/graphql-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphql-backend", "description": "An experimental Backstage backend plugin for GraphQL", - "version": "0.1.32-next.0", + "version": "0.1.32-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/home/CHANGELOG.md b/plugins/home/CHANGELOG.md index b06d9b7a5c..e9698a5cde 100644 --- a/plugins/home/CHANGELOG.md +++ b/plugins/home/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-home +## 0.4.31-next.1 + +### Patch Changes + +- 3d1d867d42: Fixed regression that caused the `WelcomeTitle` to not be the right size when passed to the `title` property of the `<Header>` component. A Storybook entry was also added for the `WelcomeTitle` +- c553a625d2: remove unused plugin-stack-overflow dependency +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.4.31-next.0 ### Patch Changes diff --git a/plugins/home/package.json b/plugins/home/package.json index ae3c03f975..8f6a4f755f 100644 --- a/plugins/home/package.json +++ b/plugins/home/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-home", "description": "A Backstage plugin that helps you build a home page", - "version": "0.4.31-next.0", + "version": "0.4.31-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -38,7 +38,6 @@ "@backstage/core-components": "workspace:^", "@backstage/core-plugin-api": "workspace:^", "@backstage/plugin-catalog-react": "workspace:^", - "@backstage/plugin-stack-overflow": "workspace:^", "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", diff --git a/plugins/home/src/homePageComponents/WelcomeTitle/WelcomeTitle.stories.tsx b/plugins/home/src/homePageComponents/WelcomeTitle/WelcomeTitle.stories.tsx new file mode 100644 index 0000000000..ddcce2fe41 --- /dev/null +++ b/plugins/home/src/homePageComponents/WelcomeTitle/WelcomeTitle.stories.tsx @@ -0,0 +1,29 @@ +/* + * Copyright 2023 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 { Header } from '@backstage/core-components'; +import { wrapInTestApp } from '@backstage/test-utils'; +import React, { ComponentType } from 'react'; +import { WelcomeTitle } from './WelcomeTitle'; + +export default { + title: 'Plugins/Home/Components/WelcomeTitle', + decorators: [(Story: ComponentType<{}>) => wrapInTestApp(<Story />)], +}; + +export const Default = () => { + return <Header title={<WelcomeTitle />} pageTitleOverride="Home" />; +}; diff --git a/plugins/home/src/homePageComponents/WelcomeTitle/WelcomeTitle.tsx b/plugins/home/src/homePageComponents/WelcomeTitle/WelcomeTitle.tsx index 1d2f3d672a..49ae38d90c 100644 --- a/plugins/home/src/homePageComponents/WelcomeTitle/WelcomeTitle.tsx +++ b/plugins/home/src/homePageComponents/WelcomeTitle/WelcomeTitle.tsx @@ -18,8 +18,7 @@ import { identityApiRef, useApi, } from '@backstage/core-plugin-api'; -import { Tooltip } from '@material-ui/core'; -import Typography from '@material-ui/core/Typography'; +import { Tooltip, Typography } from '@material-ui/core'; import React, { useEffect, useMemo } from 'react'; import useAsync from 'react-use/lib/useAsync'; import { getTimeBasedGreeting } from './timeUtil'; @@ -44,7 +43,7 @@ export const WelcomeTitle = () => { return ( <Tooltip title={greeting.language}> - <Typography component="span">{`${greeting.greeting}${ + <Typography component="span" variant="inherit">{`${greeting.greeting}${ profile?.displayName ? `, ${profile?.displayName}` : '' }!`}</Typography> </Tooltip> diff --git a/plugins/ilert/CHANGELOG.md b/plugins/ilert/CHANGELOG.md index ec39edeca1..d0edef70c6 100644 --- a/plugins/ilert/CHANGELOG.md +++ b/plugins/ilert/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-ilert +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + ## 0.2.4-next.0 ### Patch Changes diff --git a/plugins/ilert/package.json b/plugins/ilert/package.json index 53ab674dc4..459f823255 100644 --- a/plugins/ilert/package.json +++ b/plugins/ilert/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-ilert", "description": "A Backstage plugin that integrates towards iLert", - "version": "0.2.4-next.0", + "version": "0.2.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/jenkins-backend/CHANGELOG.md b/plugins/jenkins-backend/CHANGELOG.md index e35e69b2d5..9cbcc43f5f 100644 --- a/plugins/jenkins-backend/CHANGELOG.md +++ b/plugins/jenkins-backend/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-jenkins-backend +## 0.1.32-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.11-next.1 + - @backstage/plugin-jenkins-common@0.1.13-next.0 + - @backstage/plugin-permission-common@0.7.3 + ## 0.1.32-next.0 ### Patch Changes diff --git a/plugins/jenkins-backend/package.json b/plugins/jenkins-backend/package.json index 7880f391e0..43614edea2 100644 --- a/plugins/jenkins-backend/package.json +++ b/plugins/jenkins-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-jenkins-backend", "description": "A Backstage backend plugin that integrates towards Jenkins", - "version": "0.1.32-next.0", + "version": "0.1.32-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/jenkins/CHANGELOG.md b/plugins/jenkins/CHANGELOG.md index 086f7b354a..045236e8aa 100644 --- a/plugins/jenkins/CHANGELOG.md +++ b/plugins/jenkins/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-jenkins +## 0.7.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-jenkins-common@0.1.13-next.0 + ## 0.7.14-next.0 ### Patch Changes diff --git a/plugins/jenkins/package.json b/plugins/jenkins/package.json index da7b46af08..2fc0ed67ca 100644 --- a/plugins/jenkins/package.json +++ b/plugins/jenkins/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-jenkins", "description": "A Backstage plugin that integrates towards Jenkins", - "version": "0.7.14-next.0", + "version": "0.7.14-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kafka-backend/CHANGELOG.md b/plugins/kafka-backend/CHANGELOG.md index fe39a7f219..a07fb79fae 100644 --- a/plugins/kafka-backend/CHANGELOG.md +++ b/plugins/kafka-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-kafka-backend +## 0.2.35-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + ## 0.2.35-next.0 ### Patch Changes diff --git a/plugins/kafka-backend/package.json b/plugins/kafka-backend/package.json index 172b4b70d8..93377dd9eb 100644 --- a/plugins/kafka-backend/package.json +++ b/plugins/kafka-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kafka-backend", "description": "A Backstage backend plugin that integrates towards Kafka", - "version": "0.2.35-next.0", + "version": "0.2.35-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kafka/CHANGELOG.md b/plugins/kafka/CHANGELOG.md index f5833782df..573a28a957 100644 --- a/plugins/kafka/CHANGELOG.md +++ b/plugins/kafka/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-kafka +## 0.3.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.3.15-next.0 ### Patch Changes diff --git a/plugins/kafka/package.json b/plugins/kafka/package.json index 40b9d5a8d0..7583fd06b5 100644 --- a/plugins/kafka/package.json +++ b/plugins/kafka/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kafka", "description": "A Backstage plugin that integrates towards Kafka", - "version": "0.3.15-next.0", + "version": "0.3.15-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kubernetes-backend/CHANGELOG.md b/plugins/kubernetes-backend/CHANGELOG.md index 8fefe5f133..fe00c7f8a1 100644 --- a/plugins/kubernetes-backend/CHANGELOG.md +++ b/plugins/kubernetes-backend/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-kubernetes-backend +## 0.9.3-next.1 + +### Patch Changes + +- 628e2bd89a: Updated dependency `@kubernetes/client-node` to `0.18.1`. +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/plugin-kubernetes-common@0.6.0-next.1 + - @backstage/backend-test-utils@0.1.34-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.11-next.1 + ## 0.9.3-next.0 ### Patch Changes diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index 0049aa6256..68225c489a 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes-backend", "description": "A Backstage backend plugin that integrates towards Kubernetes", - "version": "0.9.3-next.0", + "version": "0.9.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kubernetes-common/CHANGELOG.md b/plugins/kubernetes-common/CHANGELOG.md index ec5b17df99..4f369bf289 100644 --- a/plugins/kubernetes-common/CHANGELOG.md +++ b/plugins/kubernetes-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-kubernetes-common +## 0.6.0-next.1 + +### Patch Changes + +- 628e2bd89a: Updated dependency `@kubernetes/client-node` to `0.18.1`. +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + ## 0.6.0-next.0 ### Minor Changes diff --git a/plugins/kubernetes-common/package.json b/plugins/kubernetes-common/package.json index 23dd9eeae5..21f6480aa1 100644 --- a/plugins/kubernetes-common/package.json +++ b/plugins/kubernetes-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes-common", "description": "Common functionalities for kubernetes, to be shared between kubernetes and kubernetes-backend plugin", - "version": "0.6.0-next.0", + "version": "0.6.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kubernetes/CHANGELOG.md b/plugins/kubernetes/CHANGELOG.md index b5d62408ad..2c375b8d0a 100644 --- a/plugins/kubernetes/CHANGELOG.md +++ b/plugins/kubernetes/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-kubernetes +## 0.7.8-next.1 + +### Patch Changes + +- 145a79a15b: Condenses kubernetes ui plugin to fit more onscreen and increase visibility +- 628e2bd89a: Updated dependency `@kubernetes/client-node` to `0.18.1`. +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-kubernetes-common@0.6.0-next.1 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.7.8-next.0 ### Patch Changes diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index 96a369dccf..6c9c56db09 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes", "description": "A Backstage plugin that integrates towards Kubernetes", - "version": "0.7.8-next.0", + "version": "0.7.8-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/lighthouse/CHANGELOG.md b/plugins/lighthouse/CHANGELOG.md index 8e21a89a8d..1c54959f18 100644 --- a/plugins/lighthouse/CHANGELOG.md +++ b/plugins/lighthouse/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-lighthouse +## 0.3.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.3.15-next.0 ### Patch Changes diff --git a/plugins/lighthouse/package.json b/plugins/lighthouse/package.json index 242ca4b773..e754a0e23c 100644 --- a/plugins/lighthouse/package.json +++ b/plugins/lighthouse/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-lighthouse", "description": "A Backstage plugin that integrates towards Lighthouse", - "version": "0.3.15-next.0", + "version": "0.3.15-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/newrelic-dashboard/CHANGELOG.md b/plugins/newrelic-dashboard/CHANGELOG.md index 6d3c0c4e0e..3f9352d0d2 100644 --- a/plugins/newrelic-dashboard/CHANGELOG.md +++ b/plugins/newrelic-dashboard/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-newrelic-dashboard +## 0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + ## 0.2.8-next.0 ### Patch Changes diff --git a/plugins/newrelic-dashboard/package.json b/plugins/newrelic-dashboard/package.json index 4c4957d400..09d4afcd93 100644 --- a/plugins/newrelic-dashboard/package.json +++ b/plugins/newrelic-dashboard/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-newrelic-dashboard", - "version": "0.2.8-next.0", + "version": "0.2.8-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/newrelic/CHANGELOG.md b/plugins/newrelic/CHANGELOG.md index 8332f157af..10a7d6131b 100644 --- a/plugins/newrelic/CHANGELOG.md +++ b/plugins/newrelic/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-newrelic +## 0.3.33-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.3.32 ### Patch Changes diff --git a/plugins/newrelic/package.json b/plugins/newrelic/package.json index 022eda45bd..60f6019ccf 100644 --- a/plugins/newrelic/package.json +++ b/plugins/newrelic/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-newrelic", "description": "A Backstage plugin that integrates towards New Relic", - "version": "0.3.32", + "version": "0.3.33-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/org-react/CHANGELOG.md b/plugins/org-react/CHANGELOG.md index c01567643b..6400654730 100644 --- a/plugins/org-react/CHANGELOG.md +++ b/plugins/org-react/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-org-react +## 0.1.4-next.1 + +### Patch Changes + +- d950d3e217: Depend on `@material-ui/core` version `^4.12.2` like all other in-repo packages +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.1.4-next.0 ### Patch Changes diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json index 9752cacd32..bf3fbe4050 100644 --- a/plugins/org-react/package.json +++ b/plugins/org-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-org-react", - "version": "0.1.4-next.0", + "version": "0.1.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -36,7 +36,7 @@ "@backstage/core-plugin-api": "workspace:^", "@backstage/plugin-catalog-react": "workspace:^", "@backstage/theme": "workspace:^", - "@material-ui/core": "^4.9.13", + "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "^4.0.0-alpha.57", "react-use": "^17.2.4" diff --git a/plugins/org/CHANGELOG.md b/plugins/org/CHANGELOG.md index 6612957bdb..c4cd46928b 100644 --- a/plugins/org/CHANGELOG.md +++ b/plugins/org/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-org +## 0.6.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.6.5-next.0 ### Patch Changes diff --git a/plugins/org/package.json b/plugins/org/package.json index 8a2364729c..ef9106808b 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-org", "description": "A Backstage plugin that helps you create entity pages for your organization", - "version": "0.6.5-next.0", + "version": "0.6.5-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/pagerduty/CHANGELOG.md b/plugins/pagerduty/CHANGELOG.md index ef3dc0c0ab..c10c36ee38 100644 --- a/plugins/pagerduty/CHANGELOG.md +++ b/plugins/pagerduty/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-pagerduty +## 0.5.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + ## 0.5.8-next.0 ### Patch Changes diff --git a/plugins/pagerduty/package.json b/plugins/pagerduty/package.json index 721ff91a53..a26ac1137f 100644 --- a/plugins/pagerduty/package.json +++ b/plugins/pagerduty/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-pagerduty", "description": "A Backstage plugin that integrates towards PagerDuty", - "version": "0.5.8-next.0", + "version": "0.5.8-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/periskop-backend/CHANGELOG.md b/plugins/periskop-backend/CHANGELOG.md index d7fd30baab..afeec402d4 100644 --- a/plugins/periskop-backend/CHANGELOG.md +++ b/plugins/periskop-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-periskop-backend +## 0.1.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + ## 0.1.13-next.0 ### Patch Changes diff --git a/plugins/periskop-backend/package.json b/plugins/periskop-backend/package.json index cee8af1556..aa6d8daec3 100644 --- a/plugins/periskop-backend/package.json +++ b/plugins/periskop-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-periskop-backend", - "version": "0.1.13-next.0", + "version": "0.1.13-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/periskop/CHANGELOG.md b/plugins/periskop/CHANGELOG.md index 6fa77d51d0..5d093e566f 100644 --- a/plugins/periskop/CHANGELOG.md +++ b/plugins/periskop/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-periskop +## 0.1.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + ## 0.1.13-next.0 ### Patch Changes diff --git a/plugins/periskop/package.json b/plugins/periskop/package.json index 2048df912f..a35c7332b2 100644 --- a/plugins/periskop/package.json +++ b/plugins/periskop/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-periskop", - "version": "0.1.13-next.0", + "version": "0.1.13-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/permission-backend/CHANGELOG.md b/plugins/permission-backend/CHANGELOG.md index 0a5e07716b..475ec1fa67 100644 --- a/plugins/permission-backend/CHANGELOG.md +++ b/plugins/permission-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-permission-backend +## 0.5.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.11-next.1 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-node@0.7.5-next.1 + ## 0.5.17-next.0 ### Patch Changes diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json index 66796cb82c..ef319d2e4b 100644 --- a/plugins/permission-backend/package.json +++ b/plugins/permission-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-backend", - "version": "0.5.17-next.0", + "version": "0.5.17-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/permission-node/CHANGELOG.md b/plugins/permission-node/CHANGELOG.md index 2f97a29a70..2c56e28584 100644 --- a/plugins/permission-node/CHANGELOG.md +++ b/plugins/permission-node/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-permission-node +## 0.7.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.11-next.1 + - @backstage/plugin-permission-common@0.7.3 + ## 0.7.5-next.0 ### Patch Changes diff --git a/plugins/permission-node/package.json b/plugins/permission-node/package.json index cc9d98f8fb..e2de41927f 100644 --- a/plugins/permission-node/package.json +++ b/plugins/permission-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-permission-node", "description": "Common permission and authorization utilities for backend plugins", - "version": "0.7.5-next.0", + "version": "0.7.5-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/playlist-backend/CHANGELOG.md b/plugins/playlist-backend/CHANGELOG.md index 2ad29e5120..ee9c9940b1 100644 --- a/plugins/playlist-backend/CHANGELOG.md +++ b/plugins/playlist-backend/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-playlist-backend +## 0.2.5-next.1 + +### Patch Changes + +- 85b04f659a: Internal refactor to not use deprecated `substr` +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-test-utils@0.1.34-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.11-next.1 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-node@0.7.5-next.1 + - @backstage/plugin-playlist-common@0.1.4 + ## 0.2.5-next.0 ### Patch Changes diff --git a/plugins/playlist-backend/package.json b/plugins/playlist-backend/package.json index 73ef52c5cd..211ef7f3c9 100644 --- a/plugins/playlist-backend/package.json +++ b/plugins/playlist-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-playlist-backend", - "version": "0.2.5-next.0", + "version": "0.2.5-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/playlist-backend/src/service/ListPlaylistsFilter.ts b/plugins/playlist-backend/src/service/ListPlaylistsFilter.ts index a746286136..680f389f8c 100644 --- a/plugins/playlist-backend/src/service/ListPlaylistsFilter.ts +++ b/plugins/playlist-backend/src/service/ListPlaylistsFilter.ts @@ -79,9 +79,9 @@ export function parseListPlaylistsFilterString( const equalsIndex = statement.indexOf('='); const key = - equalsIndex === -1 ? statement : statement.substr(0, equalsIndex).trim(); + equalsIndex === -1 ? statement : statement.slice(0, equalsIndex).trim(); const value = - equalsIndex === -1 ? undefined : statement.substr(equalsIndex + 1).trim(); + equalsIndex === -1 ? undefined : statement.slice(equalsIndex + 1).trim(); if (!key || !value) { throw new InputError( diff --git a/plugins/playlist/CHANGELOG.md b/plugins/playlist/CHANGELOG.md index 9a4c780b1e..8651137680 100644 --- a/plugins/playlist/CHANGELOG.md +++ b/plugins/playlist/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-playlist +## 0.1.6-next.1 + +### Patch Changes + +- d950d3e217: Depend on `@material-ui/core` version `^4.12.2` like all other in-repo packages +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-search-react@1.5.0-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-react@0.4.9 + - @backstage/plugin-playlist-common@0.1.4 + ## 0.1.6-next.0 ### Patch Changes diff --git a/plugins/playlist/package.json b/plugins/playlist/package.json index 2df8e5932d..9954d9b45c 100644 --- a/plugins/playlist/package.json +++ b/plugins/playlist/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-playlist", - "version": "0.1.6-next.0", + "version": "0.1.6-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -38,7 +38,7 @@ "@backstage/plugin-playlist-common": "workspace:^", "@backstage/plugin-search-react": "workspace:^", "@backstage/theme": "workspace:^", - "@material-ui/core": "^4.9.13", + "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "^4.0.0-alpha.57", "lodash": "^4.17.21", diff --git a/plugins/proxy-backend/CHANGELOG.md b/plugins/proxy-backend/CHANGELOG.md index a0452dff3f..1ccb8ba717 100644 --- a/plugins/proxy-backend/CHANGELOG.md +++ b/plugins/proxy-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-proxy-backend +## 0.2.36-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + ## 0.2.36-next.0 ### Patch Changes diff --git a/plugins/proxy-backend/package.json b/plugins/proxy-backend/package.json index de45524f25..d145d91454 100644 --- a/plugins/proxy-backend/package.json +++ b/plugins/proxy-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-proxy-backend", "description": "A Backstage backend plugin that helps you set up proxy endpoints in the backend", - "version": "0.2.36-next.0", + "version": "0.2.36-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/rollbar-backend/CHANGELOG.md b/plugins/rollbar-backend/CHANGELOG.md index a9df1c2eea..0995c42725 100644 --- a/plugins/rollbar-backend/CHANGELOG.md +++ b/plugins/rollbar-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-rollbar-backend +## 0.1.39-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + ## 0.1.39-next.0 ### Patch Changes diff --git a/plugins/rollbar-backend/package.json b/plugins/rollbar-backend/package.json index d481ad0217..8aadcde236 100644 --- a/plugins/rollbar-backend/package.json +++ b/plugins/rollbar-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-rollbar-backend", "description": "A Backstage backend plugin that integrates towards Rollbar", - "version": "0.1.39-next.0", + "version": "0.1.39-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/rollbar/CHANGELOG.md b/plugins/rollbar/CHANGELOG.md index 629fc36e26..8fab9cd0c6 100644 --- a/plugins/rollbar/CHANGELOG.md +++ b/plugins/rollbar/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-rollbar +## 0.4.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.4.15-next.0 ### Patch Changes diff --git a/plugins/rollbar/package.json b/plugins/rollbar/package.json index bea1cab9ee..e33ed45d20 100644 --- a/plugins/rollbar/package.json +++ b/plugins/rollbar/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-rollbar", "description": "A Backstage plugin that integrates towards Rollbar", - "version": "0.4.15-next.0", + "version": "0.4.15-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md index 60628eb84d..2ca4243b25 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-scaffolder-backend-module-cookiecutter +## 0.2.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/plugin-scaffolder-backend@1.11.0-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-node@0.1.0-next.1 + ## 0.2.17-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index f1024a1fa9..6f2868d2f6 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/package.json +++ b/plugins/scaffolder-backend-module-cookiecutter/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-cookiecutter", "description": "A module for the scaffolder backend that lets you template projects using cookiecutter", - "version": "0.2.17-next.0", + "version": "0.2.17-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-rails/CHANGELOG.md b/plugins/scaffolder-backend-module-rails/CHANGELOG.md index b705593493..8fc899ef79 100644 --- a/plugins/scaffolder-backend-module-rails/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-rails/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-scaffolder-backend-module-rails +## 0.4.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/plugin-scaffolder-backend@1.11.0-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-node@0.1.0-next.1 + ## 0.4.10-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index f096eeb379..21e9c1f31c 100644 --- a/plugins/scaffolder-backend-module-rails/package.json +++ b/plugins/scaffolder-backend-module-rails/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-rails", "description": "A module for the scaffolder backend that lets you template projects using Rails", - "version": "0.4.10-next.0", + "version": "0.4.10-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md index 84140cd106..7ad3b35da6 100644 --- a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-sentry +## 0.1.2-next.1 + +### Patch Changes + +- da418c89e4: Fix broken module exports and dependencies to match a backend module, rather than a frontend plugin. +- Updated dependencies + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-scaffolder-node@0.1.0-next.1 + ## 0.1.2-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-sentry/package.json b/plugins/scaffolder-backend-module-sentry/package.json index 9978f0acc7..2136a9055e 100644 --- a/plugins/scaffolder-backend-module-sentry/package.json +++ b/plugins/scaffolder-backend-module-sentry/package.json @@ -1,16 +1,16 @@ { "name": "@backstage/plugin-scaffolder-backend-module-sentry", - "version": "0.1.2-next.0", + "version": "0.1.2-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", "publishConfig": { "access": "public", - "main": "dist/index.esm.js", + "main": "dist/index.cjs.js", "types": "dist/index.d.ts" }, "backstage": { - "role": "frontend-plugin" + "role": "backend-plugin-module" }, "scripts": { "start": "backstage-cli package start", @@ -24,23 +24,10 @@ "dependencies": { "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", - "@backstage/integration": "workspace:^", "@backstage/plugin-scaffolder-node": "workspace:^" }, - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" - }, "devDependencies": { - "@backstage/cli": "workspace:^", - "@backstage/core-app-api": "workspace:^", - "@backstage/dev-utils": "workspace:^", - "@backstage/test-utils": "workspace:^", - "@testing-library/jest-dom": "^5.10.1", - "@testing-library/react": "^12.1.3", - "@testing-library/user-event": "^14.0.0", - "@types/node": "*", - "cross-fetch": "^3.1.5", - "msw": "^0.49.0" + "@backstage/cli": "workspace:^" }, "files": [ "dist" diff --git a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md index ebc657b508..d736daf17e 100644 --- a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-scaffolder-backend-module-yeoman +## 0.2.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-node@0.1.0-next.1 + ## 0.2.15-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-yeoman/package.json b/plugins/scaffolder-backend-module-yeoman/package.json index 993a80c304..eb8598ac8f 100644 --- a/plugins/scaffolder-backend-module-yeoman/package.json +++ b/plugins/scaffolder-backend-module-yeoman/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-yeoman", - "version": "0.2.15-next.0", + "version": "0.2.15-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend/CHANGELOG.md b/plugins/scaffolder-backend/CHANGELOG.md index 9bc5fc1e34..b43edb7c73 100644 --- a/plugins/scaffolder-backend/CHANGELOG.md +++ b/plugins/scaffolder-backend/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-scaffolder-backend +## 1.11.0-next.1 + +### Minor Changes + +- 127154930f: Renamed the export `scaffolderCatalogModule` to `catalogModuleTemplateKind` in order to follow the new recommended naming patterns of backend system items. This is technically a breaking change but in an alpha export, so take care to change your imports if you have already migrated to the new backend system. + +### Patch Changes + +- 66cf22fdc4: Updated dependency `esbuild` to `^0.17.0`. +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.11-next.1 + - @backstage/plugin-catalog-node@1.3.3-next.1 + - @backstage/plugin-scaffolder-common@1.2.5-next.0 + - @backstage/plugin-scaffolder-node@0.1.0-next.1 + ## 1.11.0-next.0 ### Minor Changes diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index ad5edee668..e50ebba1b8 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend", "description": "The Backstage backend plugin that helps you create new things", - "version": "1.11.0-next.0", + "version": "1.11.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -92,7 +92,7 @@ "@types/nunjucks": "^3.1.4", "@types/supertest": "^2.0.8", "@types/zen-observable": "^0.8.0", - "esbuild": "^0.16.0", + "esbuild": "^0.17.0", "jest-when": "^3.1.0", "mock-fs": "^5.1.0", "msw": "^0.49.0", diff --git a/plugins/scaffolder-node/CHANGELOG.md b/plugins/scaffolder-node/CHANGELOG.md index a447f09770..19e00ac8b4 100644 --- a/plugins/scaffolder-node/CHANGELOG.md +++ b/plugins/scaffolder-node/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-node +## 0.1.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-common@1.2.5-next.0 + ## 0.1.0-next.0 ### Minor Changes diff --git a/plugins/scaffolder-node/package.json b/plugins/scaffolder-node/package.json index f67fe89623..dc93306107 100644 --- a/plugins/scaffolder-node/package.json +++ b/plugins/scaffolder-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-node", "description": "The plugin-scaffolder-node module for @backstage/plugin-scaffolder-backend", - "version": "0.1.0-next.0", + "version": "0.1.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-react/CHANGELOG.md b/plugins/scaffolder-react/CHANGELOG.md index c57b102949..384680c672 100644 --- a/plugins/scaffolder-react/CHANGELOG.md +++ b/plugins/scaffolder-react/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-scaffolder-react +## 1.1.0-next.1 + +### Patch Changes + +- 04f717a8e1: `scaffolder/next`: bump `react-jsonschema-form` libraries to `v5-stable` +- 346d6b6630: Upgrade `@rjsf` version 5 dependencies to `beta.18` +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-scaffolder-common@1.2.5-next.0 + ## 1.1.0-next.0 ### Minor Changes diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index dbd64d1f2d..e7acbdce05 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-react", "description": "A frontend library that helps other Backstage plugins interact with the Scaffolder", - "version": "1.1.0-next.0", + "version": "1.1.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -47,11 +47,11 @@ "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.57", "@rjsf/core": "^3.2.1", - "@rjsf/core-v5": "npm:@rjsf/core@5.0.0-beta.18", + "@rjsf/core-v5": "npm:@rjsf/core@5.0.1", "@rjsf/material-ui": "^3.2.1", - "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.0.0-beta.18", - "@rjsf/utils": "5.0.0-beta.18", - "@rjsf/validator-ajv8": "5.0.0-beta.18", + "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.0.1", + "@rjsf/utils": "5.0.1", + "@rjsf/validator-ajv8": "5.0.1", "@types/json-schema": "^7.0.9", "classnames": "^2.2.6", "json-schema": "^0.4.0", diff --git a/plugins/scaffolder-react/src/hooks/useCustomLayouts.ts b/plugins/scaffolder-react/src/hooks/useCustomLayouts.ts index afcc45cd48..461b89f808 100644 --- a/plugins/scaffolder-react/src/hooks/useCustomLayouts.ts +++ b/plugins/scaffolder-react/src/hooks/useCustomLayouts.ts @@ -14,8 +14,8 @@ * limitations under the License. */ import { useElementFilter } from '@backstage/core-plugin-api'; -import { LAYOUTS_KEY, LAYOUTS_WRAPPER_KEY } from '../next/layouts/keys'; -import { type LayoutOptions } from '../next/types'; +import { LAYOUTS_KEY, LAYOUTS_WRAPPER_KEY } from '../layouts/keys'; +import { LayoutOptions } from '../layouts'; /** * Hook that returns all custom field extensions from the current outlet. diff --git a/plugins/scaffolder-react/src/index.ts b/plugins/scaffolder-react/src/index.ts index 41a1298b37..67703e3ed1 100644 --- a/plugins/scaffolder-react/src/index.ts +++ b/plugins/scaffolder-react/src/index.ts @@ -19,6 +19,6 @@ export * from './types'; export * from './secrets'; export * from './api'; export * from './hooks'; +export * from './layouts'; export * from './next'; -export type { FormProps } from './next'; diff --git a/plugins/scaffolder-react/src/next/layouts/index.tsx b/plugins/scaffolder-react/src/layouts/createScaffolderLayout.ts similarity index 76% rename from plugins/scaffolder-react/src/next/layouts/index.tsx rename to plugins/scaffolder-react/src/layouts/createScaffolderLayout.ts index 0b1533c7c8..328f366007 100644 --- a/plugins/scaffolder-react/src/next/layouts/index.tsx +++ b/plugins/scaffolder-react/src/layouts/createScaffolderLayout.ts @@ -1,6 +1,3 @@ -import { LayoutOptions } from '../types'; -import { LAYOUTS_KEY, LAYOUTS_WRAPPER_KEY } from './keys'; - /* * Copyright 2023 The Backstage Authors * @@ -16,7 +13,29 @@ import { LAYOUTS_KEY, LAYOUTS_WRAPPER_KEY } from './keys'; * See the License for the specific language governing permissions and * limitations under the License. */ + +import { LAYOUTS_KEY, LAYOUTS_WRAPPER_KEY } from './keys'; import { attachComponentData, Extension } from '@backstage/core-plugin-api'; +import type { FormProps as SchemaFormProps } from '@rjsf/core-v5'; + +/** + * The field template from `@rjsf/core` which is a react component that gets passed `@rjsf/core` field related props. + * + * @public + */ +export type LayoutTemplate<T = any> = NonNullable< + SchemaFormProps<T>['uiSchema'] +>['ui:ObjectFieldTemplate']; + +/** + * The type of layouts that is passed to the TemplateForms + * + * @public + */ +export interface LayoutOptions<P = any> { + name: string; + component: LayoutTemplate<P>; +} /** * A type used to wrap up the FieldExtension to embed the ReturnValue and the InputProps diff --git a/plugins/scaffolder-react/src/layouts/index.tsx b/plugins/scaffolder-react/src/layouts/index.tsx new file mode 100644 index 0000000000..ab3c30e1cb --- /dev/null +++ b/plugins/scaffolder-react/src/layouts/index.tsx @@ -0,0 +1,25 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { + ScaffolderLayouts, + createScaffolderLayout, +} from './createScaffolderLayout'; +export type { + LayoutComponent, + LayoutTemplate, + LayoutOptions, +} from './createScaffolderLayout'; diff --git a/plugins/scaffolder-react/src/next/layouts/keys.ts b/plugins/scaffolder-react/src/layouts/keys.ts similarity index 100% rename from plugins/scaffolder-react/src/next/layouts/keys.ts rename to plugins/scaffolder-react/src/layouts/keys.ts diff --git a/plugins/scaffolder-react/src/next/components/Stepper/Stepper.test.tsx b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.test.tsx index 5995d0e419..0b17c550a0 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/Stepper.test.tsx +++ b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.test.tsx @@ -21,7 +21,7 @@ import { act, fireEvent } from '@testing-library/react'; import type { RJSFValidationError } from '@rjsf/utils'; import { JsonValue } from '@backstage/types'; import { NextFieldExtensionComponentProps } from '../../extensions'; -import { LayoutTemplate } from '../../types'; +import { LayoutTemplate } from '../../../layouts'; describe('Stepper', () => { it('should render the step titles for each step of the manifest', async () => { diff --git a/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx index 096173deb7..c97d31c487 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx +++ b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx @@ -32,7 +32,8 @@ import { ReviewState, type ReviewStateProps } from '../ReviewState'; import { useTemplateSchema } from '../../hooks/useTemplateSchema'; import validator from '@rjsf/validator-ajv8'; import { useFormDataFromQuery } from '../../hooks'; -import type { FormProps, LayoutOptions } from '../../types'; +import { FormProps } from '../../types'; +import { LayoutOptions } from '../../../layouts'; import { useTransformSchemaToProps } from '../../hooks/useTransformSchemaToProps'; const useStyles = makeStyles(theme => ({ diff --git a/plugins/scaffolder-react/src/next/hooks/useTransformSchemaToProps.ts b/plugins/scaffolder-react/src/next/hooks/useTransformSchemaToProps.ts index ffae1df8bf..881c4f90c5 100644 --- a/plugins/scaffolder-react/src/next/hooks/useTransformSchemaToProps.ts +++ b/plugins/scaffolder-react/src/next/hooks/useTransformSchemaToProps.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { type ParsedTemplateSchema } from './useTemplateSchema'; -import { type LayoutOptions } from '../types'; +import { type LayoutOptions } from '../../layouts'; interface Options { layouts?: LayoutOptions[]; diff --git a/plugins/scaffolder-react/src/next/index.ts b/plugins/scaffolder-react/src/next/index.ts index 4674c1f70a..a18649f506 100644 --- a/plugins/scaffolder-react/src/next/index.ts +++ b/plugins/scaffolder-react/src/next/index.ts @@ -15,8 +15,6 @@ */ export * from './components'; export * from './extensions'; -export * from './layouts'; export * from './types'; export * from './lib'; export * from './hooks'; -export * from './layouts'; diff --git a/plugins/scaffolder-react/src/next/types.ts b/plugins/scaffolder-react/src/next/types.ts index 40ba511dbe..54a64a5323 100644 --- a/plugins/scaffolder-react/src/next/types.ts +++ b/plugins/scaffolder-react/src/next/types.ts @@ -13,7 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import type { FormProps as SchemaFormProps } from '@rjsf/core-v5'; + +// TODO(Rugvip): The FormProps type is actually supposed to be alpha, but since we want to +// refer to it from @backstage/plugin-scaffolder, it needs to be public for now. +// Once we support internal alpha re-exports this should be switched to an alpha export. + /** * Any `@rjsf/core` form properties that are publicly exposed to the `NextScaffolderpage` * @@ -23,22 +29,3 @@ export type FormProps = Pick< SchemaFormProps, 'transformErrors' | 'noHtml5Validate' >; - -/** - * The field template from `@rjsf/core` which is a react component that gets passed `@rjsf/core` field related props. - * - * @public - */ -export type LayoutTemplate<T = any> = NonNullable< - SchemaFormProps<T>['uiSchema'] ->['ui:ObjectFieldTemplate']; - -/** - * The type of layouts that is passed to the TemplateForms - * - * @public - */ -export interface LayoutOptions<P = any> { - name: string; - component: LayoutTemplate<P>; -} diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md index d343d4e224..9fc78b0416 100644 --- a/plugins/scaffolder/CHANGELOG.md +++ b/plugins/scaffolder/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-scaffolder +## 1.11.0-next.1 + +### Patch Changes + +- 04f717a8e1: `scaffolder/next`: bump `react-jsonschema-form` libraries to `v5-stable` +- 346d6b6630: Upgrade `@rjsf` version 5 dependencies to `beta.18` +- 0f0da2f256: Prefer schema ordering of template properties during review content generation. +- 38992bdbaf: Fixed bug in review step refactor that caused schema-based display settings for individual property values to be discarded. +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.1.0-next.1 + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/integration-react@1.1.10-next.0 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-permission-react@0.4.9 + - @backstage/plugin-scaffolder-common@1.2.5-next.0 + ## 1.11.0-next.0 ### Minor Changes diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index 1967349922..1b0beb09d9 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder", "description": "The Backstage plugin that helps you create new things", - "version": "1.11.0-next.0", + "version": "1.11.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -57,7 +57,7 @@ "@react-hookz/web": "^20.0.0", "@rjsf/core": "^3.2.1", "@rjsf/material-ui": "^3.2.1", - "@rjsf/utils": "5.0.0-beta.18", + "@rjsf/utils": "5.0.1", "@uiw/react-codemirror": "^4.9.3", "classnames": "^2.2.6", "git-url-parse": "^13.0.0", diff --git a/plugins/scaffolder/src/components/MultistepJsonForm/ReviewStep.tsx b/plugins/scaffolder/src/components/MultistepJsonForm/ReviewStep.tsx index d78d726869..112b96bdf1 100644 --- a/plugins/scaffolder/src/components/MultistepJsonForm/ReviewStep.tsx +++ b/plugins/scaffolder/src/components/MultistepJsonForm/ReviewStep.tsx @@ -25,36 +25,38 @@ export function getReviewData( uiSchemas: UiSchema[], ) { const reviewData: Record<string, any> = {}; - for (const key in formData) { - if (formData.hasOwnProperty(key)) { - const uiSchema = uiSchemas.find(us => us.name === key); + const orderedReviewProperties = new Set( + uiSchemas.map(us => us.name).concat(Object.getOwnPropertyNames(formData)), + ); - if (!uiSchema) { - reviewData[key] = formData[key]; - continue; - } + for (const key of orderedReviewProperties) { + const uiSchema = uiSchemas.find(us => us.name === key); - if (uiSchema['ui:widget'] === 'password') { - reviewData[key] = '******'; - continue; - } - - if (!uiSchema['ui:backstage'] || !uiSchema['ui:backstage'].review) { - reviewData[key] = formData[key]; - continue; - } - - const review = uiSchema['ui:backstage'].review as JsonObject; - if (review.mask) { - reviewData[key] = review.mask; - continue; - } - - if (!review.show) { - continue; - } + if (!uiSchema) { reviewData[key] = formData[key]; + continue; } + + if (uiSchema['ui:widget'] === 'password') { + reviewData[key] = '******'; + continue; + } + + if (!uiSchema['ui:backstage'] || !uiSchema['ui:backstage'].review) { + reviewData[key] = formData[key]; + continue; + } + + const review = uiSchema['ui:backstage'].review as JsonObject; + if (review.mask) { + reviewData[key] = review.mask; + continue; + } + + if (!review.show) { + continue; + } + reviewData[key] = formData[key]; } return reviewData; @@ -98,7 +100,12 @@ export const ReviewStep = (props: ReviewStepProps) => { <Typography variant="h6">Review and create</Typography> <StructuredMetadataTable dense - metadata={getReviewData(formData, getUiSchemasFromSteps(steps))} + metadata={getReviewData( + formData, + getUiSchemasFromSteps( + steps.map(({ mergedSchema }) => ({ schema: mergedSchema })), + ), + )} /> <Box mb={4} /> <Button onClick={handleBack} disabled={disableButtons}> diff --git a/plugins/search-backend-module-elasticsearch/CHANGELOG.md b/plugins/search-backend-module-elasticsearch/CHANGELOG.md index 5b3f82a37b..dddb776afc 100644 --- a/plugins/search-backend-module-elasticsearch/CHANGELOG.md +++ b/plugins/search-backend-module-elasticsearch/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-search-backend-module-elasticsearch +## 1.1.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6 + - @backstage/plugin-search-backend-node@1.1.3-next.1 + - @backstage/plugin-search-common@1.2.1 + ## 1.1.3-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-elasticsearch/package.json b/plugins/search-backend-module-elasticsearch/package.json index 856f9b5e55..05395fbdb2 100644 --- a/plugins/search-backend-module-elasticsearch/package.json +++ b/plugins/search-backend-module-elasticsearch/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-elasticsearch", "description": "A module for the search backend that implements search using ElasticSearch", - "version": "1.1.3-next.0", + "version": "1.1.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-pg/CHANGELOG.md b/plugins/search-backend-module-pg/CHANGELOG.md index 09082b4cd3..907235f958 100644 --- a/plugins/search-backend-module-pg/CHANGELOG.md +++ b/plugins/search-backend-module-pg/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-search-backend-module-pg +## 0.5.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/plugin-search-backend-node@1.1.3-next.1 + - @backstage/plugin-search-common@1.2.1 + ## 0.5.3-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-pg/package.json b/plugins/search-backend-module-pg/package.json index 832a5528f9..299c66a0bd 100644 --- a/plugins/search-backend-module-pg/package.json +++ b/plugins/search-backend-module-pg/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-pg", "description": "A module for the search backend that implements search using PostgreSQL", - "version": "0.5.3-next.0", + "version": "0.5.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-pg/src/database/util.test.ts b/plugins/search-backend-module-pg/src/database/util.test.ts index 09eb70c096..b3df5a3ad4 100644 --- a/plugins/search-backend-module-pg/src/database/util.test.ts +++ b/plugins/search-backend-module-pg/src/database/util.test.ts @@ -50,7 +50,7 @@ describe('util', () => { 'should get postgres major version, %p', async databaseId => { const knex = await databases.init(databaseId); - const expectedVersion = +databaseId.substr(9); + const expectedVersion = +databaseId.slice(9); await expect(queryPostgresMajorVersion(knex)).resolves.toBe( expectedVersion, diff --git a/plugins/search-backend-node/CHANGELOG.md b/plugins/search-backend-node/CHANGELOG.md index 57ec19a2c4..9a5b76131d 100644 --- a/plugins/search-backend-node/CHANGELOG.md +++ b/plugins/search-backend-node/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-search-backend-node +## 1.1.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-search-common@1.2.1 + ## 1.1.3-next.0 ### Patch Changes diff --git a/plugins/search-backend-node/package.json b/plugins/search-backend-node/package.json index 18496a1c39..9c4f3842ed 100644 --- a/plugins/search-backend-node/package.json +++ b/plugins/search-backend-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-node", "description": "A library for Backstage backend plugins that want to interact with the search backend plugin", - "version": "1.1.3-next.0", + "version": "1.1.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend/CHANGELOG.md b/plugins/search-backend/CHANGELOG.md index 0dcdec3ed5..33fa09cb39 100644 --- a/plugins/search-backend/CHANGELOG.md +++ b/plugins/search-backend/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-search-backend +## 1.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.11-next.1 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-node@0.7.5-next.1 + - @backstage/plugin-search-backend-node@1.1.3-next.1 + - @backstage/plugin-search-common@1.2.1 + ## 1.2.3-next.0 ### Patch Changes diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index 72cfadf821..cc903a5b8d 100644 --- a/plugins/search-backend/package.json +++ b/plugins/search-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend", "description": "The Backstage backend plugin that provides your backstage app with search", - "version": "1.2.3-next.0", + "version": "1.2.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-react/CHANGELOG.md b/plugins/search-react/CHANGELOG.md index 37214bdb82..f5074bee18 100644 --- a/plugins/search-react/CHANGELOG.md +++ b/plugins/search-react/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-search-react +## 1.5.0-next.0 + +### Minor Changes + +- 0eaa579f89: - Create the search results extensions, for more details see the documentation [here](https://backstage.io/docs/features/search/how-to-guides#how-to-render-search-results-using-extensions); + - Update the `SearchResult`, `SearchResultList` and `SearchResultGroup` components to use extensions and default their props to optionally accept a query, when the query is not passed, the component tries to get it from the search context. + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-search-common@1.2.1 + ## 1.4.0 ### Minor Changes diff --git a/plugins/search-react/api-report.md b/plugins/search-react/api-report.md index 3d1e4091ea..ccf7a72e33 100644 --- a/plugins/search-react/api-report.md +++ b/plugins/search-react/api-report.md @@ -8,6 +8,7 @@ import { ApiRef } from '@backstage/core-plugin-api'; import { AsyncState } from 'react-use/lib/useAsync'; import { AutocompleteProps } from '@material-ui/lab'; +import { Extension } from '@backstage/core-plugin-api'; import { ForwardRefExoticComponent } from 'react'; import { InputBaseProps } from '@material-ui/core'; import { JsonObject } from '@backstage/types'; @@ -34,6 +35,13 @@ export const AutocompleteFilter: ( // @public (undocumented) export const CheckboxFilter: (props: SearchFilterComponentProps) => JSX.Element; +// @public +export const createSearchResultListItemExtension: < + Component extends (props: any) => JSX.Element | null, +>( + options: SearchResultListItemExtensionOptions<Component>, +) => Extension<Component>; + // @public (undocumented) export const DefaultResultListItem: ( props: DefaultResultListItemProps, @@ -43,7 +51,7 @@ export const DefaultResultListItem: ( export type DefaultResultListItemProps = { icon?: ReactNode; secondaryAction?: ReactNode; - result: SearchDocument; + result?: SearchDocument; highlight?: ResultHighlight; rank?: number; lineClamp?: number; @@ -280,7 +288,10 @@ export const SearchResultContext: ( // @public export type SearchResultContextProps = { - children: (state: AsyncState<SearchResultSet>) => JSX.Element | null; + children: ( + state: AsyncState<SearchResultSet>, + query: Partial<SearchQuery>, + ) => JSX.Element | null; }; // @public @@ -313,6 +324,8 @@ export function SearchResultGroupLayout<FilterOption>( // @public export type SearchResultGroupLayoutProps<FilterOption> = ListProps & { + error?: Error; + loading?: boolean; icon: JSX.Element; title: ReactNode; titleProps?: Partial<TypographyProps>; @@ -332,19 +345,19 @@ export type SearchResultGroupLayoutProps<FilterOption> = ListProps & { index: number, array: SearchResult_2[], ) => JSX.Element | null; - error?: Error; - loading?: boolean; noResultsComponent?: ReactNode; + disableRenderingWithNoResults?: boolean; }; // @public -export type SearchResultGroupProps<FilterOption> = Omit< - SearchResultGroupLayoutProps<FilterOption>, - 'loading' | 'error' | 'resultItems' | 'filterFields' -> & { - query: Partial<SearchQuery>; - disableRenderingWithNoResults?: boolean; -}; +export type SearchResultGroupProps<FilterOption> = Pick< + SearchResultStateProps, + 'query' +> & + Omit< + SearchResultGroupLayoutProps<FilterOption>, + 'loading' | 'error' | 'resultItems' | 'filterFields' + >; // @public export const SearchResultGroupSelectFilterField: ( @@ -369,6 +382,25 @@ export type SearchResultGroupTextFilterFieldProps = // @public export const SearchResultList: (props: SearchResultListProps) => JSX.Element; +// @public +export type SearchResultListItemExtensionOptions< + Component extends (props: any) => JSX.Element | null, +> = { + name: string; + component: () => Promise<Component>; + predicate?: (result: SearchResult_2) => boolean; +}; + +// @public +export const SearchResultListItemExtensions: ( + props: SearchResultListItemExtensionsProps, +) => JSX.Element; + +// @public +export type SearchResultListItemExtensionsProps = Omit<ListProps, 'results'> & { + results: SearchResult_2[]; +}; + // @public export const SearchResultListLayout: ( props: SearchResultListLayoutProps, @@ -376,34 +408,31 @@ export const SearchResultListLayout: ( // @public export type SearchResultListLayoutProps = ListProps & { + error?: Error; + loading?: boolean; resultItems?: SearchResult_2[]; renderResultItem?: ( value: SearchResult_2, index: number, array: SearchResult_2[], ) => JSX.Element | null; - error?: Error; - loading?: boolean; noResultsComponent?: ReactNode; + disableRenderingWithNoResults?: boolean; }; // @public -export type SearchResultListProps = Omit< - SearchResultListLayoutProps, - 'loading' | 'error' | 'resultItems' -> & { - query: Partial<SearchQuery>; - disableRenderingWithNoResults?: boolean; -}; +export type SearchResultListProps = Pick<SearchResultStateProps, 'query'> & + Omit<SearchResultListLayoutProps, 'loading' | 'error' | 'resultItems'>; // @public (undocumented) export const SearchResultPager: () => JSX.Element; // @public -export type SearchResultProps = Pick<SearchResultStateProps, 'query'> & { - children: (resultSet: SearchResultSet) => JSX.Element; - noResultsComponent?: JSX.Element; -}; +export type SearchResultProps = Pick<SearchResultStateProps, 'query'> & + Omit<SearchResultListItemExtensionsProps, 'results' | 'children'> & { + children?: ReactNode | ((resultSet: SearchResultSet) => JSX.Element); + noResultsComponent?: JSX.Element; + }; // @public export const SearchResultState: (props: SearchResultStateProps) => JSX.Element; @@ -420,4 +449,9 @@ export const useSearch: () => SearchContextValue; // @public export const useSearchContextCheck: () => boolean; + +// @public +export const useSearchResultListItemExtensions: ( + children: ReactNode, +) => (result: SearchResult_2, key?: number) => JSX.Element; ``` diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json index e69ec2e7ae..4e9dd292ba 100644 --- a/plugins/search-react/package.json +++ b/plugins/search-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-react", - "version": "1.4.0", + "version": "1.5.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-react/src/components/DefaultResultListItem/DefaultResultListItem.tsx b/plugins/search-react/src/components/DefaultResultListItem/DefaultResultListItem.tsx index 6158aed008..6ea5e4d1a2 100644 --- a/plugins/search-react/src/components/DefaultResultListItem/DefaultResultListItem.tsx +++ b/plugins/search-react/src/components/DefaultResultListItem/DefaultResultListItem.tsx @@ -15,7 +15,7 @@ */ import React, { ReactNode } from 'react'; -import { AnalyticsContext, useAnalytics } from '@backstage/core-plugin-api'; +import { AnalyticsContext } from '@backstage/core-plugin-api'; import { ResultHighlight, SearchDocument, @@ -39,7 +39,7 @@ import { Link } from '@backstage/core-components'; export type DefaultResultListItemProps = { icon?: ReactNode; secondaryAction?: ReactNode; - result: SearchDocument; + result?: SearchDocument; highlight?: ResultHighlight; rank?: number; lineClamp?: number; @@ -53,18 +53,11 @@ export type DefaultResultListItemProps = { export const DefaultResultListItemComponent = ({ result, highlight, - rank, icon, secondaryAction, lineClamp = 5, }: DefaultResultListItemProps) => { - const analytics = useAnalytics(); - const handleClick = () => { - analytics.captureEvent('discover', result.title, { - attributes: { to: result.location }, - value: rank, - }); - }; + if (!result) return null; return ( <> @@ -73,7 +66,7 @@ export const DefaultResultListItemComponent = ({ <ListItemText primaryTypographyProps={{ variant: 'h6' }} primary={ - <Link noTrack to={result.location} onClick={handleClick}> + <Link noTrack to={result.location}> {highlight?.fields.title ? ( <HighlightedSearchResultText text={highlight?.fields.title || ''} diff --git a/plugins/search-react/src/components/SearchResult/SearchResult.stories.tsx b/plugins/search-react/src/components/SearchResult/SearchResult.stories.tsx index ef9b0d6b5c..f3086fc40a 100644 --- a/plugins/search-react/src/components/SearchResult/SearchResult.stories.tsx +++ b/plugins/search-react/src/components/SearchResult/SearchResult.stories.tsx @@ -15,24 +15,25 @@ */ import React, { ComponentType } from 'react'; -import { MemoryRouter } from 'react-router-dom'; import { List, ListItem } from '@material-ui/core'; import DefaultIcon from '@material-ui/icons/InsertDriveFile'; import CustomIcon from '@material-ui/icons/NoteAdd'; import { Link } from '@backstage/core-components'; -import { TestApiProvider } from '@backstage/test-utils'; +import { TestApiProvider, wrapInTestApp } from '@backstage/test-utils'; +import { createPlugin } from '@backstage/core-plugin-api'; import { SearchDocument } from '@backstage/plugin-search-common'; -import { searchApiRef, MockSearchApi } from '../../api'; import { SearchContextProvider } from '../../context'; +import { searchApiRef, MockSearchApi } from '../../api'; +import { createSearchResultListItemExtension } from '../../extensions'; -import { DefaultResultListItem } from '../DefaultResultListItem'; import { SearchResultListLayout } from '../SearchResultList'; +import { SearchResultGroupLayout } from '../SearchResultGroup'; +import { DefaultResultListItem } from '../DefaultResultListItem'; import { SearchResult } from './SearchResult'; -import { SearchResultGroupLayout } from '../SearchResultGroup'; const mockResults = { results: [ @@ -69,15 +70,14 @@ export default { title: 'Plugins/Search/SearchResult', component: SearchResult, decorators: [ - (Story: ComponentType<{}>) => ( - <MemoryRouter> + (Story: ComponentType<{}>) => + wrapInTestApp( <TestApiProvider apis={[[searchApiRef, searchApiMock]]}> <SearchContextProvider> <Story /> </SearchContextProvider> - </TestApiProvider> - </MemoryRouter> - ), + </TestApiProvider>, + ), ], }; @@ -247,3 +247,18 @@ export const WithCustomNoResultsComponent = () => { </SearchResult> ); }; + +export const UsingSearchResultItemExtensions = () => { + const plugin = createPlugin({ id: 'plugin' }); + const DefaultResultItem = plugin.provide( + createSearchResultListItemExtension({ + name: 'DefaultResultListItem', + component: async () => DefaultResultListItem, + }), + ); + return ( + <SearchResult> + <DefaultResultItem /> + </SearchResult> + ); +}; diff --git a/plugins/search-react/src/components/SearchResult/SearchResult.test.tsx b/plugins/search-react/src/components/SearchResult/SearchResult.test.tsx index 5972eaa891..6a5a683295 100644 --- a/plugins/search-react/src/components/SearchResult/SearchResult.test.tsx +++ b/plugins/search-react/src/components/SearchResult/SearchResult.test.tsx @@ -17,9 +17,19 @@ import React from 'react'; import { waitFor } from '@testing-library/react'; -import { renderInTestApp } from '@backstage/test-utils'; +import { ListItem } from '@material-ui/core'; +import { + wrapInTestApp, + renderInTestApp, + renderWithEffects, + TestApiProvider, +} from '@backstage/test-utils'; +import { createPlugin } from '@backstage/core-plugin-api'; +import { searchApiRef } from '../../api'; import { useSearch } from '../../context'; +import { createSearchResultListItemExtension } from '../../extensions'; + import { SearchResult } from './SearchResult'; jest.mock('../../context', () => ({ @@ -30,8 +40,12 @@ jest.mock('../../context', () => ({ })); describe('SearchResult', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + it('Progress rendered on Loading state', async () => { - (useSearch as jest.Mock).mockReturnValueOnce({ + (useSearch as jest.Mock).mockReturnValue({ result: { loading: true }, }); @@ -46,7 +60,7 @@ describe('SearchResult', () => { it('Alert rendered on Error state', async () => { const error = new Error('some error'); - (useSearch as jest.Mock).mockReturnValueOnce({ + (useSearch as jest.Mock).mockReturnValue({ result: { loading: false, error }, }); @@ -62,7 +76,7 @@ describe('SearchResult', () => { }); it('On no result value state', async () => { - (useSearch as jest.Mock).mockReturnValueOnce({ + (useSearch as jest.Mock).mockReturnValue({ result: { loading: false, error: '', value: undefined }, }); @@ -78,7 +92,7 @@ describe('SearchResult', () => { }); it('On empty result value state', async () => { - (useSearch as jest.Mock).mockReturnValueOnce({ + (useSearch as jest.Mock).mockReturnValue({ result: { loading: false, error: '', value: { results: [] } }, }); @@ -94,7 +108,7 @@ describe('SearchResult', () => { }); it('On empty result value state with custom component', async () => { - (useSearch as jest.Mock).mockReturnValueOnce({ + (useSearch as jest.Mock).mockReturnValue({ result: { loading: false, error: '', value: { results: [] } }, }); @@ -110,7 +124,7 @@ describe('SearchResult', () => { }); it('Calls children with results set to result.value', async () => { - (useSearch as jest.Mock).mockReturnValueOnce({ + (useSearch as jest.Mock).mockReturnValue({ result: { loading: false, error: '', @@ -140,4 +154,82 @@ describe('SearchResult', () => { expect(getByText('Results 1')).toBeInTheDocument(); }); + + it('Renders results from api', async () => { + const results = [ + { + type: 'some-type', + document: { + title: 'some-title', + text: 'some-text', + location: 'some-location', + }, + }, + ]; + const query = jest.fn().mockResolvedValue({ results }); + await renderWithEffects( + wrapInTestApp( + <TestApiProvider apis={[[searchApiRef, { query }]]}> + <SearchResult query={{ types: ['techdocs'] }}> + {value => { + expect(value.results).toStrictEqual(results); + return <></>; + }} + </SearchResult> + </TestApiProvider>, + ), + ); + + expect(query).toHaveBeenCalledWith({ + term: '', + filters: {}, + types: ['techdocs'], + }); + }); + + it('Renders using search result item extensions', async () => { + (useSearch as jest.Mock).mockReturnValue({ + result: { + loading: false, + error: '', + value: { + totalCount: 1, + results: [ + { + type: 'some-type', + document: { + title: 'some-title', + text: 'some-text', + location: 'some-location', + }, + }, + ], + }, + }, + }); + + const { getByText, rerender } = await renderInTestApp(<SearchResult />); + + expect(getByText('some-title')).toBeInTheDocument(); + + const SearchResultExtension = createPlugin({ + id: 'plugin', + }).provide( + createSearchResultListItemExtension({ + name: 'SearchResultExtension', + component: async () => props => + <ListItem>Result: {props.result?.title}</ListItem>, + }), + ); + + rerender( + <SearchResult> + <SearchResultExtension /> + </SearchResult>, + ); + + await waitFor(() => { + expect(getByText('Result: some-title')).toBeInTheDocument(); + }); + }); }); diff --git a/plugins/search-react/src/components/SearchResult/SearchResult.tsx b/plugins/search-react/src/components/SearchResult/SearchResult.tsx index 333156aab9..f362ff27d3 100644 --- a/plugins/search-react/src/components/SearchResult/SearchResult.tsx +++ b/plugins/search-react/src/components/SearchResult/SearchResult.tsx @@ -14,19 +14,24 @@ * limitations under the License. */ -import React from 'react'; +import React, { ReactNode } from 'react'; import useAsync, { AsyncState } from 'react-use/lib/useAsync'; +import { isFunction } from 'lodash'; import { - EmptyState, Progress, + EmptyState, ResponseErrorPanel, } from '@backstage/core-components'; -import { AnalyticsContext, useApi } from '@backstage/core-plugin-api'; +import { useApi, AnalyticsContext } from '@backstage/core-plugin-api'; import { SearchQuery, SearchResultSet } from '@backstage/plugin-search-common'; -import { useSearch } from '../../context'; import { searchApiRef } from '../../api'; +import { useSearch } from '../../context'; +import { + SearchResultListItemExtensions, + SearchResultListItemExtensionsProps, +} from '../../extensions'; /** * Props for {@link SearchResultContext} @@ -36,7 +41,10 @@ export type SearchResultContextProps = { /** * A child function that receives an asynchronous result set and returns a react element. */ - children: (state: AsyncState<SearchResultSet>) => JSX.Element | null; + children: ( + state: AsyncState<SearchResultSet>, + query: Partial<SearchQuery>, + ) => JSX.Element | null; }; /** @@ -62,8 +70,8 @@ export type SearchResultContextProps = { export const SearchResultContext = (props: SearchResultContextProps) => { const { children } = props; const context = useSearch(); - const state = context.result; - return children(state); + const { result: state, ...query } = context; + return children(state, query); }; /** @@ -103,7 +111,7 @@ export const SearchResultApi = (props: SearchResultApiProps) => { return searchApi.query({ ...rest, term, types, filters }); }, [query]); - return children(state); + return children(state, query); }; /** @@ -165,10 +173,11 @@ export const SearchResultState = (props: SearchResultStateProps) => { * Props for {@link SearchResult} * @public */ -export type SearchResultProps = Pick<SearchResultStateProps, 'query'> & { - children: (resultSet: SearchResultSet) => JSX.Element; - noResultsComponent?: JSX.Element; -}; +export type SearchResultProps = Pick<SearchResultStateProps, 'query'> & + Omit<SearchResultListItemExtensionsProps, 'results' | 'children'> & { + children?: ReactNode | ((resultSet: SearchResultSet) => JSX.Element); + noResultsComponent?: JSX.Element; + }; /** * Renders results from a parent search context or api. @@ -183,6 +192,7 @@ export const SearchResultComponent = (props: SearchResultProps) => { noResultsComponent = ( <EmptyState missing="data" title="Sorry, no results were found" /> ), + ...rest } = props; return ( @@ -205,7 +215,15 @@ export const SearchResultComponent = (props: SearchResultProps) => { return noResultsComponent; } - return children(value); + if (isFunction(children)) { + return children(value); + } + + return ( + <SearchResultListItemExtensions {...rest} results={value.results}> + {children} + </SearchResultListItemExtensions> + ); }} </SearchResultState> ); diff --git a/plugins/search-react/src/components/SearchResult/index.tsx b/plugins/search-react/src/components/SearchResult/index.tsx index eab599883b..cf36b7ec9e 100644 --- a/plugins/search-react/src/components/SearchResult/index.tsx +++ b/plugins/search-react/src/components/SearchResult/index.tsx @@ -18,8 +18,8 @@ export { SearchResult, SearchResultApi, SearchResultContext, - SearchResultState, SearchResultComponent, + SearchResultState, } from './SearchResult'; export type { diff --git a/plugins/search-react/src/components/SearchResultGroup/SearchResultGroup.stories.tsx b/plugins/search-react/src/components/SearchResultGroup/SearchResultGroup.stories.tsx index fab807dd84..40f7d30ff4 100644 --- a/plugins/search-react/src/components/SearchResultGroup/SearchResultGroup.stories.tsx +++ b/plugins/search-react/src/components/SearchResultGroup/SearchResultGroup.stories.tsx @@ -27,11 +27,15 @@ import DocsIcon from '@material-ui/icons/InsertDriveFile'; import { JsonValue } from '@backstage/types'; import { Link } from '@backstage/core-components'; -import { createRouteRef } from '@backstage/core-plugin-api'; -import { SearchQuery, SearchResultSet } from '@backstage/plugin-search-common'; import { TestApiProvider, wrapInTestApp } from '@backstage/test-utils'; +import { createPlugin, createRouteRef } from '@backstage/core-plugin-api'; +import { SearchQuery, SearchResultSet } from '@backstage/plugin-search-common'; +import { DefaultResultListItem } from '../DefaultResultListItem'; + +import { SearchContextProvider } from '../../context'; import { searchApiRef, MockSearchApi } from '../../api'; +import { createSearchResultListItemExtension } from '../../extensions'; import { SearchResultGroup, @@ -83,6 +87,14 @@ export default { }; export const Default = () => { + return ( + <SearchContextProvider> + <SearchResultGroup icon={<DocsIcon />} title="Documentation" /> + </SearchContextProvider> + ); +}; + +export const WithQuery = () => { const [query] = useState<Partial<SearchQuery>>({ types: ['techdocs'], }); @@ -341,3 +353,21 @@ export const WithCustomResultItem = () => { /> ); }; + +export const WithResultItemExtensions = () => { + const [query] = useState<Partial<SearchQuery>>({ + types: ['techdocs'], + }); + const plugin = createPlugin({ id: 'plugin' }); + const DefaultSearchResultGroupItem = plugin.provide( + createSearchResultListItemExtension({ + name: 'DefaultResultListItem', + component: async () => DefaultResultListItem, + }), + ); + return ( + <SearchResultGroup query={query} icon={<DocsIcon />} title="Documentation"> + <DefaultSearchResultGroupItem /> + </SearchResultGroup> + ); +}; diff --git a/plugins/search-react/src/components/SearchResultGroup/SearchResultGroup.test.tsx b/plugins/search-react/src/components/SearchResultGroup/SearchResultGroup.test.tsx index 7943dba3f7..728bd9113a 100644 --- a/plugins/search-react/src/components/SearchResultGroup/SearchResultGroup.test.tsx +++ b/plugins/search-react/src/components/SearchResultGroup/SearchResultGroup.test.tsx @@ -18,16 +18,21 @@ import React from 'react'; import { screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { MenuItem } from '@material-ui/core'; +import { ListItem, MenuItem } from '@material-ui/core'; import DocsIcon from '@material-ui/icons/InsertDriveFile'; import { - TestApiProvider, - renderWithEffects, wrapInTestApp, + renderWithEffects, + TestApiProvider, + MockAnalyticsApi, } from '@backstage/test-utils'; +import { createPlugin, analyticsApiRef } from '@backstage/core-plugin-api'; import { searchApiRef } from '../../api'; +import { SearchContextProvider } from '../../context'; +import { createSearchResultListItemExtension } from '../../extensions'; + import { SearchResultGroup, SearchResultGroupSelectFilterField, @@ -36,6 +41,7 @@ import { const query = jest.fn().mockResolvedValue({ results: [] }); const searchApiMock = { query }; +const analyticsApiMock = new MockAnalyticsApi(); describe('SearchResultGroup', () => { const results = [ @@ -62,9 +68,18 @@ describe('SearchResultGroup', () => { }); it('Renders without exploding', async () => { + query.mockResolvedValueOnce({ + results, + }); + await renderWithEffects( wrapInTestApp( - <TestApiProvider apis={[[searchApiRef, searchApiMock]]}> + <TestApiProvider + apis={[ + [searchApiRef, searchApiMock], + [analyticsApiRef, analyticsApiMock], + ]} + > <SearchResultGroup query={{ types: ['techdocs'] }} icon={<DocsIcon titleAccess="Docs icon" />} @@ -84,10 +99,94 @@ describe('SearchResultGroup', () => { }); }); - it('Defines a default link', async () => { + it('Renders search results from context', async () => { + query.mockResolvedValueOnce({ + results, + }); + await renderWithEffects( wrapInTestApp( - <TestApiProvider apis={[[searchApiRef, searchApiMock]]}> + <TestApiProvider + apis={[ + [searchApiRef, searchApiMock], + [analyticsApiRef, analyticsApiMock], + ]} + > + <SearchContextProvider> + <SearchResultGroup + icon={<DocsIcon titleAccess="Docs icon" />} + title="Documentation" + /> + </SearchContextProvider> + </TestApiProvider>, + ), + ); + + expect(screen.getByText('Search Result 1')).toBeInTheDocument(); + expect( + screen.getByText('Some text from the search result 1'), + ).toBeInTheDocument(); + + expect(screen.getByText('Search Result 2')).toBeInTheDocument(); + expect( + screen.getByText('Some text from the search result 2'), + ).toBeInTheDocument(); + }); + + it('Renders search results using extensions', async () => { + query.mockResolvedValueOnce({ + results, + }); + + const SearchResultGroupItemExtension = createPlugin({ + id: 'plugin', + }).provide( + createSearchResultListItemExtension({ + name: 'SearchResultGroupItemExtension', + component: async () => props => + <ListItem>Result: {props.result?.title}</ListItem>, + }), + ); + + await renderWithEffects( + wrapInTestApp( + <TestApiProvider + apis={[ + [searchApiRef, searchApiMock], + [analyticsApiRef, analyticsApiMock], + ]} + > + <SearchResultGroup + query={{ types: ['techdocs'] }} + icon={<DocsIcon titleAccess="Docs icon" />} + title="Documentation" + > + <SearchResultGroupItemExtension /> + </SearchResultGroup> + </TestApiProvider>, + ), + ); + + await waitFor(() => { + expect(screen.getByText('Result: Search Result 1')).toBeInTheDocument(); + }); + + expect(screen.getByText('Result: Search Result 2')).toBeInTheDocument(); + }); + + it('Defines a default link', async () => { + query.mockResolvedValueOnce({ + results, + }); + + await renderWithEffects( + wrapInTestApp( + <TestApiProvider + apis={[ + [searchApiRef, searchApiMock], + [analyticsApiRef, analyticsApiMock], + ]} + > <SearchResultGroup query={{ types: ['techdocs'] }} icon={<DocsIcon titleAccess="Docs icon" />} @@ -108,7 +207,12 @@ describe('SearchResultGroup', () => { await renderWithEffects( wrapInTestApp( - <TestApiProvider apis={[[searchApiRef, searchApiMock]]}> + <TestApiProvider + apis={[ + [searchApiRef, searchApiMock], + [analyticsApiRef, analyticsApiMock], + ]} + > <SearchResultGroup query={{ types: ['techdocs'] }} icon={<DocsIcon titleAccess="Docs icon" />} @@ -132,7 +236,12 @@ describe('SearchResultGroup', () => { it('Could be customized with no results text', async () => { await renderWithEffects( wrapInTestApp( - <TestApiProvider apis={[[searchApiRef, searchApiMock]]}> + <TestApiProvider + apis={[ + [searchApiRef, searchApiMock], + [analyticsApiRef, analyticsApiMock], + ]} + > <SearchResultGroup query={{ types: ['techdocs'] }} icon={<DocsIcon titleAccess="Docs icon" />} @@ -154,7 +263,12 @@ describe('SearchResultGroup', () => { await renderWithEffects( wrapInTestApp( - <TestApiProvider apis={[[searchApiRef, searchApiMock]]}> + <TestApiProvider + apis={[ + [searchApiRef, searchApiMock], + [analyticsApiRef, analyticsApiMock], + ]} + > <SearchResultGroup query={{ types: ['techdocs'] }} icon={<DocsIcon titleAccess="Docs icon" />} @@ -184,7 +298,12 @@ describe('SearchResultGroup', () => { await renderWithEffects( wrapInTestApp( - <TestApiProvider apis={[[searchApiRef, searchApiMock]]}> + <TestApiProvider + apis={[ + [searchApiRef, searchApiMock], + [analyticsApiRef, analyticsApiMock], + ]} + > <SearchResultGroup query={{ types: ['techdocs'], @@ -232,7 +351,12 @@ describe('SearchResultGroup', () => { await renderWithEffects( wrapInTestApp( - <TestApiProvider apis={[[searchApiRef, searchApiMock]]}> + <TestApiProvider + apis={[ + [searchApiRef, searchApiMock], + [analyticsApiRef, analyticsApiMock], + ]} + > <SearchResultGroup query={{ types: ['techdocs'], @@ -276,7 +400,12 @@ describe('SearchResultGroup', () => { query.mockReturnValueOnce(new Promise(() => {})); await renderWithEffects( wrapInTestApp( - <TestApiProvider apis={[[searchApiRef, searchApiMock]]}> + <TestApiProvider + apis={[ + [searchApiRef, searchApiMock], + [analyticsApiRef, analyticsApiMock], + ]} + > <SearchResultGroup query={{ types: ['techdocs'] }} icon={<DocsIcon titleAccess="Docs icon" />} @@ -295,7 +424,12 @@ describe('SearchResultGroup', () => { query.mockResolvedValueOnce({ results: [] }); await renderWithEffects( wrapInTestApp( - <TestApiProvider apis={[[searchApiRef, searchApiMock]]}> + <TestApiProvider + apis={[ + [searchApiRef, searchApiMock], + [analyticsApiRef, analyticsApiMock], + ]} + > <SearchResultGroup query={{ types: ['techdocs'] }} icon={<DocsIcon titleAccess="Docs icon" />} @@ -315,7 +449,12 @@ describe('SearchResultGroup', () => { query.mockResolvedValueOnce({ results: [] }); await renderWithEffects( wrapInTestApp( - <TestApiProvider apis={[[searchApiRef, searchApiMock]]}> + <TestApiProvider + apis={[ + [searchApiRef, searchApiMock], + [analyticsApiRef, analyticsApiMock], + ]} + > <SearchResultGroup query={{ types: ['techdocs'] }} icon={<DocsIcon titleAccess="Docs icon" />} @@ -335,7 +474,12 @@ describe('SearchResultGroup', () => { query.mockRejectedValueOnce(new Error()); await renderWithEffects( wrapInTestApp( - <TestApiProvider apis={[[searchApiRef, searchApiMock]]}> + <TestApiProvider + apis={[ + [searchApiRef, searchApiMock], + [analyticsApiRef, analyticsApiMock], + ]} + > <SearchResultGroup query={{ types: ['techdocs'] }} icon={<DocsIcon titleAccess="Docs icon" />} diff --git a/plugins/search-react/src/components/SearchResultGroup/SearchResultGroup.tsx b/plugins/search-react/src/components/SearchResultGroup/SearchResultGroup.tsx index 6040dbe560..2a3ae1e24c 100644 --- a/plugins/search-react/src/components/SearchResultGroup/SearchResultGroup.tsx +++ b/plugins/search-react/src/components/SearchResultGroup/SearchResultGroup.tsx @@ -27,9 +27,8 @@ import { makeStyles, Theme, List, - ListSubheader, - ListItem, ListProps, + ListSubheader, Menu, MenuItem, InputBase, @@ -43,17 +42,19 @@ import ArrowRightIcon from '@material-ui/icons/ArrowForwardIos'; import { JsonValue } from '@backstage/types'; import { - EmptyState, Link, LinkProps, Progress, + EmptyState, ResponseErrorPanel, } from '@backstage/core-components'; import { AnalyticsContext } from '@backstage/core-plugin-api'; -import { SearchQuery, SearchResult } from '@backstage/plugin-search-common'; +import { SearchResult } from '@backstage/plugin-search-common'; + +import { useSearchResultListItemExtensions } from '../../extensions'; import { DefaultResultListItem } from '../DefaultResultListItem'; -import { SearchResultState } from '../SearchResult'; +import { SearchResultState, SearchResultStateProps } from '../SearchResult'; const useStyles = makeStyles((theme: Theme) => ({ listSubheader: { @@ -278,6 +279,14 @@ export const SearchResultGroupSelectFilterField = ( * @public */ export type SearchResultGroupLayoutProps<FilterOption> = ListProps & { + /** + * If defined, will render a default error panel. + */ + error?: Error; + /** + * If defined, will render a default loading progress. + */ + loading?: boolean; /** * Icon that representing a result group. */ @@ -331,18 +340,14 @@ export type SearchResultGroupLayoutProps<FilterOption> = ListProps & { index: number, array: SearchResult[], ) => JSX.Element | null; - /** - * If defined, will render a default error panel. - */ - error?: Error; - /** - * If defined, will render a default loading progress. - */ - loading?: boolean; /** * Optional component to render when no results. Default to <EmptyState /> component. */ noResultsComponent?: ReactNode; + /** + * Optional property to provide if component should not render the component when no results are found. + */ + disableRenderingWithNoResults?: boolean; }; /** @@ -357,8 +362,8 @@ export function SearchResultGroupLayout<FilterOption>( const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null); const { - loading, error, + loading, icon, title, titleProps = {}, @@ -384,7 +389,8 @@ export function SearchResultGroupLayout<FilterOption>( result={resultItem.document} /> ), - noResultsComponent = ( + disableRenderingWithNoResults, + noResultsComponent = disableRenderingWithNoResults ? null : ( <EmptyState missing="data" title="Sorry, no results were found" /> ), ...rest @@ -398,6 +404,23 @@ export function SearchResultGroupLayout<FilterOption>( setAnchorEl(null); }, []); + if (loading) { + return <Progress />; + } + + if (error) { + return ( + <ResponseErrorPanel + title="Error encountered while fetching search results" + error={error} + /> + ); + } + + if (!resultItems?.length) { + return <>{noResultsComponent}</>; + } + return ( <List {...rest}> <ListSubheader className={classes.listSubheader}> @@ -440,19 +463,7 @@ export function SearchResultGroupLayout<FilterOption>( {link} </Link> </ListSubheader> - {loading ? <Progress /> : null} - {!loading && error ? ( - <ResponseErrorPanel - title="Error encountered while fetching search results" - error={error} - /> - ) : null} - {!loading && !error && resultItems?.length - ? resultItems.map(renderResultItem) - : null} - {!loading && !error && !resultItems?.length ? ( - <ListItem>{noResultsComponent}</ListItem> - ) : null} + {resultItems.map(renderResultItem)} </List> ); } @@ -461,19 +472,14 @@ export function SearchResultGroupLayout<FilterOption>( * Props for {@link SearchResultGroup}. * @public */ -export type SearchResultGroupProps<FilterOption> = Omit< - SearchResultGroupLayoutProps<FilterOption>, - 'loading' | 'error' | 'resultItems' | 'filterFields' -> & { - /** - * A search query used for requesting the results to be grouped. - */ - query: Partial<SearchQuery>; - /** - * Optional property to provide if component should not render the group when no results are found. - */ - disableRenderingWithNoResults?: boolean; -}; +export type SearchResultGroupProps<FilterOption> = Pick< + SearchResultStateProps, + 'query' +> & + Omit< + SearchResultGroupLayoutProps<FilterOption>, + 'loading' | 'error' | 'resultItems' | 'filterFields' + >; /** * Given a query, search for results and render them as a group. @@ -483,22 +489,9 @@ export type SearchResultGroupProps<FilterOption> = Omit< export function SearchResultGroup<FilterOption>( props: SearchResultGroupProps<FilterOption>, ) { - const { - query, - linkProps = {}, - disableRenderingWithNoResults, - ...rest - } = props; + const { query, children, renderResultItem, linkProps = {}, ...rest } = props; - const to = `/search?${qs.stringify( - { - query: query.term, - types: query.types, - filters: query.filters, - pageCursor: query.pageCursor, - }, - { arrayFormat: 'brackets' }, - )}`; + const defaultRenderResultItem = useSearchResultListItemExtensions(children); return ( <AnalyticsContext @@ -508,19 +501,24 @@ export function SearchResultGroup<FilterOption>( }} > <SearchResultState query={query}> - {({ loading, error, value }) => { - if (!value?.results?.length && disableRenderingWithNoResults) { - return null; - } + {( + { loading, error, value }, + { term, types, pageCursor, filters = {} }, + ) => { + const to = `/search?${qs.stringify( + { term, types, filters, pageCursor, query: term }, + { arrayFormat: 'brackets' }, + )}`; return ( <SearchResultGroupLayout {...rest} - loading={loading} error={error} + loading={loading} linkProps={{ to, ...linkProps }} + filterFields={Object.keys(filters)} resultItems={value?.results} - filterFields={Object.keys(query.filters ?? {})} + renderResultItem={renderResultItem ?? defaultRenderResultItem} /> ); }} diff --git a/plugins/search-react/src/components/SearchResultList/SearchResultList.stories.tsx b/plugins/search-react/src/components/SearchResultList/SearchResultList.stories.tsx index fcda4cec87..4369b6636e 100644 --- a/plugins/search-react/src/components/SearchResultList/SearchResultList.stories.tsx +++ b/plugins/search-react/src/components/SearchResultList/SearchResultList.stories.tsx @@ -18,12 +18,14 @@ import React, { ComponentType, useState } from 'react'; import { Grid, ListItem, ListItemIcon, ListItemText } from '@material-ui/core'; -import { createRouteRef } from '@backstage/core-plugin-api'; import { CatalogIcon, Link } from '@backstage/core-components'; -import { SearchQuery, SearchResultSet } from '@backstage/plugin-search-common'; import { TestApiProvider, wrapInTestApp } from '@backstage/test-utils'; +import { createPlugin, createRouteRef } from '@backstage/core-plugin-api'; +import { SearchQuery, SearchResultSet } from '@backstage/plugin-search-common'; +import { SearchContextProvider } from '../../context'; import { searchApiRef, MockSearchApi } from '../../api'; +import { createSearchResultListItemExtension } from '../../extensions'; import { SearchResultList } from './SearchResultList'; import { DefaultResultListItem } from '../DefaultResultListItem'; @@ -72,6 +74,14 @@ export default { }; export const Default = () => { + return ( + <SearchContextProvider> + <SearchResultList /> + </SearchContextProvider> + ); +}; + +export const WithQuery = () => { const [query] = useState<Partial<SearchQuery>>({ types: ['techdocs'], }); @@ -195,3 +205,21 @@ export const WithCustomResultItem = () => { /> ); }; + +export const WithResultItemExtensions = () => { + const [query] = useState<Partial<SearchQuery>>({ + types: ['techdocs'], + }); + const plugin = createPlugin({ id: 'plugin' }); + const DefaultSearchResultListItem = plugin.provide( + createSearchResultListItemExtension({ + name: 'DefaultResultListItem', + component: async () => DefaultResultListItem, + }), + ); + return ( + <SearchResultList query={query}> + <DefaultSearchResultListItem /> + </SearchResultList> + ); +}; diff --git a/plugins/search-react/src/components/SearchResultList/SearchResultList.test.tsx b/plugins/search-react/src/components/SearchResultList/SearchResultList.test.tsx index 93bbaa5602..7e8aa7bb33 100644 --- a/plugins/search-react/src/components/SearchResultList/SearchResultList.test.tsx +++ b/plugins/search-react/src/components/SearchResultList/SearchResultList.test.tsx @@ -17,17 +17,23 @@ import React from 'react'; import { screen, waitFor } from '@testing-library/react'; +import { ListItem } from '@material-ui/core'; import { TestApiProvider, renderWithEffects, wrapInTestApp, + MockAnalyticsApi, } from '@backstage/test-utils'; +import { analyticsApiRef, createPlugin } from '@backstage/core-plugin-api'; import { searchApiRef } from '../../api'; +import { createSearchResultListItemExtension } from '../../extensions'; + import { SearchResultList } from './SearchResultList'; const query = jest.fn().mockResolvedValue({ results: [] }); const searchApiMock = { query }; +const analyticsApiMock = new MockAnalyticsApi(); describe('SearchResultList', () => { const results = [ @@ -56,7 +62,12 @@ describe('SearchResultList', () => { it('Renders without exploding', async () => { await renderWithEffects( wrapInTestApp( - <TestApiProvider apis={[[searchApiRef, searchApiMock]]}> + <TestApiProvider + apis={[ + [searchApiRef, searchApiMock], + [analyticsApiRef, analyticsApiMock], + ]} + > <SearchResultList query={{ types: ['techdocs'], @@ -81,7 +92,12 @@ describe('SearchResultList', () => { await renderWithEffects( wrapInTestApp( - <TestApiProvider apis={[[searchApiRef, searchApiMock]]}> + <TestApiProvider + apis={[ + [searchApiRef, searchApiMock], + [analyticsApiRef, analyticsApiMock], + ]} + > <SearchResultList query={{ types: ['techdocs'], @@ -106,7 +122,12 @@ describe('SearchResultList', () => { query.mockReturnValueOnce(new Promise(() => {})); await renderWithEffects( wrapInTestApp( - <TestApiProvider apis={[[searchApiRef, searchApiMock]]}> + <TestApiProvider + apis={[ + [searchApiRef, searchApiMock], + [analyticsApiRef, analyticsApiMock], + ]} + > <SearchResultList query={{ types: ['techdocs'], @@ -125,7 +146,12 @@ describe('SearchResultList', () => { query.mockResolvedValueOnce({ results: [] }); await renderWithEffects( wrapInTestApp( - <TestApiProvider apis={[[searchApiRef, searchApiMock]]}> + <TestApiProvider + apis={[ + [searchApiRef, searchApiMock], + [analyticsApiRef, analyticsApiMock], + ]} + > <SearchResultList query={{ types: ['techdocs'] }} disableRenderingWithNoResults @@ -143,7 +169,12 @@ describe('SearchResultList', () => { query.mockResolvedValueOnce({ results: [] }); await renderWithEffects( wrapInTestApp( - <TestApiProvider apis={[[searchApiRef, searchApiMock]]}> + <TestApiProvider + apis={[ + [searchApiRef, searchApiMock], + [analyticsApiRef, analyticsApiMock], + ]} + > <SearchResultList query={{ types: ['techdocs'] }} noResultsComponent="No results were found" @@ -161,7 +192,12 @@ describe('SearchResultList', () => { query.mockRejectedValueOnce(new Error()); await renderWithEffects( wrapInTestApp( - <TestApiProvider apis={[[searchApiRef, searchApiMock]]}> + <TestApiProvider + apis={[ + [searchApiRef, searchApiMock], + [analyticsApiRef, analyticsApiMock], + ]} + > <SearchResultList query={{ types: ['techdocs'], @@ -179,4 +215,45 @@ describe('SearchResultList', () => { ).toBeInTheDocument(); }); }); + + it('should render search results using list item extensions', async () => { + query.mockResolvedValueOnce({ + results, + }); + + const SearchResultListItemExtension = createPlugin({ + id: 'plugin', + }).provide( + createSearchResultListItemExtension({ + name: 'SearchResultListItemExtension', + component: async () => props => + <ListItem>Result: {props.result?.title}</ListItem>, + }), + ); + + await renderWithEffects( + wrapInTestApp( + <TestApiProvider + apis={[ + [searchApiRef, searchApiMock], + [analyticsApiRef, analyticsApiMock], + ]} + > + <SearchResultList + query={{ + types: ['techdocs'], + }} + > + <SearchResultListItemExtension /> + </SearchResultList> + </TestApiProvider>, + ), + ); + + await waitFor(() => { + expect(screen.getByText('Result: Search Result 1')).toBeInTheDocument(); + }); + + expect(screen.getByText('Result: Search Result 2')).toBeInTheDocument(); + }); }); diff --git a/plugins/search-react/src/components/SearchResultList/SearchResultList.tsx b/plugins/search-react/src/components/SearchResultList/SearchResultList.tsx index 4279e8936a..1a539b74a6 100644 --- a/plugins/search-react/src/components/SearchResultList/SearchResultList.tsx +++ b/plugins/search-react/src/components/SearchResultList/SearchResultList.tsx @@ -16,24 +16,34 @@ import React, { ReactNode } from 'react'; -import { List, ListItem, ListProps } from '@material-ui/core'; +import { List, ListProps } from '@material-ui/core'; import { - EmptyState, Progress, + EmptyState, ResponseErrorPanel, } from '@backstage/core-components'; import { AnalyticsContext } from '@backstage/core-plugin-api'; -import { SearchQuery, SearchResult } from '@backstage/plugin-search-common'; +import { SearchResult } from '@backstage/plugin-search-common'; + +import { useSearchResultListItemExtensions } from '../../extensions'; import { DefaultResultListItem } from '../DefaultResultListItem'; -import { SearchResultState } from '../SearchResult'; +import { SearchResultState, SearchResultStateProps } from '../SearchResult'; /** * Props for {@link SearchResultListLayout} * @public */ export type SearchResultListLayoutProps = ListProps & { + /** + * If defined, will render a default error panel. + */ + error?: Error; + /** + * If defined, will render a default loading progress. + */ + loading?: boolean; /** * Search results to be rendered as a list. */ @@ -46,18 +56,14 @@ export type SearchResultListLayoutProps = ListProps & { index: number, array: SearchResult[], ) => JSX.Element | null; - /** - * If defined, will render a default error panel. - */ - error?: Error; - /** - * If defined, will render a default loading progress. - */ - loading?: boolean; /** * Optional component to render when no results. Default to <EmptyState /> component. */ noResultsComponent?: ReactNode; + /** + * Optional property to provide if component should not render the component when no results are found. + */ + disableRenderingWithNoResults?: boolean; }; /** @@ -67,8 +73,8 @@ export type SearchResultListLayoutProps = ListProps & { */ export const SearchResultListLayout = (props: SearchResultListLayoutProps) => { const { - loading, error, + loading, resultItems, renderResultItem = resultItem => ( <DefaultResultListItem @@ -76,48 +82,39 @@ export const SearchResultListLayout = (props: SearchResultListLayoutProps) => { result={resultItem.document} /> ), - noResultsComponent = ( + disableRenderingWithNoResults, + noResultsComponent = disableRenderingWithNoResults ? null : ( <EmptyState missing="data" title="Sorry, no results were found" /> ), ...rest } = props; - return ( - <List {...rest}> - {loading ? <Progress /> : null} - {!loading && error ? ( - <ResponseErrorPanel - title="Error encountered while fetching search results" - error={error} - /> - ) : null} - {!loading && !error && resultItems?.length - ? resultItems.map(renderResultItem) - : null} - {!loading && !error && !resultItems?.length ? ( - <ListItem>{noResultsComponent}</ListItem> - ) : null} - </List> - ); + if (loading) { + return <Progress />; + } + + if (error) { + return ( + <ResponseErrorPanel + title="Error encountered while fetching search results" + error={error} + /> + ); + } + + if (!resultItems?.length) { + return <>{noResultsComponent}</>; + } + + return <List {...rest}>{resultItems.map(renderResultItem)}</List>; }; /** * Props for {@link SearchResultList}. * @public */ -export type SearchResultListProps = Omit< - SearchResultListLayoutProps, - 'loading' | 'error' | 'resultItems' -> & { - /** - * A search query used for requesting the results to be listed. - */ - query: Partial<SearchQuery>; - /** - * Optional property to provide if component should not render the component when no results are found. - */ - disableRenderingWithNoResults?: boolean; -}; +export type SearchResultListProps = Pick<SearchResultStateProps, 'query'> & + Omit<SearchResultListLayoutProps, 'loading' | 'error' | 'resultItems'>; /** * Given a query, search for results and render them as a list. @@ -125,7 +122,9 @@ export type SearchResultListProps = Omit< * @public */ export const SearchResultList = (props: SearchResultListProps) => { - const { query, disableRenderingWithNoResults, ...rest } = props; + const { query, renderResultItem, children, ...rest } = props; + + const defaultRenderResultItem = useSearchResultListItemExtensions(children); return ( <AnalyticsContext @@ -135,20 +134,15 @@ export const SearchResultList = (props: SearchResultListProps) => { }} > <SearchResultState query={query}> - {({ loading, error, value }) => { - if (!value?.results?.length && disableRenderingWithNoResults) { - return null; - } - - return ( - <SearchResultListLayout - {...rest} - loading={loading} - error={error} - resultItems={value?.results} - /> - ); - }} + {({ loading, error, value }) => ( + <SearchResultListLayout + {...rest} + error={error} + loading={loading} + resultItems={value?.results} + renderResultItem={renderResultItem ?? defaultRenderResultItem} + /> + )} </SearchResultState> </AnalyticsContext> ); diff --git a/plugins/search-react/src/components/index.ts b/plugins/search-react/src/components/index.ts index 5f68905407..c85714fa46 100644 --- a/plugins/search-react/src/components/index.ts +++ b/plugins/search-react/src/components/index.ts @@ -18,9 +18,9 @@ export * from './HighlightedSearchResultText'; export * from './SearchBar'; export * from './SearchAutocomplete'; export * from './SearchFilter'; -export * from './SearchResult'; -export * from './SearchResultPager'; export * from './SearchPagination'; +export * from './SearchResult'; export * from './SearchResultList'; export * from './SearchResultGroup'; +export * from './SearchResultPager'; export * from './DefaultResultListItem'; diff --git a/plugins/search-react/src/extensions.test.tsx b/plugins/search-react/src/extensions.test.tsx new file mode 100644 index 0000000000..24c115e572 --- /dev/null +++ b/plugins/search-react/src/extensions.test.tsx @@ -0,0 +1,209 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React from 'react'; +import { screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; + +import { ListItem, ListItemText } from '@material-ui/core'; + +import { + wrapInTestApp, + renderWithEffects, + TestApiProvider, + MockAnalyticsApi, +} from '@backstage/test-utils'; +import { + createPlugin, + BackstagePlugin, + analyticsApiRef, +} from '@backstage/core-plugin-api'; +import { SearchResult, SearchDocument } from '@backstage/plugin-search-common'; + +import { + SearchResultListItemExtensions, + createSearchResultListItemExtension, + SearchResultListItemExtensionOptions, +} from './extensions'; + +const analyticsApiMock = new MockAnalyticsApi(); + +const results = [ + { + type: 'explore', + document: { + location: 'search/search-result1', + title: 'Search Result 1', + text: 'Some text from the search result 1', + }, + }, + { + type: 'techdocs', + document: { + location: 'search/search-result2', + title: 'Search Result 2', + text: 'Some text from the search result 2', + }, + }, +]; + +const createExtension = ( + plugin: BackstagePlugin, + options: Partial< + Omit< + SearchResultListItemExtensionOptions< + (props: { result?: SearchDocument }) => JSX.Element | null + >, + 'name' + > + > = {}, +) => { + const { + predicate, + component = async () => (props: { result?: SearchDocument }) => + ( + <ListItem> + <ListItemText primary="Default" secondary={props.result?.title} /> + </ListItem> + ), + } = options; + return plugin.provide( + createSearchResultListItemExtension({ + predicate, + component, + name: 'TestSearchResultItemExtension', + }), + ); +}; + +describe('extensions', () => { + it('renders without exploding', async () => { + await renderWithEffects( + wrapInTestApp( + <TestApiProvider apis={[[analyticsApiRef, analyticsApiMock]]}> + <SearchResultListItemExtensions results={results} /> + </TestApiProvider>, + ), + ); + + expect(screen.getByText('Search Result 1')).toBeInTheDocument(); + expect( + screen.getByText('Some text from the search result 1'), + ).toBeInTheDocument(); + + expect(screen.getByText('Search Result 2')).toBeInTheDocument(); + expect( + screen.getByText('Some text from the search result 2'), + ).toBeInTheDocument(); + }); + + it('capture results discovery events', async () => { + await renderWithEffects( + wrapInTestApp( + <TestApiProvider apis={[[analyticsApiRef, analyticsApiMock]]}> + <SearchResultListItemExtensions results={results} /> + </TestApiProvider>, + ), + ); + + await userEvent.click( + screen.getByRole('button', { name: /Search Result 1/ }), + ); + + expect(analyticsApiMock.getEvents()[0]).toMatchObject({ + action: 'discover', + subject: 'Search Result 1', + context: { routeRef: 'unknown', pluginId: 'root', extension: 'App' }, + attributes: { to: 'search/search-result1' }, + }); + }); + + it('Could be used as simple components', async () => { + const plugin = createPlugin({ id: 'plugin' }); + const DefaultSearchResultListItemExtension = createExtension(plugin); + + await renderWithEffects( + wrapInTestApp( + <TestApiProvider apis={[[analyticsApiRef, analyticsApiMock]]}> + <DefaultSearchResultListItemExtension result={results[0].document} /> + </TestApiProvider>, + ), + ); + + expect(screen.getByText('Default')).toBeInTheDocument(); + expect(screen.getByText('Search Result 1')).toBeInTheDocument(); + + await userEvent.click( + screen.getByRole('button', { name: /Search Result 1/ }), + ); + + expect(analyticsApiMock.getEvents()[0]).toMatchObject({ + action: 'discover', + subject: 'Search Result 1', + context: { routeRef: 'unknown', pluginId: 'root', extension: 'App' }, + attributes: { to: 'search/search-result1' }, + }); + }); + + it('use default options for rendering results', async () => { + const plugin = createPlugin({ id: 'plugin' }); + const DefaultSearchResultListItemExtension = createExtension(plugin); + + await renderWithEffects( + wrapInTestApp( + <TestApiProvider apis={[[analyticsApiRef, analyticsApiMock]]}> + <SearchResultListItemExtensions results={results}> + <DefaultSearchResultListItemExtension /> + </SearchResultListItemExtensions> + </TestApiProvider>, + ), + ); + + expect(screen.getAllByText('Default')).toHaveLength(2); + expect(screen.getByText('Search Result 1')).toBeInTheDocument(); + expect(screen.getByText('Search Result 2')).toBeInTheDocument(); + }); + + it('use custom options for rendering results', async () => { + const plugin = createPlugin({ id: 'plugin' }); + const DefaultSearchResultListItemExtension = createExtension(plugin); + const ExploreSearchResultListItemExtension = createExtension(plugin, { + predicate: (result: SearchResult) => result.type === 'explore', + component: async () => (props: { result?: SearchDocument }) => + ( + <ListItem> + <ListItemText primary="Explore" secondary={props.result?.title} /> + </ListItem> + ), + }); + + await renderWithEffects( + wrapInTestApp( + <TestApiProvider apis={[[analyticsApiRef, analyticsApiMock]]}> + <SearchResultListItemExtensions results={results}> + <ExploreSearchResultListItemExtension /> + <DefaultSearchResultListItemExtension /> + </SearchResultListItemExtensions> + </TestApiProvider>, + ), + ); + + expect(screen.getAllByText('Default')).toHaveLength(1); + expect(screen.getAllByText('Explore')).toHaveLength(1); + expect(screen.getByText('Search Result 1')).toBeInTheDocument(); + expect(screen.getByText('Search Result 2')).toBeInTheDocument(); + }); +}); diff --git a/plugins/search-react/src/extensions.tsx b/plugins/search-react/src/extensions.tsx new file mode 100644 index 0000000000..1e0619b14c --- /dev/null +++ b/plugins/search-react/src/extensions.tsx @@ -0,0 +1,238 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React, { + Fragment, + ReactNode, + PropsWithChildren, + isValidElement, + createElement, + cloneElement, + useCallback, +} from 'react'; + +import { + getComponentData, + useElementFilter, + Extension, + createReactExtension, + useAnalytics, +} from '@backstage/core-plugin-api'; +import { SearchDocument, SearchResult } from '@backstage/plugin-search-common'; + +import { Box, List, ListProps } from '@material-ui/core'; + +import { DefaultResultListItem } from './components'; + +/** + * @internal + * Key for result extensions. + */ +const SEARCH_RESULT_LIST_ITEM_EXTENSION = + 'search.results.list.items.extensions.v1'; + +/** + * @internal + * Returns the first extension element found for a given result, and null otherwise. + * @param elements - All extension elements. + * @param result - The search result. + */ +const findSearchResultListItemExtensionElement = ( + elements: ReactNode[], + result: SearchResult, +) => { + for (const element of elements) { + if (!isValidElement(element)) continue; + const predicate = getComponentData<(result: SearchResult) => boolean>( + element, + SEARCH_RESULT_LIST_ITEM_EXTENSION, + ); + if (!predicate?.(result)) continue; + return cloneElement(element, { + rank: result.rank, + highlight: result.highlight, + result: result.document, + // Use props in situations where a consumer is manually rendering the extension + ...element.props, + }); + } + return null; +}; + +/** + * @internal + * Props for {@link SearchResultListItemExtension}. + */ +type SearchResultListItemExtensionProps = PropsWithChildren<{ + rank?: number; + result?: SearchDocument; + noTrack?: boolean; +}>; + +/** + * @internal + * Extends children with extension capabilities. + * @param props - see {@link SearchResultListItemExtensionProps}. + */ +const SearchResultListItemExtension = ({ + rank, + result, + noTrack, + children, +}: SearchResultListItemExtensionProps) => { + const analytics = useAnalytics(); + + const handleClickCapture = useCallback(() => { + if (noTrack) return; + if (!result) return; + analytics.captureEvent('discover', result.title, { + attributes: { to: result.location }, + value: rank, + }); + }, [rank, result, noTrack, analytics]); + + return ( + <Box role="button" tabIndex={0} onClickCapture={handleClickCapture}> + {children} + </Box> + ); +}; + +/** + * @public + * Options for {@link createSearchResultListItemExtension}. + */ +export type SearchResultListItemExtensionOptions< + Component extends (props: any) => JSX.Element | null, +> = { + /** + * The extension name. + */ + name: string; + /** + * The extension component. + */ + component: () => Promise<Component>; + /** + * When an extension defines a predicate, it returns true if the result should be rendered by that extension. + * Defaults to a predicate that returns true, which means it renders all sorts of results. + */ + predicate?: (result: SearchResult) => boolean; +}; + +/** + * @public + * Creates a search result item extension. + * @param options - The extension options, see {@link SearchResultListItemExtensionOptions} for more details. + */ +export const createSearchResultListItemExtension = < + Component extends (props: any) => JSX.Element | null, +>( + options: SearchResultListItemExtensionOptions<Component>, +): Extension<Component> => { + const { name, component, predicate = () => true } = options; + + return createReactExtension<Component>({ + name, + component: { + lazy: () => + component().then( + type => + (props => ( + <SearchResultListItemExtension + rank={props.rank} + result={props.result} + noTrack={props.noTrack} + > + {createElement(type, props)} + </SearchResultListItemExtension> + )) as Component, + ), + }, + data: { + [SEARCH_RESULT_LIST_ITEM_EXTENSION]: predicate, + }, + }); +}; + +/** + * @public + * Returns a function that renders a result using extensions. + */ +export const useSearchResultListItemExtensions = (children: ReactNode) => { + const elements = useElementFilter( + children, + collection => { + return collection + .selectByComponentData({ + key: SEARCH_RESULT_LIST_ITEM_EXTENSION, + }) + .getElements(); + }, + [children], + ); + + return useCallback( + (result: SearchResult, key?: number) => { + const element = findSearchResultListItemExtensionElement( + elements, + result, + ); + + return ( + <Fragment key={key}> + {element ?? ( + <SearchResultListItemExtension + rank={result.rank} + result={result.document} + > + <DefaultResultListItem + rank={result.rank} + highlight={result.highlight} + result={result.document} + /> + </SearchResultListItemExtension> + )} + </Fragment> + ); + }, + [elements], + ); +}; + +/** + * @public + * Props for {@link SearchResultListItemExtensions} + */ +export type SearchResultListItemExtensionsProps = Omit<ListProps, 'results'> & { + /** + * Search result list. + */ + results: SearchResult[]; +}; + +/** + * @public + * Render results using search extensions. + * @param props - see {@link SearchResultListItemExtensionsProps} + */ +export const SearchResultListItemExtensions = ( + props: SearchResultListItemExtensionsProps, +) => { + const { results, children, ...rest } = props; + const render = useSearchResultListItemExtensions(children); + return <List {...rest}>{results.map(render)}</List>; +}; diff --git a/plugins/search-react/src/index.ts b/plugins/search-react/src/index.ts index 9813661f3e..8b234e3c05 100644 --- a/plugins/search-react/src/index.ts +++ b/plugins/search-react/src/index.ts @@ -22,6 +22,7 @@ export { searchApiRef, MockSearchApi } from './api'; export type { SearchApi } from './api'; +export * from './extensions'; export * from './components'; export { SearchContextProvider, diff --git a/plugins/search/CHANGELOG.md b/plugins/search/CHANGELOG.md index 32eebe7fae..4e4d5de406 100644 --- a/plugins/search/CHANGELOG.md +++ b/plugins/search/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-search +## 1.1.0-next.1 + +### Minor Changes + +- 0eaa579f89: Update `SearchModal` component to use `SearchResult` extensions. + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-search-react@1.5.0-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-search-common@1.2.1 + ## 1.0.8-next.0 ### Patch Changes diff --git a/plugins/search/package.json b/plugins/search/package.json index 7aa8b5a123..6acb85af9b 100644 --- a/plugins/search/package.json +++ b/plugins/search/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search", "description": "The Backstage plugin that provides your backstage app with search", - "version": "1.0.8-next.0", + "version": "1.1.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search/src/components/SearchModal/SearchModal.tsx b/plugins/search/src/components/SearchModal/SearchModal.tsx index b1a0b2cd45..d17cf0f6ba 100644 --- a/plugins/search/src/components/SearchModal/SearchModal.tsx +++ b/plugins/search/src/components/SearchModal/SearchModal.tsx @@ -23,7 +23,6 @@ import { DialogTitle, Divider, Grid, - List, Paper, useTheme, } from '@material-ui/core'; @@ -31,7 +30,6 @@ import Typography from '@material-ui/core/Typography'; import LaunchIcon from '@material-ui/icons/Launch'; import { makeStyles } from '@material-ui/core/styles'; import { - DefaultResultListItem, SearchContextProvider, SearchBar, SearchResult, @@ -151,27 +149,10 @@ export const Modal = ({ toggleModal }: SearchModalProps) => { </Grid> </Grid> <Divider /> - <SearchResult> - {({ results }) => ( - <List> - {results.map(({ document, highlight }) => ( - <div - role="button" - tabIndex={0} - key={`${document.location}-btn`} - onClick={handleSearchResultClick} - onKeyDown={handleSearchResultClick} - > - <DefaultResultListItem - key={document.location} - result={document} - highlight={highlight} - /> - </div> - ))} - </List> - )} - </SearchResult> + <SearchResult + onClick={handleSearchResultClick} + onKeyDown={handleSearchResultClick} + /> </DialogContent> <DialogActions className={classes.dialogActionsContainer}> <Grid container direction="row"> diff --git a/plugins/search/src/index.ts b/plugins/search/src/index.ts index 8e1db7c2b8..66b032c83c 100644 --- a/plugins/search/src/index.ts +++ b/plugins/search/src/index.ts @@ -47,7 +47,7 @@ export type { SidebarSearchModalProps } from './components/SidebarSearchModal'; export { HomePageSearchBar, SearchPage, + SidebarSearchModal, searchPlugin as plugin, searchPlugin, - SidebarSearchModal, } from './plugin'; diff --git a/plugins/sentry/CHANGELOG.md b/plugins/sentry/CHANGELOG.md index 49be1fc880..b19a4b29d9 100644 --- a/plugins/sentry/CHANGELOG.md +++ b/plugins/sentry/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-sentry +## 0.4.8-next.1 + +### Patch Changes + +- 85b04f659a: Internal refactor to not use deprecated `substr` +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.4.8-next.0 ### Patch Changes diff --git a/plugins/sentry/package.json b/plugins/sentry/package.json index 72e9fbdc50..f9b5dad4b8 100644 --- a/plugins/sentry/package.json +++ b/plugins/sentry/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-sentry", "description": "A Backstage plugin that integrates towards Sentry", - "version": "0.4.8-next.0", + "version": "0.4.8-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sentry/src/components/ErrorCell/ErrorCell.tsx b/plugins/sentry/src/components/ErrorCell/ErrorCell.tsx index 015cf96ed1..14e0213bfa 100644 --- a/plugins/sentry/src/components/ErrorCell/ErrorCell.tsx +++ b/plugins/sentry/src/components/ErrorCell/ErrorCell.tsx @@ -22,7 +22,7 @@ import { BackstageTheme } from '@backstage/theme'; import { Link } from '@backstage/core-components'; function stripText(text: string, maxLength: number) { - return text.length > maxLength ? `${text.substr(0, maxLength)}...` : text; + return text.length > maxLength ? `${text.slice(0, maxLength)}...` : text; } const useStyles = makeStyles<BackstageTheme>(theme => ({ root: { diff --git a/plugins/shortcuts/CHANGELOG.md b/plugins/shortcuts/CHANGELOG.md index f301ff2692..224ad0a78d 100644 --- a/plugins/shortcuts/CHANGELOG.md +++ b/plugins/shortcuts/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-shortcuts +## 0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + ## 0.3.6 ### Patch Changes diff --git a/plugins/shortcuts/package.json b/plugins/shortcuts/package.json index 22e5abe6ad..3a955b95e0 100644 --- a/plugins/shortcuts/package.json +++ b/plugins/shortcuts/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-shortcuts", "description": "A Backstage plugin that provides a shortcuts feature to the sidebar", - "version": "0.3.6", + "version": "0.3.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube-backend/CHANGELOG.md b/plugins/sonarqube-backend/CHANGELOG.md index 0475073584..4f568d7442 100644 --- a/plugins/sonarqube-backend/CHANGELOG.md +++ b/plugins/sonarqube-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-sonarqube-backend +## 0.1.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + ## 0.1.7-next.0 ### Patch Changes diff --git a/plugins/sonarqube-backend/package.json b/plugins/sonarqube-backend/package.json index 5aa8367434..785911f6c0 100644 --- a/plugins/sonarqube-backend/package.json +++ b/plugins/sonarqube-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-sonarqube-backend", - "version": "0.1.7-next.0", + "version": "0.1.7-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube/CHANGELOG.md b/plugins/sonarqube/CHANGELOG.md index 0d71fd4f9a..a419f321e3 100644 --- a/plugins/sonarqube/CHANGELOG.md +++ b/plugins/sonarqube/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-sonarqube +## 0.6.3-next.1 + +### Patch Changes + +- 6310eacc11: Additional export added in order to bind SonarQubeClient to its apiref +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-sonarqube-react@0.1.2-next.0 + ## 0.6.3-next.0 ### Patch Changes diff --git a/plugins/sonarqube/api-report.md b/plugins/sonarqube/api-report.md index 31e98a0f4a..f77c66ac59 100644 --- a/plugins/sonarqube/api-report.md +++ b/plugins/sonarqube/api-report.md @@ -6,8 +6,12 @@ /// <reference types="react" /> import { BackstagePlugin } from '@backstage/core-plugin-api'; +import { DiscoveryApi } from '@backstage/core-plugin-api'; import { Entity } from '@backstage/catalog-model'; +import { FindingSummary } from '@backstage/plugin-sonarqube-react'; +import { IdentityApi } from '@backstage/core-plugin-api'; import { InfoCardVariants } from '@backstage/core-components'; +import { SonarQubeApi } from '@backstage/plugin-sonarqube-react'; // @public (undocumented) export type DuplicationRating = { @@ -38,6 +42,29 @@ export const SonarQubeCard: (props: { duplicationRatings?: DuplicationRating[]; }) => JSX.Element; +// @alpha (undocumented) +export class SonarQubeClient implements SonarQubeApi { + constructor({ + discoveryApi, + identityApi, + }: { + discoveryApi: DiscoveryApi; + identityApi: IdentityApi; + }); + // (undocumented) + discoveryApi: DiscoveryApi; + // (undocumented) + getFindingSummary({ + componentKey, + projectInstance, + }?: { + componentKey?: string; + projectInstance?: string; + }): Promise<FindingSummary | undefined>; + // (undocumented) + identityApi: IdentityApi; +} + // @public (undocumented) export type SonarQubeContentPageProps = { title?: string; diff --git a/plugins/sonarqube/package.json b/plugins/sonarqube/package.json index 80b8622fc1..8c5d706db2 100644 --- a/plugins/sonarqube/package.json +++ b/plugins/sonarqube/package.json @@ -1,14 +1,15 @@ { "name": "@backstage/plugin-sonarqube", "description": "", - "version": "0.6.3-next.0", + "version": "0.6.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", "publishConfig": { "access": "public", "main": "dist/index.esm.js", - "types": "dist/index.d.ts" + "types": "dist/index.d.ts", + "alphaTypes": "dist/index.alpha.d.ts" }, "backstage": { "role": "frontend-plugin" @@ -25,7 +26,7 @@ "sonarcloud" ], "scripts": { - "build": "backstage-cli package build", + "build": "backstage-cli package build --experimental-type-build", "start": "backstage-cli package start", "lint": "backstage-cli package lint", "test": "backstage-cli package test", @@ -64,6 +65,7 @@ }, "files": [ "dist", + "alpha", "config.d.ts" ], "configSchema": "config.d.ts" diff --git a/plugins/sonarqube/src/api/SonarQubeClient.ts b/plugins/sonarqube/src/api/SonarQubeClient.ts index cf893ccef5..f742fe026f 100644 --- a/plugins/sonarqube/src/api/SonarQubeClient.ts +++ b/plugins/sonarqube/src/api/SonarQubeClient.ts @@ -23,6 +23,7 @@ import { import { InstanceUrlWrapper, FindingsWrapper } from './types'; import { DiscoveryApi, IdentityApi } from '@backstage/core-plugin-api'; +/** @alpha */ export class SonarQubeClient implements SonarQubeApi { discoveryApi: DiscoveryApi; identityApi: IdentityApi; diff --git a/plugins/sonarqube/src/index.ts b/plugins/sonarqube/src/index.ts index 30f6351d4d..93648caeb5 100644 --- a/plugins/sonarqube/src/index.ts +++ b/plugins/sonarqube/src/index.ts @@ -21,5 +21,6 @@ * @packageDocumentation */ +export * from './api'; export * from './components'; export * from './plugin'; diff --git a/plugins/splunk-on-call/CHANGELOG.md b/plugins/splunk-on-call/CHANGELOG.md index e92f250fad..401f927bd9 100644 --- a/plugins/splunk-on-call/CHANGELOG.md +++ b/plugins/splunk-on-call/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-splunk-on-call +## 0.4.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.4.4-next.0 ### Patch Changes diff --git a/plugins/splunk-on-call/package.json b/plugins/splunk-on-call/package.json index 8e2b7f278c..0700dacf92 100644 --- a/plugins/splunk-on-call/package.json +++ b/plugins/splunk-on-call/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-splunk-on-call", "description": "A Backstage plugin that integrates towards Splunk On-Call", - "version": "0.4.4-next.0", + "version": "0.4.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/stack-overflow-backend/CHANGELOG.md b/plugins/stack-overflow-backend/CHANGELOG.md index 7a2535eae5..5a8f26be5f 100644 --- a/plugins/stack-overflow-backend/CHANGELOG.md +++ b/plugins/stack-overflow-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-stack-overflow-backend +## 0.1.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/plugin-search-common@1.2.1 + ## 0.1.11-next.0 ### Patch Changes diff --git a/plugins/stack-overflow-backend/package.json b/plugins/stack-overflow-backend/package.json index 4d5009bee1..ca8e4a2a55 100644 --- a/plugins/stack-overflow-backend/package.json +++ b/plugins/stack-overflow-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-stack-overflow-backend", - "version": "0.1.11-next.0", + "version": "0.1.11-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/stack-overflow/CHANGELOG.md b/plugins/stack-overflow/CHANGELOG.md index e9ad1d9958..00ed8a363c 100644 --- a/plugins/stack-overflow/CHANGELOG.md +++ b/plugins/stack-overflow/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-stack-overflow +## 0.1.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-home@0.4.31-next.1 + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-search-react@1.5.0-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-search-common@1.2.1 + ## 0.1.11-next.0 ### Patch Changes diff --git a/plugins/stack-overflow/package.json b/plugins/stack-overflow/package.json index 62a15a30c1..d073d519c1 100644 --- a/plugins/stack-overflow/package.json +++ b/plugins/stack-overflow/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-stack-overflow", - "version": "0.1.11-next.0", + "version": "0.1.11-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md index 96e65d116b..64ceb662d2 100644 --- a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md +++ b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-tech-insights-backend-module-jsonfc +## 0.1.26-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-tech-insights-common@0.2.10-next.0 + - @backstage/plugin-tech-insights-node@0.4.0-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + ## 0.1.26-next.0 ### Patch Changes diff --git a/plugins/tech-insights-backend-module-jsonfc/package.json b/plugins/tech-insights-backend-module-jsonfc/package.json index 1a6d87ec6f..f7c1b6563b 100644 --- a/plugins/tech-insights-backend-module-jsonfc/package.json +++ b/plugins/tech-insights-backend-module-jsonfc/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-backend-module-jsonfc", - "version": "0.1.26-next.0", + "version": "0.1.26-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-backend/CHANGELOG.md b/plugins/tech-insights-backend/CHANGELOG.md index 89753667a1..42e4c273a0 100644 --- a/plugins/tech-insights-backend/CHANGELOG.md +++ b/plugins/tech-insights-backend/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-tech-insights-backend +## 0.5.8-next.1 + +### Patch Changes + +- 4024b37449: TechInsightsApi interface now has getFactSchemas() method. + TechInsightsClient now implements method getFactSchemas(). + + **BREAKING** FactSchema type moved from @backstage/plugin-tech-insights-node into @backstage/plugin-tech-insights-common + + These changes are **required** if you were importing this type directly. + + ```diff + - import { FactSchema } from '@backstage/plugin-tech-insights-node'; + + import { FactSchema } from '@backstage/plugin-tech-insights-common'; + ``` + +- Updated dependencies + - @backstage/plugin-tech-insights-common@0.2.10-next.0 + - @backstage/plugin-tech-insights-node@0.4.0-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + ## 0.5.8-next.0 ### Patch Changes diff --git a/plugins/tech-insights-backend/api-report.md b/plugins/tech-insights-backend/api-report.md index a757f0d67c..4b6e5b34dc 100644 --- a/plugins/tech-insights-backend/api-report.md +++ b/plugins/tech-insights-backend/api-report.md @@ -12,7 +12,7 @@ import { FactCheckerFactory } from '@backstage/plugin-tech-insights-node'; import { FactLifecycle } from '@backstage/plugin-tech-insights-node'; import { FactRetriever } from '@backstage/plugin-tech-insights-node'; import { FactRetrieverRegistration } from '@backstage/plugin-tech-insights-node'; -import { FactSchema } from '@backstage/plugin-tech-insights-node'; +import { FactSchema } from '@backstage/plugin-tech-insights-common'; import { HumanDuration } from '@backstage/types'; import { Logger } from 'winston'; import { PluginDatabaseManager } from '@backstage/backend-common'; diff --git a/plugins/tech-insights-backend/package.json b/plugins/tech-insights-backend/package.json index edb94c5784..c04ce8f483 100644 --- a/plugins/tech-insights-backend/package.json +++ b/plugins/tech-insights-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-backend", - "version": "0.5.8-next.0", + "version": "0.5.8-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts b/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts index 62adbad8e3..8796f1511a 100644 --- a/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts +++ b/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts @@ -17,8 +17,8 @@ import { FactRetriever, FactRetrieverRegistration, - FactSchema, } from '@backstage/plugin-tech-insights-node'; +import { FactSchema } from '@backstage/plugin-tech-insights-common'; import { ConflictError, NotFoundError } from '@backstage/errors'; /** diff --git a/plugins/tech-insights-backend/src/service/persistence/TechInsightsDatabase.ts b/plugins/tech-insights-backend/src/service/persistence/TechInsightsDatabase.ts index 7c2ba52717..c8f098a895 100644 --- a/plugins/tech-insights-backend/src/service/persistence/TechInsightsDatabase.ts +++ b/plugins/tech-insights-backend/src/service/persistence/TechInsightsDatabase.ts @@ -16,12 +16,12 @@ import { Knex } from 'knex'; import { FactLifecycle, - FactSchema, FactSchemaDefinition, FlatTechInsightFact, TechInsightFact, TechInsightsStore, } from '@backstage/plugin-tech-insights-node'; +import { FactSchema } from '@backstage/plugin-tech-insights-common'; import { rsort } from 'semver'; import { groupBy, omit } from 'lodash'; import { DateTime } from 'luxon'; diff --git a/plugins/tech-insights-common/CHANGELOG.md b/plugins/tech-insights-common/CHANGELOG.md index 555a77689f..347a4387d0 100644 --- a/plugins/tech-insights-common/CHANGELOG.md +++ b/plugins/tech-insights-common/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-tech-insights-common +## 0.2.10-next.0 + +### Patch Changes + +- 4024b37449: TechInsightsApi interface now has getFactSchemas() method. + TechInsightsClient now implements method getFactSchemas(). + + **BREAKING** FactSchema type moved from @backstage/plugin-tech-insights-node into @backstage/plugin-tech-insights-common + + These changes are **required** if you were importing this type directly. + + ```diff + - import { FactSchema } from '@backstage/plugin-tech-insights-node'; + + import { FactSchema } from '@backstage/plugin-tech-insights-common'; + ``` + +- Updated dependencies + - @backstage/types@1.0.2 + ## 0.2.9 ### Patch Changes diff --git a/plugins/tech-insights-common/api-report.md b/plugins/tech-insights-common/api-report.md index 0236c0619a..51ef13a013 100644 --- a/plugins/tech-insights-common/api-report.md +++ b/plugins/tech-insights-common/api-report.md @@ -47,5 +47,22 @@ export type FactResponse = { }; }; +// @public +export type FactSchema = { + [name: string]: { + type: + | 'integer' + | 'float' + | 'string' + | 'boolean' + | 'datetime' + | 'set' + | 'object'; + description: string; + since?: string; + metadata?: Record<string, any>; + }; +}; + // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/tech-insights-common/package.json b/plugins/tech-insights-common/package.json index f238785e54..d7534b2834 100644 --- a/plugins/tech-insights-common/package.json +++ b/plugins/tech-insights-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-common", - "version": "0.2.9", + "version": "0.2.10-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-common/src/index.ts b/plugins/tech-insights-common/src/index.ts index 66af5c2f93..a74c1f16e9 100644 --- a/plugins/tech-insights-common/src/index.ts +++ b/plugins/tech-insights-common/src/index.ts @@ -134,3 +134,60 @@ export type BulkCheckResponse = Array<{ entity: string; results: CheckResult[]; }>; + +/** + * A record type to specify individual fact shapes + * + * Used as part of a schema to validate, identify and generically construct usage implementations + * of individual fact values in the system. + * + * @public + */ +export type FactSchema = { + /** + * Name of the fact + */ + [name: string]: { + /** + * Type of the individual fact value + * + * Numbers are split into integers and floating point values. + * `set` indicates a collection of values, `object` indicates JSON serializable value + */ + type: + | 'integer' + | 'float' + | 'string' + | 'boolean' + | 'datetime' + | 'set' + | 'object'; + + /** + * A description of this individual fact value + */ + description: string; + + /** + * Optional semver string to indicate when this specific fact definition was added to the schema + */ + since?: string; + + /** + * Metadata related to an individual fact. + * Can contain links, additional description texts and other actionable data. + * + * Currently loosely typed, but in the future when patterns emerge, key shapes can be defined + * + * examples: + * ``` + * \{ + * link: 'https://sonarqube.mycompany.com/fix-these-issues', + * suggestion: 'To affect this value, you can do x, y, z', + * minValue: 0 + * \} + * ``` + */ + metadata?: Record<string, any>; + }; +}; diff --git a/plugins/tech-insights-node/CHANGELOG.md b/plugins/tech-insights-node/CHANGELOG.md index d7986767ae..867a242826 100644 --- a/plugins/tech-insights-node/CHANGELOG.md +++ b/plugins/tech-insights-node/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-tech-insights-node +## 0.4.0-next.1 + +### Minor Changes + +- 4024b37449: TechInsightsApi interface now has getFactSchemas() method. + TechInsightsClient now implements method getFactSchemas(). + + **BREAKING** FactSchema type moved from @backstage/plugin-tech-insights-node into @backstage/plugin-tech-insights-common + + These changes are **required** if you were importing this type directly. + + ```diff + - import { FactSchema } from '@backstage/plugin-tech-insights-node'; + + import { FactSchema } from '@backstage/plugin-tech-insights-common'; + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-tech-insights-common@0.2.10-next.0 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + ## 0.3.10-next.0 ### Patch Changes diff --git a/plugins/tech-insights-node/api-report.md b/plugins/tech-insights-node/api-report.md index 47e76b07ce..dbb8a8b674 100644 --- a/plugins/tech-insights-node/api-report.md +++ b/plugins/tech-insights-node/api-report.md @@ -8,6 +8,7 @@ import { Config } from '@backstage/config'; import { DateTime } from 'luxon'; import { Duration } from 'luxon'; import { DurationLike } from 'luxon'; +import { FactSchema } from '@backstage/plugin-tech-insights-common'; import { HumanDuration } from '@backstage/types'; import { JsonValue } from '@backstage/types'; import { Logger } from 'winston'; @@ -78,23 +79,6 @@ export type FactRetrieverRegistration = { initialDelay?: Duration | HumanDuration; }; -// @public -export type FactSchema = { - [name: string]: { - type: - | 'integer' - | 'float' - | 'string' - | 'boolean' - | 'datetime' - | 'set' - | 'object'; - description: string; - since?: string; - metadata?: Record<string, any>; - }; -}; - // @public export type FactSchemaDefinition = Omit<FactRetriever, 'handler'>; diff --git a/plugins/tech-insights-node/package.json b/plugins/tech-insights-node/package.json index 2981b652a5..79f8846f51 100644 --- a/plugins/tech-insights-node/package.json +++ b/plugins/tech-insights-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-node", - "version": "0.3.10-next.0", + "version": "0.4.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-node/src/facts.ts b/plugins/tech-insights-node/src/facts.ts index a4a0834970..3619f8b66f 100644 --- a/plugins/tech-insights-node/src/facts.ts +++ b/plugins/tech-insights-node/src/facts.ts @@ -20,6 +20,7 @@ import { PluginEndpointDiscovery, TokenManager, } from '@backstage/backend-common'; +import { FactSchema } from '@backstage/plugin-tech-insights-common'; import { Logger } from 'winston'; /** @@ -79,63 +80,6 @@ export type FlatTechInsightFact = TechInsightFact & { id: string; }; -/** - * A record type to specify individual fact shapes - * - * Used as part of a schema to validate, identify and generically construct usage implementations - * of individual fact values in the system. - * - * @public - */ -export type FactSchema = { - /** - * Name of the fact - */ - [name: string]: { - /** - * Type of the individual fact value - * - * Numbers are split into integers and floating point values. - * `set` indicates a collection of values, `object` indicates JSON serializable value - */ - type: - | 'integer' - | 'float' - | 'string' - | 'boolean' - | 'datetime' - | 'set' - | 'object'; - - /** - * A description of this individual fact value - */ - description: string; - - /** - * Optional semver string to indicate when this specific fact definition was added to the schema - */ - since?: string; - - /** - * Metadata related to an individual fact. - * Can contain links, additional description texts and other actionable data. - * - * Currently loosely typed, but in the future when patterns emerge, key shapes can be defined - * - * examples: - * ``` - * \{ - * link: 'https://sonarqube.mycompany.com/fix-these-issues', - * suggestion: 'To affect this value, you can do x, y, z', - * minValue: 0 - * \} - * ``` - */ - metadata?: Record<string, any>; - }; -}; - /** * @public * diff --git a/plugins/tech-insights-node/src/persistence.ts b/plugins/tech-insights-node/src/persistence.ts index 31fda403a8..73abb6c5af 100644 --- a/plugins/tech-insights-node/src/persistence.ts +++ b/plugins/tech-insights-node/src/persistence.ts @@ -14,13 +14,13 @@ * limitations under the License. */ import { - FactSchema, TechInsightFact, FlatTechInsightFact, FactSchemaDefinition, FactLifecycle, } from './facts'; import { DateTime } from 'luxon'; +import { FactSchema } from '@backstage/plugin-tech-insights-common'; /** * TechInsights Database diff --git a/plugins/tech-insights/CHANGELOG.md b/plugins/tech-insights/CHANGELOG.md index 247c9605f4..907fc50495 100644 --- a/plugins/tech-insights/CHANGELOG.md +++ b/plugins/tech-insights/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-tech-insights +## 0.3.7-next.1 + +### Patch Changes + +- 4024b37449: TechInsightsApi interface now has getFactSchemas() method. + TechInsightsClient now implements method getFactSchemas(). + + **BREAKING** FactSchema type moved from @backstage/plugin-tech-insights-node into @backstage/plugin-tech-insights-common + + These changes are **required** if you were importing this type directly. + + ```diff + - import { FactSchema } from '@backstage/plugin-tech-insights-node'; + + import { FactSchema } from '@backstage/plugin-tech-insights-common'; + ``` + +- Updated dependencies + - @backstage/plugin-tech-insights-common@0.2.10-next.0 + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + ## 0.3.7-next.0 ### Patch Changes diff --git a/plugins/tech-insights/api-report.md b/plugins/tech-insights/api-report.md index 2d25d6d39d..d7ae337196 100644 --- a/plugins/tech-insights/api-report.md +++ b/plugins/tech-insights/api-report.md @@ -11,6 +11,7 @@ import { BulkCheckResponse } from '@backstage/plugin-tech-insights-common'; import { CheckResult } from '@backstage/plugin-tech-insights-common'; import { CompoundEntityRef } from '@backstage/catalog-model'; import { DiscoveryApi } from '@backstage/core-plugin-api'; +import { FactSchema } from '@backstage/plugin-tech-insights-common'; import { IdentityApi } from '@backstage/core-plugin-api'; import { JsonValue } from '@backstage/types'; import { default as React_2 } from 'react'; @@ -74,6 +75,8 @@ export interface TechInsightsApi { // (undocumented) getFacts(entity: CompoundEntityRef, facts: string[]): Promise<InsightFacts>; // (undocumented) + getFactSchemas(): Promise<FactSchema[]>; + // (undocumented) runBulkChecks( entities: CompoundEntityRef[], checks?: Check[], @@ -102,6 +105,8 @@ export class TechInsightsClient implements TechInsightsApi { // (undocumented) getFacts(entity: CompoundEntityRef, facts: string[]): Promise<InsightFacts>; // (undocumented) + getFactSchemas(): Promise<FactSchema[]>; + // (undocumented) runBulkChecks( entities: CompoundEntityRef[], checks?: Check[], diff --git a/plugins/tech-insights/package.json b/plugins/tech-insights/package.json index fe815a044d..f4515d94b0 100644 --- a/plugins/tech-insights/package.json +++ b/plugins/tech-insights/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights", - "version": "0.3.7-next.0", + "version": "0.3.7-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights/src/api/TechInsightsApi.ts b/plugins/tech-insights/src/api/TechInsightsApi.ts index 166f1d2782..bb915e06dd 100644 --- a/plugins/tech-insights/src/api/TechInsightsApi.ts +++ b/plugins/tech-insights/src/api/TechInsightsApi.ts @@ -18,6 +18,7 @@ import { createApiRef } from '@backstage/core-plugin-api'; import { CheckResult, BulkCheckResponse, + FactSchema, } from '@backstage/plugin-tech-insights-common'; import { Check, InsightFacts } from './types'; import { CheckResultRenderer } from '../components/CheckResultRenderer'; @@ -49,4 +50,5 @@ export interface TechInsightsApi { checks?: Check[], ): Promise<BulkCheckResponse>; getFacts(entity: CompoundEntityRef, facts: string[]): Promise<InsightFacts>; + getFactSchemas(): Promise<FactSchema[]>; } diff --git a/plugins/tech-insights/src/api/TechInsightsClient.ts b/plugins/tech-insights/src/api/TechInsightsClient.ts index 6e85769b34..a1a2e7ff77 100644 --- a/plugins/tech-insights/src/api/TechInsightsClient.ts +++ b/plugins/tech-insights/src/api/TechInsightsClient.ts @@ -18,6 +18,7 @@ import { TechInsightsApi } from './TechInsightsApi'; import { BulkCheckResponse, CheckResult, + FactSchema, } from '@backstage/plugin-tech-insights-common'; import { Check, InsightFacts } from './types'; import { DiscoveryApi, IdentityApi } from '@backstage/core-plugin-api'; @@ -69,6 +70,10 @@ export class TechInsightsClient implements TechInsightsApi { return this.api('/checks'); } + async getFactSchemas(): Promise<FactSchema[]> { + return this.api('/fact-schemas'); + } + async runChecks( entityParams: CompoundEntityRef, checks?: string[], diff --git a/plugins/tech-radar/CHANGELOG.md b/plugins/tech-radar/CHANGELOG.md index 085aa42aa9..f6983f4875 100644 --- a/plugins/tech-radar/CHANGELOG.md +++ b/plugins/tech-radar/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-tech-radar +## 0.6.1-next.0 + +### Patch Changes + +- 18024a231c: Allow to set additional links to the entry description. +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.6.0 ### Minor Changes diff --git a/plugins/tech-radar/api-report.md b/plugins/tech-radar/api-report.md index 39fa19da43..e2744872d8 100644 --- a/plugins/tech-radar/api-report.md +++ b/plugins/tech-radar/api-report.md @@ -21,12 +21,19 @@ export interface RadarEntry { description?: string; id: string; key: string; + links?: Array<RadarEntryLink>; quadrant: string; timeline: Array<RadarEntrySnapshot>; title: string; url: string; } +// @public +export interface RadarEntryLink { + title: string; + url: string; +} + // @public export interface RadarEntrySnapshot { date: Date; diff --git a/plugins/tech-radar/package.json b/plugins/tech-radar/package.json index a7ce33c427..78b0afd963 100644 --- a/plugins/tech-radar/package.json +++ b/plugins/tech-radar/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-tech-radar", "description": "A Backstage plugin that lets you display a Tech Radar for your organization", - "version": "0.6.0", + "version": "0.6.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-radar/src/api.ts b/plugins/tech-radar/src/api.ts index c932ec98e2..0fbc88255a 100644 --- a/plugins/tech-radar/src/api.ts +++ b/plugins/tech-radar/src/api.ts @@ -89,6 +89,22 @@ export interface RadarQuadrant { name: string; } +/** + * Single link in {@link RadarEntry} + * + * @public + */ +export interface RadarEntryLink { + /** + * URL of the link + */ + url: string; + /** + * Display name of the link + */ + title: string; +} + /** * Single Entry in Tech Radar * @@ -127,6 +143,10 @@ export interface RadarEntry { * Description of the Entry */ description?: string; + /** + * User-clickable links to provide more information about the Entry + */ + links?: Array<RadarEntryLink>; } /** diff --git a/plugins/tech-radar/src/components/RadarComponent.tsx b/plugins/tech-radar/src/components/RadarComponent.tsx index 4ed7626d52..1f14e9d258 100644 --- a/plugins/tech-radar/src/components/RadarComponent.tsx +++ b/plugins/tech-radar/src/components/RadarComponent.tsx @@ -126,6 +126,7 @@ export function RadarComponent(props: TechRadarComponentProps) { moved: entry.timeline[0].moved, description: entry.description || entry.timeline[0].description, url: entry.url, + links: entry.links, })); }; diff --git a/plugins/tech-radar/src/components/RadarDescription/RadarDescription.test.tsx b/plugins/tech-radar/src/components/RadarDescription/RadarDescription.test.tsx index 7f2dcbe6ac..51fed918ec 100644 --- a/plugins/tech-radar/src/components/RadarDescription/RadarDescription.test.tsx +++ b/plugins/tech-radar/src/components/RadarDescription/RadarDescription.test.tsx @@ -24,6 +24,7 @@ const minProps: Props = { open: true, title: 'example-title', description: 'example-description', + links: [{ url: 'https://example.com/docs', title: 'example-link' }], onClose: () => {}, }; @@ -34,5 +35,6 @@ describe('RadarDescription', () => { const radarDescription = screen.getByTestId('radar-description'); expect(radarDescription).toBeInTheDocument(); expect(screen.getByText(String(minProps.description))).toBeInTheDocument(); + expect(screen.getByText(String('example-link'))).toBeInTheDocument(); }); }); diff --git a/plugins/tech-radar/src/components/RadarDescription/RadarDescription.tsx b/plugins/tech-radar/src/components/RadarDescription/RadarDescription.tsx index 302e77c1ac..92b15d985a 100644 --- a/plugins/tech-radar/src/components/RadarDescription/RadarDescription.tsx +++ b/plugins/tech-radar/src/components/RadarDescription/RadarDescription.tsx @@ -28,10 +28,18 @@ export type Props = { title: string; description: string; url?: string; + links?: Array<{ url: string; title: string }>; }; const RadarDescription = (props: Props): JSX.Element => { - const { open, onClose, title, description, url } = props; + function showDialogActions( + url: string | undefined, + links: Array<{ url: string; title: string }> | undefined, + ): Boolean { + return isValidUrl(url) || Boolean(links && links.length > 0); + } + + const { open, onClose, title, description, url, links } = props; return ( <Dialog data-testid="radar-description" open={open} onClose={onClose}> @@ -41,17 +49,32 @@ const RadarDescription = (props: Props): JSX.Element => { <DialogContent dividers> <MarkdownContent content={description} /> </DialogContent> - {isValidUrl(url) && ( + {showDialogActions(url, links) && ( <DialogActions> - <Button - component={Link} - to={url} - onClick={onClose} - color="primary" - startIcon={<LinkIcon />} - > - LEARN MORE - </Button> + {links?.map(link => ( + <Button + component={Link} + to={link.url} + onClick={onClose} + color="primary" + startIcon={<LinkIcon />} + key={link.url} + > + {link.title} + </Button> + ))} + {isValidUrl(url) && ( + <Button + component={Link} + to={url} + onClick={onClose} + color="primary" + startIcon={<LinkIcon />} + key={url} + > + LEARN MORE + </Button> + )} </DialogActions> )} </Dialog> diff --git a/plugins/tech-radar/src/components/RadarLegend/RadarLegendLink.tsx b/plugins/tech-radar/src/components/RadarLegend/RadarLegendLink.tsx index b0d9196e1e..7e31ddddd5 100644 --- a/plugins/tech-radar/src/components/RadarLegend/RadarLegendLink.tsx +++ b/plugins/tech-radar/src/components/RadarLegend/RadarLegendLink.tsx @@ -25,6 +25,7 @@ type RadarLegendLinkProps = { title?: string; classes: ClassNameMap<string>; active?: boolean; + links: Array<{ url: string; title: string }>; }; export const RadarLegendLink = ({ @@ -33,6 +34,7 @@ export const RadarLegendLink = ({ title, classes, active, + links, }: RadarLegendLinkProps) => { const [open, setOpen] = React.useState(false); @@ -73,6 +75,7 @@ export const RadarLegendLink = ({ title={title ? title : 'no title'} url={url} description={description} + links={links} /> )} </> diff --git a/plugins/tech-radar/src/components/RadarLegend/RadarLegendRing.tsx b/plugins/tech-radar/src/components/RadarLegend/RadarLegendRing.tsx index 09badecdcd..68b42373f3 100644 --- a/plugins/tech-radar/src/components/RadarLegend/RadarLegendRing.tsx +++ b/plugins/tech-radar/src/components/RadarLegend/RadarLegendRing.tsx @@ -61,6 +61,7 @@ export const RadarLegendRing = ({ title={entry.title} description={entry.description} active={entry.active} + links={entry.links ?? []} /> </li> ))} diff --git a/plugins/tech-radar/src/sample.ts b/plugins/tech-radar/src/sample.ts index 174bd7750f..1c4f7a1a01 100644 --- a/plugins/tech-radar/src/sample.ts +++ b/plugins/tech-radar/src/sample.ts @@ -45,11 +45,17 @@ entries.push({ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua', }, ], - url: '#', + url: 'https://www.javascript.com/', key: 'javascript', id: 'javascript', title: 'JavaScript', quadrant: 'languages', + links: [ + { + url: 'https://www.typescriptlang.org/', + title: 'TypeScript', + }, + ], description: 'Excepteur **sint** occaecat *cupidatat* non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\n```ts\nconst x = "3";\n```\n', }); diff --git a/plugins/tech-radar/src/utils/types.ts b/plugins/tech-radar/src/utils/types.ts index 8689b17678..047319bd9e 100644 --- a/plugins/tech-radar/src/utils/types.ts +++ b/plugins/tech-radar/src/utils/types.ts @@ -61,6 +61,7 @@ export type Entry = { title: string; // An URL to a longer description as to why this entry is where it is url?: string; + links?: Array<{ title: string; url: string }>; // How this entry has recently moved; -1 for "down", +1 for "up", 0 for not moved moved?: MovedState; // Most recent description to display in the UI diff --git a/plugins/techdocs-addons-test-utils/CHANGELOG.md b/plugins/techdocs-addons-test-utils/CHANGELOG.md index a27d587f36..bba46a23c2 100644 --- a/plugins/techdocs-addons-test-utils/CHANGELOG.md +++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-techdocs-addons-test-utils +## 1.0.10-next.1 + +### Patch Changes + +- d950d3e217: Depend on `@material-ui/core` version `^4.12.2` like all other in-repo packages +- Updated dependencies + - @backstage/plugin-techdocs@1.5.0-next.1 + - @backstage/plugin-catalog@1.8.0-next.1 + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-search-react@1.5.0-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration-react@1.1.10-next.0 + - @backstage/test-utils@1.2.5-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-techdocs-react@1.1.3-next.1 + ## 1.0.10-next.0 ### Patch Changes diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index baff541f54..82d5913a2e 100644 --- a/plugins/techdocs-addons-test-utils/package.json +++ b/plugins/techdocs-addons-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-addons-test-utils", - "version": "1.0.10-next.0", + "version": "1.0.10-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -42,7 +42,7 @@ "@backstage/plugin-techdocs-react": "workspace:^", "@backstage/test-utils": "workspace:^", "@backstage/theme": "workspace:^", - "@material-ui/core": "^4.9.13", + "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.57", "@testing-library/react": "^12.1.3", diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md index f669d1924b..04c7a54f20 100644 --- a/plugins/techdocs-backend/CHANGELOG.md +++ b/plugins/techdocs-backend/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-techdocs-backend +## 1.5.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-search-common@1.2.1 + - @backstage/plugin-techdocs-node@1.4.6-next.1 + ## 1.5.3-next.0 ### Patch Changes diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index 396aba2fca..dd16050e5d 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-backend", "description": "The Backstage backend plugin that renders technical documentation for your components", - "version": "1.5.3-next.0", + "version": "1.5.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-module-addons-contrib/CHANGELOG.md b/plugins/techdocs-module-addons-contrib/CHANGELOG.md index 0f0c2999bd..aab943c78f 100644 --- a/plugins/techdocs-module-addons-contrib/CHANGELOG.md +++ b/plugins/techdocs-module-addons-contrib/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-techdocs-module-addons-contrib +## 1.0.10-next.1 + +### Patch Changes + +- d950d3e217: Depend on `@material-ui/core` version `^4.12.2` like all other in-repo packages +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration@1.4.2 + - @backstage/integration-react@1.1.10-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-techdocs-react@1.1.3-next.1 + ## 1.0.10-next.0 ### Patch Changes diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index ae5d263268..1b92e15c16 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-module-addons-contrib", "description": "Plugin module for contributed TechDocs Addons", - "version": "1.0.10-next.0", + "version": "1.0.10-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -39,7 +39,7 @@ "@backstage/integration-react": "workspace:^", "@backstage/plugin-techdocs-react": "workspace:^", "@backstage/theme": "workspace:^", - "@material-ui/core": "^4.9.13", + "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.57", "@react-hookz/web": "^20.0.0", diff --git a/plugins/techdocs-node/CHANGELOG.md b/plugins/techdocs-node/CHANGELOG.md index 7aca6e0041..6547d5db59 100644 --- a/plugins/techdocs-node/CHANGELOG.md +++ b/plugins/techdocs-node/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-techdocs-node +## 1.4.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/integration-aws-node@0.1.1 + - @backstage/plugin-search-common@1.2.1 + ## 1.4.6-next.0 ### Patch Changes diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index fa2587953c..d9b7b72d91 100644 --- a/plugins/techdocs-node/package.json +++ b/plugins/techdocs-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-node", "description": "Common node.js functionalities for TechDocs, to be shared between techdocs-backend plugin and techdocs-cli", - "version": "1.4.6-next.0", + "version": "1.4.6-next.1", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/plugins/techdocs-react/CHANGELOG.md b/plugins/techdocs-react/CHANGELOG.md index 4f9744158d..0403406407 100644 --- a/plugins/techdocs-react/CHANGELOG.md +++ b/plugins/techdocs-react/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-techdocs-react +## 1.1.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/version-bridge@1.0.3 + ## 1.1.3-next.0 ### Patch Changes diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json index 781ba74c94..01bf2ceec4 100644 --- a/plugins/techdocs-react/package.json +++ b/plugins/techdocs-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-react", "description": "Shared frontend utilities for TechDocs and Addons", - "version": "1.1.3-next.0", + "version": "1.1.3-next.1", "publishConfig": { "access": "public", "alphaTypes": "dist/index.alpha.d.ts", diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md index 22d52c02e8..01ad074f1c 100644 --- a/plugins/techdocs/CHANGELOG.md +++ b/plugins/techdocs/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-techdocs +## 1.5.0-next.1 + +### Minor Changes + +- 20840b36b4: Update DocsTable and EntityListDocsTable to accept overrides for Material Table options. +- 0eaa579f89: The `TechDocsSearchResultListItem` component is now a search result extension. This means that when rendered as a child of components that render search extensions, the `result`, `rank`, and `highlight` properties are optional. See the [documentation](https://backstage.io/docs/features/search/how-to-guides#how-to-render-search-results-using-extensions) for more details. + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-search-react@1.5.0-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/integration-react@1.1.10-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-search-common@1.2.1 + - @backstage/plugin-techdocs-react@1.1.3-next.1 + ## 1.4.4-next.0 ### Patch Changes diff --git a/plugins/techdocs/api-report.md b/plugins/techdocs/api-report.md index d1c05f5b8e..ddc90d07bb 100644 --- a/plugins/techdocs/api-report.md +++ b/plugins/techdocs/api-report.md @@ -20,6 +20,7 @@ import { ReactNode } from 'react'; import { ResultHighlight } from '@backstage/plugin-search-common'; import { RouteRef } from '@backstage/core-plugin-api'; import { TableColumn } from '@backstage/core-components'; +import { TableOptions } from '@backstage/core-components'; import { TableProps } from '@backstage/core-components'; import { TechDocsEntityMetadata as TechDocsEntityMetadata_2 } from '@backstage/plugin-techdocs-react'; import { TechDocsMetadata as TechDocsMetadata_2 } from '@backstage/plugin-techdocs-react'; @@ -100,6 +101,7 @@ export type DocsTableProps = { loading?: boolean | undefined; columns?: TableColumn<DocsTableRow>[]; actions?: TableProps<DocsTableRow>['actions']; + options?: TableOptions<DocsTableRow>; }; // @public @@ -159,6 +161,7 @@ export const EntityListDocsTable: { export type EntityListDocsTableProps = { columns?: TableColumn<DocsTableRow>[]; actions?: TableProps<DocsTableRow>['actions']; + options?: TableOptions<DocsTableRow>; }; // @public @@ -398,12 +401,12 @@ export type TechDocsSearchProps = { // @public export const TechDocsSearchResultListItem: ( props: TechDocsSearchResultListItemProps, -) => JSX.Element; +) => JSX.Element | null; // @public export type TechDocsSearchResultListItemProps = { icon?: ReactNode; - result: any; + result?: any; highlight?: ResultHighlight; rank?: number; lineClamp?: number; diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index d04115188b..788b82cfa5 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs", "description": "The Backstage plugin that renders technical documentation for your components", - "version": "1.4.4-next.0", + "version": "1.5.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs/src/home/components/Tables/DocsTable.tsx b/plugins/techdocs/src/home/components/Tables/DocsTable.tsx index 883c496191..842c80018f 100644 --- a/plugins/techdocs/src/home/components/Tables/DocsTable.tsx +++ b/plugins/techdocs/src/home/components/Tables/DocsTable.tsx @@ -29,6 +29,7 @@ import { EmptyState, Table, TableColumn, + TableOptions, TableProps, } from '@backstage/core-components'; import { actionFactories } from './actions'; @@ -47,6 +48,7 @@ export type DocsTableProps = { loading?: boolean | undefined; columns?: TableColumn<DocsTableRow>[]; actions?: TableProps<DocsTableRow>['actions']; + options?: TableOptions<DocsTableRow>; }; /** @@ -55,7 +57,7 @@ export type DocsTableProps = { * @public */ export const DocsTable = (props: DocsTableProps) => { - const { entities, title, loading, columns, actions } = props; + const { entities, title, loading, columns, actions, options } = props; const [, copyToClipboard] = useCopyToClipboard(); const getRouteToReaderPageFor = useRouteRef(rootDocsRouteRef); const config = useApi(configApiRef); @@ -102,6 +104,7 @@ export const DocsTable = (props: DocsTableProps) => { pageSize: 20, search: true, actionsColumnIndex: -1, + ...options, }} data={documents} columns={columns || defaultColumns} diff --git a/plugins/techdocs/src/home/components/Tables/EntityListDocsTable.tsx b/plugins/techdocs/src/home/components/Tables/EntityListDocsTable.tsx index d47ddb13c4..0042cc9418 100644 --- a/plugins/techdocs/src/home/components/Tables/EntityListDocsTable.tsx +++ b/plugins/techdocs/src/home/components/Tables/EntityListDocsTable.tsx @@ -20,6 +20,7 @@ import { capitalize } from 'lodash'; import { CodeSnippet, TableColumn, + TableOptions, TableProps, WarningPanel, } from '@backstage/core-components'; @@ -40,6 +41,7 @@ import { DocsTableRow } from './types'; export type EntityListDocsTableProps = { columns?: TableColumn<DocsTableRow>[]; actions?: TableProps<DocsTableRow>['actions']; + options?: TableOptions<DocsTableRow>; }; /** @@ -48,7 +50,7 @@ export type EntityListDocsTableProps = { * @public */ export const EntityListDocsTable = (props: EntityListDocsTableProps) => { - const { columns, actions } = props; + const { columns, actions, options } = props; const { loading, error, entities, filters } = useEntityList(); const { isStarredEntity, toggleStarredEntity } = useStarredEntities(); const [, copyToClipboard] = useCopyToClipboard(); @@ -81,6 +83,7 @@ export const EntityListDocsTable = (props: EntityListDocsTableProps) => { loading={loading} actions={actions || defaultActions} columns={columns} + options={options} /> ); }; diff --git a/plugins/techdocs/src/index.ts b/plugins/techdocs/src/index.ts index 13b71d49ed..c759d43fe9 100644 --- a/plugins/techdocs/src/index.ts +++ b/plugins/techdocs/src/index.ts @@ -37,11 +37,14 @@ export { TechDocsIndexPage, TechdocsPage, TechDocsReaderPage, + TechDocsSearchResultListItem, techdocsPlugin as plugin, techdocsPlugin, } from './plugin'; export * from './Router'; +export type { TechDocsSearchResultListItemProps } from './search/components/TechDocsSearchResultListItem'; + /** * @deprecated Import from `@backstage/plugin-techdocs-react` instead * diff --git a/plugins/techdocs/src/plugin.ts b/plugins/techdocs/src/plugin.ts index 4ad8b98e37..331eefe121 100644 --- a/plugins/techdocs/src/plugin.ts +++ b/plugins/techdocs/src/plugin.ts @@ -33,6 +33,8 @@ import { fetchApiRef, identityApiRef, } from '@backstage/core-plugin-api'; +import { createSearchResultListItemExtension } from '@backstage/plugin-search-react'; +import { TechDocsSearchResultListItemProps } from './search/components/TechDocsSearchResultListItem'; /** * The Backstage plugin that renders technical documentation for your components @@ -153,3 +155,21 @@ export const TechDocsReaderPage = techdocsPlugin.provide( mountPoint: rootDocsRouteRef, }), ); + +/** + * React extension used to render results on Search page or modal + * + * @public + */ +export const TechDocsSearchResultListItem: ( + props: TechDocsSearchResultListItemProps, +) => JSX.Element | null = techdocsPlugin.provide( + createSearchResultListItemExtension({ + name: 'TechDocsSearchResultListItem', + component: () => + import('./search/components/TechDocsSearchResultListItem').then( + m => m.TechDocsSearchResultListItem, + ), + predicate: result => result.type === 'techdocs', + }), +); diff --git a/plugins/techdocs/src/search/components/TechDocsSearchResultListItem.tsx b/plugins/techdocs/src/search/components/TechDocsSearchResultListItem.tsx index 800fba2260..f058fd0a9e 100644 --- a/plugins/techdocs/src/search/components/TechDocsSearchResultListItem.tsx +++ b/plugins/techdocs/src/search/components/TechDocsSearchResultListItem.tsx @@ -24,7 +24,6 @@ import { } from '@material-ui/core'; import Typography from '@material-ui/core/Typography'; import { Link } from '@backstage/core-components'; -import { useAnalytics } from '@backstage/core-plugin-api'; import { ResultHighlight } from '@backstage/plugin-search-common'; import { HighlightedSearchResultText } from '@backstage/plugin-search-react'; @@ -45,7 +44,7 @@ const useStyles = makeStyles({ */ export type TechDocsSearchResultListItemProps = { icon?: ReactNode; - result: any; + result?: any; highlight?: ResultHighlight; rank?: number; lineClamp?: number; @@ -65,7 +64,6 @@ export const TechDocsSearchResultListItem = ( const { result, highlight, - rank, lineClamp = 5, asListItem = true, asLink = true, @@ -74,17 +72,9 @@ export const TechDocsSearchResultListItem = ( } = props; const classes = useStyles(); - const analytics = useAnalytics(); - const handleClick = () => { - analytics.captureEvent('discover', result.title, { - attributes: { to: result.location }, - value: rank, - }); - }; - const LinkWrapper = ({ children }: PropsWithChildren<{}>) => asLink ? ( - <Link noTrack to={result.location} onClick={handleClick}> + <Link noTrack to={result.location}> {children} </Link> ) : ( @@ -122,6 +112,8 @@ export const TechDocsSearchResultListItem = ( result.name ); + if (!result) return null; + return ( <ListItemText className={classes.itemText} diff --git a/plugins/techdocs/src/search/components/index.ts b/plugins/techdocs/src/search/components/index.ts index 1f7615b4ff..c70681fc53 100644 --- a/plugins/techdocs/src/search/components/index.ts +++ b/plugins/techdocs/src/search/components/index.ts @@ -14,5 +14,4 @@ * limitations under the License. */ -export * from './TechDocsSearchResultListItem'; export * from './TechDocsSearch'; diff --git a/plugins/todo-backend/CHANGELOG.md b/plugins/todo-backend/CHANGELOG.md index ae9ec851f0..5009bb66b1 100644 --- a/plugins/todo-backend/CHANGELOG.md +++ b/plugins/todo-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-todo-backend +## 0.1.39-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + ## 0.1.39-next.0 ### Patch Changes diff --git a/plugins/todo-backend/package.json b/plugins/todo-backend/package.json index 3fbc52bb70..b7eae2bf52 100644 --- a/plugins/todo-backend/package.json +++ b/plugins/todo-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-todo-backend", "description": "A Backstage backend plugin that lets you browse TODO comments in your source code", - "version": "0.1.39-next.0", + "version": "0.1.39-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/todo/CHANGELOG.md b/plugins/todo/CHANGELOG.md index fa5fb5064b..c5ef6bddfa 100644 --- a/plugins/todo/CHANGELOG.md +++ b/plugins/todo/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-todo +## 0.2.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + ## 0.2.17-next.0 ### Patch Changes diff --git a/plugins/todo/package.json b/plugins/todo/package.json index 00ea5873d6..a6ed7e591e 100644 --- a/plugins/todo/package.json +++ b/plugins/todo/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-todo", "description": "A Backstage plugin that lets you browse TODO comments in your source code", - "version": "0.2.17-next.0", + "version": "0.2.17-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/user-settings-backend/CHANGELOG.md b/plugins/user-settings-backend/CHANGELOG.md index 90069ca40c..25d3b6b935 100644 --- a/plugins/user-settings-backend/CHANGELOG.md +++ b/plugins/user-settings-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-user-settings-backend +## 0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.11-next.1 + ## 0.1.6-next.0 ### Patch Changes diff --git a/plugins/user-settings-backend/package.json b/plugins/user-settings-backend/package.json index f69f13bcee..8197078d74 100644 --- a/plugins/user-settings-backend/package.json +++ b/plugins/user-settings-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-user-settings-backend", "description": "The Backstage backend plugin to manage user settings", - "version": "0.1.6-next.0", + "version": "0.1.6-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/user-settings/CHANGELOG.md b/plugins/user-settings/CHANGELOG.md index aa64c91086..51de164e53 100644 --- a/plugins/user-settings/CHANGELOG.md +++ b/plugins/user-settings/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-user-settings +## 0.6.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + ## 0.6.3-next.0 ### Patch Changes diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index 64f1cdd8d3..ad046124c4 100644 --- a/plugins/user-settings/package.json +++ b/plugins/user-settings/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-user-settings", "description": "A Backstage plugin that provides a settings page", - "version": "0.6.3-next.0", + "version": "0.6.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/vault-backend/CHANGELOG.md b/plugins/vault-backend/CHANGELOG.md index e81269ec17..d81f582d2c 100644 --- a/plugins/vault-backend/CHANGELOG.md +++ b/plugins/vault-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-vault-backend +## 0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/backend-test-utils@0.1.34-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + ## 0.2.8-next.0 ### Patch Changes diff --git a/plugins/vault-backend/package.json b/plugins/vault-backend/package.json index 507c2c5713..58a16853e6 100644 --- a/plugins/vault-backend/package.json +++ b/plugins/vault-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-vault-backend", "description": "A Backstage backend plugin that integrates towards Vault", - "version": "0.2.8-next.0", + "version": "0.2.8-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/vault/CHANGELOG.md b/plugins/vault/CHANGELOG.md index 5ea984e2ef..7e661f0a8a 100644 --- a/plugins/vault/CHANGELOG.md +++ b/plugins/vault/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-vault +## 0.1.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + ## 0.1.9-next.0 ### Patch Changes diff --git a/plugins/vault/package.json b/plugins/vault/package.json index 26376c18d5..9d59cba50a 100644 --- a/plugins/vault/package.json +++ b/plugins/vault/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-vault", "description": "A Backstage plugin that integrates towards Vault", - "version": "0.1.9-next.0", + "version": "0.1.9-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/xcmetrics/CHANGELOG.md b/plugins/xcmetrics/CHANGELOG.md index 4d80489e99..e73dbc7e64 100644 --- a/plugins/xcmetrics/CHANGELOG.md +++ b/plugins/xcmetrics/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-xcmetrics +## 0.2.35-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + ## 0.2.34 ### Patch Changes diff --git a/plugins/xcmetrics/package.json b/plugins/xcmetrics/package.json index f4144693ae..fc85d7b050 100644 --- a/plugins/xcmetrics/package.json +++ b/plugins/xcmetrics/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-xcmetrics", "description": "A Backstage plugin that shows XCode build metrics for your components", - "version": "0.2.34", + "version": "0.2.35-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/storybook/yarn.lock b/storybook/yarn.lock index c1ece03aac..7c73f5d0cc 100644 --- a/storybook/yarn.lock +++ b/storybook/yarn.lock @@ -1801,17 +1801,17 @@ __metadata: linkType: hard "@storybook/addon-a11y@npm:^6.5.9": - version: 6.5.15 - resolution: "@storybook/addon-a11y@npm:6.5.15" + version: 6.5.16 + resolution: "@storybook/addon-a11y@npm:6.5.16" dependencies: - "@storybook/addons": 6.5.15 - "@storybook/api": 6.5.15 - "@storybook/channels": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/components": 6.5.15 - "@storybook/core-events": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/api": 6.5.16 + "@storybook/channels": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/components": 6.5.16 + "@storybook/core-events": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/theming": 6.5.15 + "@storybook/theming": 6.5.16 axe-core: ^4.2.0 core-js: ^3.8.2 global: ^4.4.0 @@ -1828,21 +1828,21 @@ __metadata: optional: true react-dom: optional: true - checksum: 409e1393f655099b199dd3ba279d926b42d11ca8ce37255eec1e5d6ed3526cae559cd02d3485b70023846c3430b41630c2b6e14ed288580fcce00a12c34f7fcb + checksum: 05ce7f696254782b521a5e946f7d58b207d854e69ce8b624a14de0192ce558f640b9dae821e122911059a24d2f9907e783e8dce5fb9288d5cfbdf0833aaab503 languageName: node linkType: hard "@storybook/addon-actions@npm:^6.5.9": - version: 6.5.15 - resolution: "@storybook/addon-actions@npm:6.5.15" + version: 6.5.16 + resolution: "@storybook/addon-actions@npm:6.5.16" dependencies: - "@storybook/addons": 6.5.15 - "@storybook/api": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/components": 6.5.15 - "@storybook/core-events": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/api": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/components": 6.5.16 + "@storybook/core-events": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/theming": 6.5.15 + "@storybook/theming": 6.5.16 core-js: ^3.8.2 fast-deep-equal: ^3.1.3 global: ^4.4.0 @@ -1863,23 +1863,23 @@ __metadata: optional: true react-dom: optional: true - checksum: ce0ca5fddeb196adec7757dd287085c19d89d26506539d07445df3759eca9817a779f2923cc5fd7dfc9f515788628f6c0f604b10366659ca46562fab980c64f5 + checksum: d506a932f38412fc234cd58b5f2c8a0bfb8f3820b0ce8042234e9bf4bd277a2befc2d8458d061405ee72722206756375f471a22c37ea32f384259fcbb1a2b6a5 languageName: node linkType: hard "@storybook/addon-controls@npm:^6.5.9": - version: 6.5.15 - resolution: "@storybook/addon-controls@npm:6.5.15" + version: 6.5.16 + resolution: "@storybook/addon-controls@npm:6.5.16" dependencies: - "@storybook/addons": 6.5.15 - "@storybook/api": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/components": 6.5.15 - "@storybook/core-common": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/api": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/components": 6.5.16 + "@storybook/core-common": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/node-logger": 6.5.15 - "@storybook/store": 6.5.15 - "@storybook/theming": 6.5.15 + "@storybook/node-logger": 6.5.16 + "@storybook/store": 6.5.16 + "@storybook/theming": 6.5.16 core-js: ^3.8.2 lodash: ^4.17.21 ts-dedent: ^2.0.0 @@ -1891,19 +1891,19 @@ __metadata: optional: true react-dom: optional: true - checksum: c87b01e035f7e0e6f3a1e864333c03e44f76ccd04a687cbe19cde59cfa1109eb2b124c288e1cf68c3a291dc6c28c056852aa2413c8157b92792ef339a33142ef + checksum: a9f1f577e5d991ae271c9823662adf65952554303094a2e0127bfe9d48e2415796628dadc3cfbc767600e21588336bfd9cb43da59fe76507b2186f6a61da34b8 languageName: node linkType: hard "@storybook/addon-links@npm:^6.5.9": - version: 6.5.15 - resolution: "@storybook/addon-links@npm:6.5.15" + version: 6.5.16 + resolution: "@storybook/addon-links@npm:6.5.16" dependencies: - "@storybook/addons": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/core-events": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/core-events": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/router": 6.5.15 + "@storybook/router": 6.5.16 "@types/qs": ^6.9.5 core-js: ^3.8.2 global: ^4.4.0 @@ -1919,21 +1919,21 @@ __metadata: optional: true react-dom: optional: true - checksum: ef40b02a3f48de2f591486fb04910e996bcb8d5fd406e2d6b81752659551b366ffc64f6cfdb461585e52c0ae98fa102be8595678e63a27171f9e2a0e20869bd6 + checksum: 40fa5fcd98df3be50b3587efda79ddf0156eb0078dd0afec43e81e961475bc8583feec1314baabe59fe2dc8e5b9b4bb4a738435172c208f828d1538cd59882fe languageName: node linkType: hard "@storybook/addon-storysource@npm:^6.5.9": - version: 6.5.15 - resolution: "@storybook/addon-storysource@npm:6.5.15" + version: 6.5.16 + resolution: "@storybook/addon-storysource@npm:6.5.16" dependencies: - "@storybook/addons": 6.5.15 - "@storybook/api": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/components": 6.5.15 - "@storybook/router": 6.5.15 - "@storybook/source-loader": 6.5.15 - "@storybook/theming": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/api": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/components": 6.5.16 + "@storybook/router": 6.5.16 + "@storybook/source-loader": 6.5.16 + "@storybook/theming": 6.5.16 core-js: ^3.8.2 estraverse: ^5.2.0 loader-utils: ^2.0.4 @@ -1948,7 +1948,7 @@ __metadata: optional: true react-dom: optional: true - checksum: e501c78ad8224b07a15fd8626399ebc63f131feb615ad6c6a3d6a7eac320b8fd01ec74d7406e8422c224771dfca17cfa159816b272e9f635e07dd67a8b4f8cb8 + checksum: 0e614542c99a0470c8b70881f2f5bd41f0d0f6e94c99b4efc2be9ff757a8021d00a4adc9e80c0c85dbdb3fe89f244fdf5633b0f0017fe565f81a7bde42dc96d2 languageName: node linkType: hard @@ -1974,17 +1974,17 @@ __metadata: languageName: node linkType: hard -"@storybook/addons@npm:6.5.15, @storybook/addons@npm:^6.0.0, @storybook/addons@npm:^6.5.9": - version: 6.5.15 - resolution: "@storybook/addons@npm:6.5.15" +"@storybook/addons@npm:6.5.16, @storybook/addons@npm:^6.0.0, @storybook/addons@npm:^6.5.9": + version: 6.5.16 + resolution: "@storybook/addons@npm:6.5.16" dependencies: - "@storybook/api": 6.5.15 - "@storybook/channels": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/core-events": 6.5.15 + "@storybook/api": 6.5.16 + "@storybook/channels": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/core-events": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/router": 6.5.15 - "@storybook/theming": 6.5.15 + "@storybook/router": 6.5.16 + "@storybook/theming": 6.5.16 "@types/webpack-env": ^1.16.0 core-js: ^3.8.2 global: ^4.4.0 @@ -1992,7 +1992,7 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 9de4cb9ff51cde37c456a0315f47c751daf4412a8d90321b5249a9b05f48a44dc48f01bbf83c9f369f63232da423d58ed47e4c03d50d16a8835d372022095b70 + checksum: 0463150e4cf7bd2b2aaafdbaadfb4420e4e0a31eb651cfc1a2d7f4b4974caf67878712602474585dfa18f583000608598045594909959d2e9e2ec32ba004392d languageName: node linkType: hard @@ -2024,17 +2024,17 @@ __metadata: languageName: node linkType: hard -"@storybook/api@npm:6.5.15, @storybook/api@npm:^6.0.0": - version: 6.5.15 - resolution: "@storybook/api@npm:6.5.15" +"@storybook/api@npm:6.5.16, @storybook/api@npm:^6.0.0": + version: 6.5.16 + resolution: "@storybook/api@npm:6.5.16" dependencies: - "@storybook/channels": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/core-events": 6.5.15 + "@storybook/channels": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/core-events": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/router": 6.5.15 + "@storybook/router": 6.5.16 "@storybook/semver": ^7.3.2 - "@storybook/theming": 6.5.15 + "@storybook/theming": 6.5.16 core-js: ^3.8.2 fast-deep-equal: ^3.1.3 global: ^4.4.0 @@ -2048,31 +2048,31 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: cebf1b70309c9c4a135c4ad8d3ebd85d01cfa4942e43231831e67514604199d3ed26395bbe0f89954718498a800085bd7d6eaef61c5d702e3a669532a227bd93 + checksum: c873189ac1e501825d647903baa125899c492cee962cb86ebb7455110bd09194eeb6943f5c58a1f808ce4ee2e20e305f5604a4e60b07003c82a6fc6ceaee5ea9 languageName: node linkType: hard -"@storybook/builder-webpack4@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/builder-webpack4@npm:6.5.15" +"@storybook/builder-webpack4@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/builder-webpack4@npm:6.5.16" dependencies: "@babel/core": ^7.12.10 - "@storybook/addons": 6.5.15 - "@storybook/api": 6.5.15 - "@storybook/channel-postmessage": 6.5.15 - "@storybook/channels": 6.5.15 - "@storybook/client-api": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/components": 6.5.15 - "@storybook/core-common": 6.5.15 - "@storybook/core-events": 6.5.15 - "@storybook/node-logger": 6.5.15 - "@storybook/preview-web": 6.5.15 - "@storybook/router": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/api": 6.5.16 + "@storybook/channel-postmessage": 6.5.16 + "@storybook/channels": 6.5.16 + "@storybook/client-api": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/components": 6.5.16 + "@storybook/core-common": 6.5.16 + "@storybook/core-events": 6.5.16 + "@storybook/node-logger": 6.5.16 + "@storybook/preview-web": 6.5.16 + "@storybook/router": 6.5.16 "@storybook/semver": ^7.3.2 - "@storybook/store": 6.5.15 - "@storybook/theming": 6.5.15 - "@storybook/ui": 6.5.15 + "@storybook/store": 6.5.16 + "@storybook/theming": 6.5.16 + "@storybook/ui": 6.5.16 "@types/node": ^14.0.10 || ^16.0.0 "@types/webpack": ^4.41.26 autoprefixer: ^9.8.6 @@ -2109,30 +2109,30 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: bd676e9302d34445884376582c5d4cfe854ed8e64a9df6bbdcc76ef433534e65a23b1bf20c7225e85d21a27e1f1d905d0accd821fdef08afcd76569a8c8977c2 + checksum: 5e9137c390db00b4e166df3ca730eb1748f6bac92c841f3f75c37ad5277d6f5565f899de3bb0357fc51ce6821c8a8a8adba724e3dd7a3d1cc80816e09e5b7128 languageName: node linkType: hard "@storybook/builder-webpack5@npm:^6.5.9": - version: 6.5.15 - resolution: "@storybook/builder-webpack5@npm:6.5.15" + version: 6.5.16 + resolution: "@storybook/builder-webpack5@npm:6.5.16" dependencies: "@babel/core": ^7.12.10 - "@storybook/addons": 6.5.15 - "@storybook/api": 6.5.15 - "@storybook/channel-postmessage": 6.5.15 - "@storybook/channels": 6.5.15 - "@storybook/client-api": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/components": 6.5.15 - "@storybook/core-common": 6.5.15 - "@storybook/core-events": 6.5.15 - "@storybook/node-logger": 6.5.15 - "@storybook/preview-web": 6.5.15 - "@storybook/router": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/api": 6.5.16 + "@storybook/channel-postmessage": 6.5.16 + "@storybook/channels": 6.5.16 + "@storybook/client-api": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/components": 6.5.16 + "@storybook/core-common": 6.5.16 + "@storybook/core-events": 6.5.16 + "@storybook/node-logger": 6.5.16 + "@storybook/preview-web": 6.5.16 + "@storybook/router": 6.5.16 "@storybook/semver": ^7.3.2 - "@storybook/store": 6.5.15 - "@storybook/theming": 6.5.15 + "@storybook/store": 6.5.16 + "@storybook/theming": 6.5.16 "@types/node": ^14.0.10 || ^16.0.0 babel-loader: ^8.0.0 babel-plugin-named-exports-order: ^0.0.2 @@ -2161,35 +2161,35 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 9bde333540c41c55e7687b1230fdd92926074df1a3be900b969d6d9eea240fb962b6fafb59e5c3fe83eeb42e0f0c835d2e226fc332f460f8aba0f4f49d833ffd + checksum: 0a6631f307c5ac56423860216d42ed95757906b004e949ed3dc2cce4f81d83d38de5cddbae65a0e65083eece6e4e8af05f6aabf5d78a80a7a7f62cf157a4e577 languageName: node linkType: hard -"@storybook/channel-postmessage@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/channel-postmessage@npm:6.5.15" +"@storybook/channel-postmessage@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/channel-postmessage@npm:6.5.16" dependencies: - "@storybook/channels": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/core-events": 6.5.15 + "@storybook/channels": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/core-events": 6.5.16 core-js: ^3.8.2 global: ^4.4.0 qs: ^6.10.0 telejson: ^6.0.8 - checksum: 7a09ba5bf163f8f5fef0bfd99eaab6c6391fa854e86bb44fcd0586bb73dd4ab5827cc23b7b38f993b81cbdb2ff8d58f81371be9301ddb3ea6f963ba560a42f09 + checksum: d3560d81dbf4710cc23b227c12be328d87e627581afcb5fec959f1e795fb2b5824db2a7f03a4ddcd185ec9a37a7025415d8bb43b7a245f2466395908eb3e9bc3 languageName: node linkType: hard -"@storybook/channel-websocket@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/channel-websocket@npm:6.5.15" +"@storybook/channel-websocket@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/channel-websocket@npm:6.5.16" dependencies: - "@storybook/channels": 6.5.15 - "@storybook/client-logger": 6.5.15 + "@storybook/channels": 6.5.16 + "@storybook/client-logger": 6.5.16 core-js: ^3.8.2 global: ^4.4.0 telejson: ^6.0.8 - checksum: c482b18b28f06644f684ed2b88ab53d6c5853925343e60a50a9bcfb2888123c4accfe30b51743905693e4d73c32c77e30d6dbaba377b486bee6e51faae39cf85 + checksum: 355c85f22d7cc65764871852debe347c43c3fe92d6a0caa64aecbe2dce78d4bf73b98e997099f9e4e7c204ad5821b979939b0700e446fa26478c1e1ba48e7380 languageName: node linkType: hard @@ -2204,28 +2204,28 @@ __metadata: languageName: node linkType: hard -"@storybook/channels@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/channels@npm:6.5.15" +"@storybook/channels@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/channels@npm:6.5.16" dependencies: core-js: ^3.8.2 ts-dedent: ^2.0.0 util-deprecate: ^1.0.2 - checksum: 7963c34246b3cc84bb6fb0965834110d9b839a5c32cced0756948e4e88fb8bf23a0d584723abbab6d30a6282fa1023017bb82eba68c23389652c77d8d33cb4f9 + checksum: 3d7f7bc19ed7b250976e00e02ab544408806b439106bed18a5db9815612f6c5df9bdf7c1a97b5a40ba3194184ebe7e4c75e2bca5496025d6b26afefa95cfccbd languageName: node linkType: hard -"@storybook/client-api@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/client-api@npm:6.5.15" +"@storybook/client-api@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/client-api@npm:6.5.16" dependencies: - "@storybook/addons": 6.5.15 - "@storybook/channel-postmessage": 6.5.15 - "@storybook/channels": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/core-events": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/channel-postmessage": 6.5.16 + "@storybook/channels": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/core-events": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/store": 6.5.15 + "@storybook/store": 6.5.16 "@types/qs": ^6.9.5 "@types/webpack-env": ^1.16.0 core-js: ^3.8.2 @@ -2242,7 +2242,7 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 0c3b3f7febe16b00beb4aeafe79fd97cc4a6b4db868e37002856fc34878bc955336929362b3015ba1688b47131ca0b729c94ee70f69855da0e819dad6d48ee1b + checksum: a62276fa67d2c3cc766ea9145d3798c0c8ef3f9de9fb18e7c43d67e39226f47a2546c4319ccc6075545df65dc4fc65bdb97e904062daf426be6534767eacada6 languageName: node linkType: hard @@ -2256,23 +2256,23 @@ __metadata: languageName: node linkType: hard -"@storybook/client-logger@npm:6.5.15, @storybook/client-logger@npm:^6.4.0": - version: 6.5.15 - resolution: "@storybook/client-logger@npm:6.5.15" +"@storybook/client-logger@npm:6.5.16, @storybook/client-logger@npm:^6.4.0": + version: 6.5.16 + resolution: "@storybook/client-logger@npm:6.5.16" dependencies: core-js: ^3.8.2 global: ^4.4.0 - checksum: cee16aea089b60b33ad643bde5e0d62274230d38e2033f0bfd0780fc092bc24b5acff63a6c569c9db989e59b89518ec964d0665a51548450716c4c50d3a3e66e + checksum: 0a86959b1bacb1b893e282173b48afe9c857b8cdc67a47ad87a7f11ba7dbc15ebc4f0d05c07dffb988e0cd3e1de0f09f300ee06c66afe4c50e9be83aaed75971 languageName: node linkType: hard -"@storybook/components@npm:6.5.15, @storybook/components@npm:^6.0.0": - version: 6.5.15 - resolution: "@storybook/components@npm:6.5.15" +"@storybook/components@npm:6.5.16, @storybook/components@npm:^6.0.0": + version: 6.5.16 + resolution: "@storybook/components@npm:6.5.16" dependencies: - "@storybook/client-logger": 6.5.15 + "@storybook/client-logger": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/theming": 6.5.15 + "@storybook/theming": 6.5.16 core-js: ^3.8.2 memoizerific: ^1.11.3 qs: ^6.10.0 @@ -2281,24 +2281,24 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: c405643a002b7770567aba3f0e43cad975fbb0f728148f82c46c35b13958d3f6900eed619a60f22c0ee923c20828026d5f1c77cd950d21ebfd6cf57f8e64f791 + checksum: 1caf822bf1293ca043822f1c77f05c0f01631e8a61adad6bc4651ba9be78c8f4822ba0905e39c8feaa3fb44ae10422e9ccd3004348b18531fb82c54cfcea4fa9 languageName: node linkType: hard -"@storybook/core-client@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/core-client@npm:6.5.15" +"@storybook/core-client@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/core-client@npm:6.5.16" dependencies: - "@storybook/addons": 6.5.15 - "@storybook/channel-postmessage": 6.5.15 - "@storybook/channel-websocket": 6.5.15 - "@storybook/client-api": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/core-events": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/channel-postmessage": 6.5.16 + "@storybook/channel-websocket": 6.5.16 + "@storybook/client-api": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/core-events": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/preview-web": 6.5.15 - "@storybook/store": 6.5.15 - "@storybook/ui": 6.5.15 + "@storybook/preview-web": 6.5.16 + "@storybook/store": 6.5.16 + "@storybook/ui": 6.5.16 airbnb-js-shims: ^2.2.1 ansi-to-html: ^0.6.11 core-js: ^3.8.2 @@ -2316,13 +2316,13 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 60f03d031fa87a1a116b0ccbffd2270b8d28757d89c17af6eb368224603dfd0d219fd5ac086bf859cb8bda0f80b444195c7df94c4486107b9c5a6fbab29c65ac + checksum: 467710777ddd740c431cf65035ecc489daae2fc5f4844a40b7339b806535e239140f40442a0e1d89356e107169c39d9e84d726c01982ed4609c043b6861e0778 languageName: node linkType: hard -"@storybook/core-common@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/core-common@npm:6.5.15" +"@storybook/core-common@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/core-common@npm:6.5.16" dependencies: "@babel/core": ^7.12.10 "@babel/plugin-proposal-class-properties": ^7.12.1 @@ -2346,7 +2346,7 @@ __metadata: "@babel/preset-react": ^7.12.10 "@babel/preset-typescript": ^7.12.7 "@babel/register": ^7.12.1 - "@storybook/node-logger": 6.5.15 + "@storybook/node-logger": 6.5.16 "@storybook/semver": ^7.3.2 "@types/node": ^14.0.10 || ^16.0.0 "@types/pretty-hrtime": ^1.0.0 @@ -2363,7 +2363,7 @@ __metadata: glob: ^7.1.6 handlebars: ^4.7.7 interpret: ^2.2.0 - json5: ^2.1.3 + json5: ^2.2.3 lazy-universal-dotenv: ^3.0.1 picomatch: ^2.3.0 pkg-dir: ^5.0.0 @@ -2380,7 +2380,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 9c19c348137bea23295ff330d3a62d3551b6a8a2933f254f3f1cace4ef05e46b6c97e0cbca67cc5be45164e223d5ff52eced54b76564891c8a2dd085e3be4cc4 + checksum: 886a701876599939950c3c98e306b373cd026c7b995ca08d88475b3f35624a53763459d6b202728ec703e99126813a254b956c2d0fe7e85f99dcb5765a999b19 languageName: node linkType: hard @@ -2393,31 +2393,31 @@ __metadata: languageName: node linkType: hard -"@storybook/core-events@npm:6.5.15, @storybook/core-events@npm:^6.0.0": - version: 6.5.15 - resolution: "@storybook/core-events@npm:6.5.15" +"@storybook/core-events@npm:6.5.16, @storybook/core-events@npm:^6.0.0": + version: 6.5.16 + resolution: "@storybook/core-events@npm:6.5.16" dependencies: core-js: ^3.8.2 - checksum: 89916720933bc4de0b1f25c7cb1b8580d3cdd213b21a360f18ebd0b790cce2c641696282fee29bbc482ab2cc656271b2f0569f79559d90fb01fb16473421e79e + checksum: 1844bdabfb7828af7ddd54129fbb321bf65d8b65459eaac99c8f3f94c7c2f0ee000468362758076444083f863a3bc835ecd1e4f2128524eb5c00c8a576473bc9 languageName: node linkType: hard -"@storybook/core-server@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/core-server@npm:6.5.15" +"@storybook/core-server@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/core-server@npm:6.5.16" dependencies: "@discoveryjs/json-ext": ^0.5.3 - "@storybook/builder-webpack4": 6.5.15 - "@storybook/core-client": 6.5.15 - "@storybook/core-common": 6.5.15 - "@storybook/core-events": 6.5.15 + "@storybook/builder-webpack4": 6.5.16 + "@storybook/core-client": 6.5.16 + "@storybook/core-common": 6.5.16 + "@storybook/core-events": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/csf-tools": 6.5.15 - "@storybook/manager-webpack4": 6.5.15 - "@storybook/node-logger": 6.5.15 + "@storybook/csf-tools": 6.5.16 + "@storybook/manager-webpack4": 6.5.16 + "@storybook/node-logger": 6.5.16 "@storybook/semver": ^7.3.2 - "@storybook/store": 6.5.15 - "@storybook/telemetry": 6.5.15 + "@storybook/store": 6.5.16 + "@storybook/telemetry": 6.5.16 "@types/node": ^14.0.10 || ^16.0.0 "@types/node-fetch": ^2.5.7 "@types/pretty-hrtime": ^1.0.0 @@ -2461,16 +2461,16 @@ __metadata: optional: true typescript: optional: true - checksum: 927085bd6e2c9cf756795760c5647ed5b40151e94a192e64313091fda8a06993541ecabb9c730cb01eb8baef0613b73ff63824812cfd7b8bbed3fd2ead8d1f18 + checksum: 2027adba39b2e0a5c3664241f48ec256a92866755aace96f3b8e2064b50237bbcd4e814bc58a1084006baae41c48d7d0eccefc9867d84e17d68d7f969e65f149 languageName: node linkType: hard -"@storybook/core@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/core@npm:6.5.15" +"@storybook/core@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/core@npm:6.5.16" dependencies: - "@storybook/core-client": 6.5.15 - "@storybook/core-server": 6.5.15 + "@storybook/core-client": 6.5.16 + "@storybook/core-server": 6.5.16 peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -2482,13 +2482,13 @@ __metadata: optional: true typescript: optional: true - checksum: a7eca427b14a9c1f557d598e7ac599dc120d382d3d762437b3b6ebb4638b19a74e48f9e8e526365951ec623d10b82d67279226d7e6ff54ac095afee02992e666 + checksum: f1732338741692007230a351419ef3aa4e387810d7d0c0e6ffb1159e1de4d757199f2b543cf4f6413fc40acda514b908d2fd9b3e0d56e3f6cec1e3a82c2fcc10 languageName: node linkType: hard -"@storybook/csf-tools@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/csf-tools@npm:6.5.15" +"@storybook/csf-tools@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/csf-tools@npm:6.5.16" dependencies: "@babel/core": ^7.12.10 "@babel/generator": ^7.12.11 @@ -2509,7 +2509,7 @@ __metadata: peerDependenciesMeta: "@storybook/mdx2-csf": optional: true - checksum: d7faafd175b232bb8fa6008ae6db5a40619a158ed7556686649dee665ac0cbbdb3cc404d2b9c0314ba7783c3f5baf1d87788f324d24136bd0f8cc671d573208b + checksum: ee71a47d90186c35fc1dbcb6ece2888ff4d730bde823bb1bd242d802b74045b482d2c469f3a91687b691b6f828ce449b182896d1912033846b9746457ee960ba languageName: node linkType: hard @@ -2522,18 +2522,18 @@ __metadata: languageName: node linkType: hard -"@storybook/docs-tools@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/docs-tools@npm:6.5.15" +"@storybook/docs-tools@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/docs-tools@npm:6.5.16" dependencies: "@babel/core": ^7.12.10 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/store": 6.5.15 + "@storybook/store": 6.5.16 core-js: ^3.8.2 doctrine: ^3.0.0 lodash: ^4.17.21 regenerator-runtime: ^0.13.7 - checksum: 051239a82cff47dbc52fae112c4c144d6e103cbb169c239b0a99fb0cb3e82fba2e460c9487469fafc19ee81ef2ecc33d59b05457c3c74375685de0f537460071 + checksum: 6351c5b1cbe5820f0f0dfcc3e4e7da8cca3c8d73a06c5803e65cb86e9e81ccbae53cec8e1b579af0ac9a5bbb6d4b6ac03ffe26af2220dc5dfe8f065067f0e2d7 languageName: node linkType: hard @@ -2550,19 +2550,19 @@ __metadata: languageName: node linkType: hard -"@storybook/manager-webpack4@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/manager-webpack4@npm:6.5.15" +"@storybook/manager-webpack4@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/manager-webpack4@npm:6.5.16" dependencies: "@babel/core": ^7.12.10 "@babel/plugin-transform-template-literals": ^7.12.1 "@babel/preset-react": ^7.12.10 - "@storybook/addons": 6.5.15 - "@storybook/core-client": 6.5.15 - "@storybook/core-common": 6.5.15 - "@storybook/node-logger": 6.5.15 - "@storybook/theming": 6.5.15 - "@storybook/ui": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/core-client": 6.5.16 + "@storybook/core-common": 6.5.16 + "@storybook/node-logger": 6.5.16 + "@storybook/theming": 6.5.16 + "@storybook/ui": 6.5.16 "@types/node": ^14.0.10 || ^16.0.0 "@types/webpack": ^4.41.26 babel-loader: ^8.0.0 @@ -2595,23 +2595,23 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: de7b2624bf44cf4eb59839ac756e9e28715caae1d5efdfbd1e2cefb55a385cf80f3a651a29ed75a905f825d6b299ba46c3cd71068eecb3b985b5a315ed03470b + checksum: 873c871c822ecde30fbd95e9517549a18c5bb2de46d6160d6dcd7c1b5635fda2073b5bc4bd4d87e72de6e8df8bccf39b81f062e07cd7a23ffb4b43293e488fbb languageName: node linkType: hard "@storybook/manager-webpack5@npm:^6.5.9": - version: 6.5.15 - resolution: "@storybook/manager-webpack5@npm:6.5.15" + version: 6.5.16 + resolution: "@storybook/manager-webpack5@npm:6.5.16" dependencies: "@babel/core": ^7.12.10 "@babel/plugin-transform-template-literals": ^7.12.1 "@babel/preset-react": ^7.12.10 - "@storybook/addons": 6.5.15 - "@storybook/core-client": 6.5.15 - "@storybook/core-common": 6.5.15 - "@storybook/node-logger": 6.5.15 - "@storybook/theming": 6.5.15 - "@storybook/ui": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/core-client": 6.5.16 + "@storybook/core-common": 6.5.16 + "@storybook/node-logger": 6.5.16 + "@storybook/theming": 6.5.16 + "@storybook/ui": 6.5.16 "@types/node": ^14.0.10 || ^16.0.0 babel-loader: ^8.0.0 case-sensitive-paths-webpack-plugin: ^2.3.0 @@ -2641,7 +2641,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 99f18a752230fa6360b216e3a7f85c70fe92baf01677571653b4f9fd62735d9ab12a0b91e4ae7eabd66b03f37e0b58f01fad8e5880a8e2012a98f6aedc944da1 + checksum: 1349c6b2af9d0cebc3c35c929e2ea0f9ff8d12f7a04c30126160d9c89a45b92412218304abda9126cf96303a2d73fb288a689a191fec12b0189f19e5f2032977 languageName: node linkType: hard @@ -2664,29 +2664,29 @@ __metadata: languageName: node linkType: hard -"@storybook/node-logger@npm:6.5.15, @storybook/node-logger@npm:^6.5.9": - version: 6.5.15 - resolution: "@storybook/node-logger@npm:6.5.15" +"@storybook/node-logger@npm:6.5.16, @storybook/node-logger@npm:^6.5.9": + version: 6.5.16 + resolution: "@storybook/node-logger@npm:6.5.16" dependencies: "@types/npmlog": ^4.1.2 chalk: ^4.1.0 core-js: ^3.8.2 npmlog: ^5.0.1 pretty-hrtime: ^1.0.3 - checksum: 9c01127d3b57db7a85759d2f179afec0e1207c0754e80e22472e73468f831e1dafa2a5bf1047e54f92d47b5103325c157c14655208a6ddcdb8f9e7ee0b256e48 + checksum: 4ae47c03b6cec6b820e0e482e6f6675bf745fca5c124eb919240c0339b9f4a1b110c8fde7c5ddbc1748d3992773c61d37ba1f5c489b42279cf03517d4e1d51c5 languageName: node linkType: hard -"@storybook/preview-web@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/preview-web@npm:6.5.15" +"@storybook/preview-web@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/preview-web@npm:6.5.16" dependencies: - "@storybook/addons": 6.5.15 - "@storybook/channel-postmessage": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/core-events": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/channel-postmessage": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/core-events": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/store": 6.5.15 + "@storybook/store": 6.5.16 ansi-to-html: ^0.6.11 core-js: ^3.8.2 global: ^4.4.0 @@ -2700,7 +2700,7 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: fc178af772f39fcfe1b9926bf62bd7642984080442e8f7f2a0c6fe421513f9930ff5ccfea302d212199adf418c4bf9fc498ff65c30ad6e1cdd1b485a6d92b190 + checksum: 6161c96e9ee459ef93c3d972374ce339ae57d0c5fa25730007484e4824f79a34814110431db97031107558e5ce41259710f8a54564e8975db0215b78c5572a1b languageName: node linkType: hard @@ -2723,22 +2723,22 @@ __metadata: linkType: hard "@storybook/react@npm:^6.5.9": - version: 6.5.15 - resolution: "@storybook/react@npm:6.5.15" + version: 6.5.16 + resolution: "@storybook/react@npm:6.5.16" dependencies: "@babel/preset-flow": ^7.12.1 "@babel/preset-react": ^7.12.10 "@pmmmwh/react-refresh-webpack-plugin": ^0.5.3 - "@storybook/addons": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/core": 6.5.15 - "@storybook/core-common": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/core": 6.5.16 + "@storybook/core-common": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/docs-tools": 6.5.15 - "@storybook/node-logger": 6.5.15 + "@storybook/docs-tools": 6.5.16 + "@storybook/node-logger": 6.5.16 "@storybook/react-docgen-typescript-plugin": 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0 "@storybook/semver": ^7.3.2 - "@storybook/store": 6.5.15 + "@storybook/store": 6.5.16 "@types/estree": ^0.0.51 "@types/node": ^14.14.20 || ^16.0.0 "@types/webpack-env": ^1.16.0 @@ -2783,7 +2783,7 @@ __metadata: build-storybook: bin/build.js start-storybook: bin/index.js storybook-server: bin/index.js - checksum: c36f9a2401633b9632e5fce05bb43e8ea0a5338c8f0dc9e0da5eb87c7cfd1a3ef819124499679a3c797fbbe8278f03794d757563f388136a349e3815747036ae + checksum: c5396e748ef13acdb2590dc15ff0b3d95d3599abd0c372786d707164d3f71e46836240195dcd6f4bce6f90d2792602f6d31373fc87e069ef3c73a63d1e9a1289 languageName: node linkType: hard @@ -2803,11 +2803,11 @@ __metadata: languageName: node linkType: hard -"@storybook/router@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/router@npm:6.5.15" +"@storybook/router@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/router@npm:6.5.16" dependencies: - "@storybook/client-logger": 6.5.15 + "@storybook/client-logger": 6.5.16 core-js: ^3.8.2 memoizerific: ^1.11.3 qs: ^6.10.0 @@ -2815,7 +2815,7 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: d5ac1ac0d161e53764411dc84febed3819c5cefe669f2933434bcdc25bf011f89d2df2a504af8bf77f454e6598a74c794a17d01aad734c6ebe28cc13c490fff9 + checksum: 2812b93997026b1d85f02072d04f18e98e24de288efb73402f8d15ececd390e13dc620ef011268e09986c629f497ffa03230c2431e89b4e37c01b70761be2c6d languageName: node linkType: hard @@ -2831,12 +2831,12 @@ __metadata: languageName: node linkType: hard -"@storybook/source-loader@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/source-loader@npm:6.5.15" +"@storybook/source-loader@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/source-loader@npm:6.5.16" dependencies: - "@storybook/addons": 6.5.15 - "@storybook/client-logger": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/client-logger": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 core-js: ^3.8.2 estraverse: ^5.2.0 @@ -2848,17 +2848,17 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 2330d2b16f097c4be4b0eccc466ae0142c2e04198acc529204d80c1005c1c32b6da8313661b10e641020efdfe4f1dd4f0ac67bc2c3797ae49383815f668ede5d + checksum: a299acdd6f36add3222ef294e1118b7b1f38c2cd2b4648ebf9e1803a3ccf532c147dbe643a527915b570eb3ce36c4a17ca2b3566fa58a2a0a7821f0849ec3e07 languageName: node linkType: hard -"@storybook/store@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/store@npm:6.5.15" +"@storybook/store@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/store@npm:6.5.16" dependencies: - "@storybook/addons": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/core-events": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/core-events": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 core-js: ^3.8.2 fast-deep-equal: ^3.1.3 @@ -2874,16 +2874,16 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 918c3ed8c7a55ae4bf8bcb3a108d99a9d077c951b3f386cb0f8939d2eed7c9a9a2000075b341d5c934c0308c24287fc5cd110042a384411c25cec7632dfa5abb + checksum: f438fb020af240e23348742b2936a326bef1f7ffd489fe9f39cfd516310ab592a11609205fdacd11090b0c0b6bc72c75dff986085a6a97acc5efa64829a49309 languageName: node linkType: hard -"@storybook/telemetry@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/telemetry@npm:6.5.15" +"@storybook/telemetry@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/telemetry@npm:6.5.16" dependencies: - "@storybook/client-logger": 6.5.15 - "@storybook/core-common": 6.5.15 + "@storybook/client-logger": 6.5.16 + "@storybook/core-common": 6.5.16 chalk: ^4.1.0 core-js: ^3.8.2 detect-package-manager: ^2.0.1 @@ -2894,7 +2894,7 @@ __metadata: nanoid: ^3.3.1 read-pkg-up: ^7.0.1 regenerator-runtime: ^0.13.7 - checksum: aebb83186ff7308e21185a7152b27aed43f6d3967a7253ac94e3d4c1bce4935c471500c37d195e03f98953944812d2b24518d4147704e7ffb211430b27a2354e + checksum: 21eef590b04db8ee85b0b1d875d8646e26492b3e90538a248314f92d6ab0642ec65db09c5d2bc0d7f547f0fa6b83ca4442bdc115b400861360e02d8cf179497e languageName: node linkType: hard @@ -2926,34 +2926,34 @@ __metadata: languageName: node linkType: hard -"@storybook/theming@npm:6.5.15, @storybook/theming@npm:^6.0.0": - version: 6.5.15 - resolution: "@storybook/theming@npm:6.5.15" +"@storybook/theming@npm:6.5.16, @storybook/theming@npm:^6.0.0": + version: 6.5.16 + resolution: "@storybook/theming@npm:6.5.16" dependencies: - "@storybook/client-logger": 6.5.15 + "@storybook/client-logger": 6.5.16 core-js: ^3.8.2 memoizerific: ^1.11.3 regenerator-runtime: ^0.13.7 peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 84d09b6bdd0a00246b207ef4307fc0ecbb5861792547a070ed45470335c323f18ba607cd1d3f0a5cea7e979dd73315cdb091548fe70e5946c1593d8c691be7ba + checksum: 349affa5c5208240291a5d24c73d852e220bfaf36b8fda70564aec1cac6070248ce7566ccb755c55a6ce0844ab2bbfd55881f6f788240b38cb407714e393c6f3 languageName: node linkType: hard -"@storybook/ui@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/ui@npm:6.5.15" +"@storybook/ui@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/ui@npm:6.5.16" dependencies: - "@storybook/addons": 6.5.15 - "@storybook/api": 6.5.15 - "@storybook/channels": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/components": 6.5.15 - "@storybook/core-events": 6.5.15 - "@storybook/router": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/api": 6.5.16 + "@storybook/channels": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/components": 6.5.16 + "@storybook/core-events": 6.5.16 + "@storybook/router": 6.5.16 "@storybook/semver": ^7.3.2 - "@storybook/theming": 6.5.15 + "@storybook/theming": 6.5.16 core-js: ^3.8.2 memoizerific: ^1.11.3 qs: ^6.10.0 @@ -2962,94 +2962,94 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 8b75290c65a6a2beb3db4157ed95ce74dab06d5499dc3fc7a848fa5c9fc0f506bf6533638bb50c3a1f27acfeaa6ade0acdde8beede2241eba8d577965d85d299 + checksum: bfebcf4d56dc5fd6024eaa08fe50aecc3c348670b7c0ec6b467680d64d525421580b9c98839bcaf1e2a9e69b78478a21c9943a9a392b49a0405b4784038b2eba languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.28": - version: 1.3.28 - resolution: "@swc/core-darwin-arm64@npm:1.3.28" +"@swc/core-darwin-arm64@npm:1.3.30": + version: 1.3.30 + resolution: "@swc/core-darwin-arm64@npm:1.3.30" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.28": - version: 1.3.28 - resolution: "@swc/core-darwin-x64@npm:1.3.28" +"@swc/core-darwin-x64@npm:1.3.30": + version: 1.3.30 + resolution: "@swc/core-darwin-x64@npm:1.3.30" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.28": - version: 1.3.28 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.28" +"@swc/core-linux-arm-gnueabihf@npm:1.3.30": + version: 1.3.30 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.30" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.28": - version: 1.3.28 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.28" +"@swc/core-linux-arm64-gnu@npm:1.3.30": + version: 1.3.30 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.30" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.28": - version: 1.3.28 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.28" +"@swc/core-linux-arm64-musl@npm:1.3.30": + version: 1.3.30 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.30" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.28": - version: 1.3.28 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.28" +"@swc/core-linux-x64-gnu@npm:1.3.30": + version: 1.3.30 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.30" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.28": - version: 1.3.28 - resolution: "@swc/core-linux-x64-musl@npm:1.3.28" +"@swc/core-linux-x64-musl@npm:1.3.30": + version: 1.3.30 + resolution: "@swc/core-linux-x64-musl@npm:1.3.30" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.28": - version: 1.3.28 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.28" +"@swc/core-win32-arm64-msvc@npm:1.3.30": + version: 1.3.30 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.30" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.28": - version: 1.3.28 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.28" +"@swc/core-win32-ia32-msvc@npm:1.3.30": + version: 1.3.30 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.30" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.28": - version: 1.3.28 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.28" +"@swc/core-win32-x64-msvc@npm:1.3.30": + version: 1.3.30 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.30" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.9": - version: 1.3.28 - resolution: "@swc/core@npm:1.3.28" + version: 1.3.30 + resolution: "@swc/core@npm:1.3.30" dependencies: - "@swc/core-darwin-arm64": 1.3.28 - "@swc/core-darwin-x64": 1.3.28 - "@swc/core-linux-arm-gnueabihf": 1.3.28 - "@swc/core-linux-arm64-gnu": 1.3.28 - "@swc/core-linux-arm64-musl": 1.3.28 - "@swc/core-linux-x64-gnu": 1.3.28 - "@swc/core-linux-x64-musl": 1.3.28 - "@swc/core-win32-arm64-msvc": 1.3.28 - "@swc/core-win32-ia32-msvc": 1.3.28 - "@swc/core-win32-x64-msvc": 1.3.28 + "@swc/core-darwin-arm64": 1.3.30 + "@swc/core-darwin-x64": 1.3.30 + "@swc/core-linux-arm-gnueabihf": 1.3.30 + "@swc/core-linux-arm64-gnu": 1.3.30 + "@swc/core-linux-arm64-musl": 1.3.30 + "@swc/core-linux-x64-gnu": 1.3.30 + "@swc/core-linux-x64-musl": 1.3.30 + "@swc/core-win32-arm64-msvc": 1.3.30 + "@swc/core-win32-ia32-msvc": 1.3.30 + "@swc/core-win32-x64-msvc": 1.3.30 dependenciesMeta: "@swc/core-darwin-arm64": optional: true @@ -3071,7 +3071,7 @@ __metadata: optional: true "@swc/core-win32-x64-msvc": optional: true - checksum: bc96bb6cf476bf815d2f9308b280c119f8c8ecc4e9ba459322415d884c21dcad040ae8c69646811e598e0039ab497c8f15031c331fd6d13ea5bdf848b9c9f44f + checksum: 157a8ae43ebc73fa28d53e913fd7fc879289d5479ba5ea0c5e9abad0b379ca7e292d45f4f07bfd3ec0ff1998b55f300737724dfe463f1f7b361661e083db950c languageName: node linkType: hard @@ -7606,12 +7606,12 @@ __metadata: languageName: node linkType: hard -"json5@npm:^2.1.2, json5@npm:^2.1.3, json5@npm:^2.2.1": - version: 2.2.1 - resolution: "json5@npm:2.2.1" +"json5@npm:^2.1.2, json5@npm:^2.2.1, json5@npm:^2.2.3": + version: 2.2.3 + resolution: "json5@npm:2.2.3" bin: json5: lib/cli.js - checksum: 74b8a23b102a6f2bf2d224797ae553a75488b5adbaee9c9b6e5ab8b510a2fc6e38f876d4c77dea672d4014a44b2399e15f2051ac2b37b87f74c0c7602003543b + checksum: 2a7436a93393830bce797d4626275152e37e877b265e94ca69c99e3d20c2b9dab021279146a39cdb700e71b2dd32a4cebd1514cd57cee102b1af906ce5040349 languageName: node linkType: hard diff --git a/yarn.lock b/yarn.lock index ede8ab22a2..7f3a0d4361 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22,14 +22,14 @@ __metadata: linkType: hard "@apidevtools/json-schema-ref-parser@npm:^9.0.6": - version: 9.1.1 - resolution: "@apidevtools/json-schema-ref-parser@npm:9.1.1" + version: 9.1.2 + resolution: "@apidevtools/json-schema-ref-parser@npm:9.1.2" dependencies: "@jsdevtools/ono": ^7.1.3 "@types/json-schema": ^7.0.6 call-me-maybe: ^1.0.1 js-yaml: ^4.1.0 - checksum: f8fb98fec4d510ef7a135256745b7321fbc1547a83cdeb458b143d46f3d5fae1450673a9f485f77051391d052e6ec9d6ec6c0d3091d7dfe4b6ac5d85ee77e10d + checksum: 5bd6885db0fd6633879bb4638b7a3aead6b061cb6422083c6be505ee6873be54e3376380df164c73edd8901d4145a9bfe9bc0b008a568fd8b0626b1df96fae8f languageName: node linkType: hard @@ -3387,6 +3387,7 @@ __metadata: "@backstage/backend-common": "workspace:^" "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-tasks": "workspace:^" + "@backstage/backend-test-utils": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/cli-common": "workspace:^" "@backstage/config": "workspace:^" @@ -3613,7 +3614,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/catalog-model@npm:^1.1.3, @backstage/catalog-model@npm:^1.1.4, @backstage/catalog-model@npm:^1.1.5": +"@backstage/catalog-model@npm:^1.1.3, @backstage/catalog-model@npm:^1.1.5": version: 1.1.5 resolution: "@backstage/catalog-model@npm:1.1.5" dependencies: @@ -3720,7 +3721,7 @@ __metadata: css-loader: ^6.5.1 del: ^6.0.0 diff: ^5.0.0 - esbuild: ^0.16.0 + esbuild: ^0.17.0 esbuild-loader: ^2.18.0 eslint: ^8.6.0 eslint-config-prettier: ^8.3.0 @@ -3886,7 +3887,57 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-components@^0.12.0, @backstage/core-components@^0.12.2, @backstage/core-components@^0.12.3, @backstage/core-components@workspace:^, @backstage/core-components@workspace:packages/core-components": +"@backstage/core-components@npm:^0.12.0, @backstage/core-components@npm:^0.12.3": + version: 0.12.3 + resolution: "@backstage/core-components@npm:0.12.3" + dependencies: + "@backstage/config": ^1.0.6 + "@backstage/core-plugin-api": ^1.3.0 + "@backstage/errors": ^1.1.4 + "@backstage/theme": ^0.2.16 + "@backstage/version-bridge": ^1.0.3 + "@material-table/core": ^3.1.0 + "@material-ui/core": ^4.12.2 + "@material-ui/icons": ^4.9.1 + "@material-ui/lab": 4.0.0-alpha.57 + "@react-hookz/web": ^20.0.0 + "@types/react-sparklines": ^1.7.0 + "@types/react-text-truncate": ^0.14.0 + ansi-regex: ^6.0.1 + classnames: ^2.2.6 + d3-selection: ^3.0.0 + d3-shape: ^3.0.0 + d3-zoom: ^3.0.0 + dagre: ^0.8.5 + history: ^5.0.0 + immer: ^9.0.1 + lodash: ^4.17.21 + pluralize: ^8.0.0 + prop-types: ^15.7.2 + qs: ^6.9.4 + rc-progress: 3.4.1 + react-helmet: 6.1.0 + react-hook-form: ^7.12.2 + react-markdown: ^8.0.0 + react-sparklines: ^1.7.0 + react-syntax-highlighter: ^15.4.5 + react-text-truncate: ^0.19.0 + react-use: ^17.3.2 + react-virtualized-auto-sizer: ^1.0.6 + react-window: ^1.8.6 + remark-gfm: ^3.0.1 + zen-observable: ^0.10.0 + zod: ~3.18.0 + peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 + react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 + checksum: f9c242af07b500f0de738591848776ad3864fb52e30f1979e547d6d607a0eb96df5c1464c8dadb4f5c1d7dd6c10ae74e4c2f60eba5380b704f4b01ac6711131c + languageName: node + linkType: hard + +"@backstage/core-components@workspace:^, @backstage/core-components@workspace:packages/core-components": version: 0.0.0-use.local resolution: "@backstage/core-components@workspace:packages/core-components" dependencies: @@ -3957,7 +4008,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-plugin-api@^1.1.0, @backstage/core-plugin-api@^1.2.0, @backstage/core-plugin-api@^1.3.0, @backstage/core-plugin-api@workspace:^, @backstage/core-plugin-api@workspace:packages/core-plugin-api": +"@backstage/core-plugin-api@^1.1.0, @backstage/core-plugin-api@^1.3.0, @backstage/core-plugin-api@workspace:^, @backstage/core-plugin-api@workspace:packages/core-plugin-api": version: 0.0.0-use.local resolution: "@backstage/core-plugin-api@workspace:packages/core-plugin-api" dependencies: @@ -4072,7 +4123,26 @@ __metadata: languageName: unknown linkType: soft -"@backstage/integration-react@^1.1.9, @backstage/integration-react@workspace:^, @backstage/integration-react@workspace:packages/integration-react": +"@backstage/integration-react@npm:^1.1.9": + version: 1.1.9 + resolution: "@backstage/integration-react@npm:1.1.9" + dependencies: + "@backstage/config": ^1.0.6 + "@backstage/core-components": ^0.12.3 + "@backstage/core-plugin-api": ^1.3.0 + "@backstage/integration": ^1.4.2 + "@backstage/theme": ^0.2.16 + "@material-ui/core": ^4.12.2 + "@material-ui/icons": ^4.9.1 + "@material-ui/lab": 4.0.0-alpha.57 + react-use: ^17.2.4 + peerDependencies: + react: ^16.13.1 || ^17.0.0 + checksum: 28d94f05e65944308ac6b0709e22336e6e745fe6143f7c3851ccf200725066fc73f53d238e559599d003818c764a86645e3d3f3178e2e5fd0d7cc968d7cc6375 + languageName: node + linkType: hard + +"@backstage/integration-react@workspace:^, @backstage/integration-react@workspace:packages/integration-react": version: 0.0.0-use.local resolution: "@backstage/integration-react@workspace:packages/integration-react" dependencies: @@ -4389,7 +4459,7 @@ __metadata: "@backstage/dev-utils": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" - "@material-ui/core": ^4.9.13 + "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": ^4.0.0-alpha.57 "@testing-library/jest-dom": ^5.10.1 @@ -5291,7 +5361,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-react@npm:^1.2.1, @backstage/plugin-catalog-react@npm:^1.2.3, @backstage/plugin-catalog-react@npm:^1.2.4": +"@backstage/plugin-catalog-react@npm:^1.2.1, @backstage/plugin-catalog-react@npm:^1.2.4": version: 1.2.4 resolution: "@backstage/plugin-catalog-react@npm:1.2.4" dependencies: @@ -5437,7 +5507,7 @@ __metadata: "@backstage/core-plugin-api": "workspace:^" "@backstage/plugin-catalog-react": "workspace:^" "@date-io/luxon": ^1.3.13 - "@material-ui/core": ^4.9.13 + "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.57 "@material-ui/pickers": ^3.3.10 @@ -5628,7 +5698,7 @@ __metadata: "@backstage/errors": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" - "@material-ui/core": ^4.9.10 + "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": ^4.0.0-alpha.57 "@testing-library/jest-dom": ^5.10.1 @@ -5742,7 +5812,7 @@ __metadata: "@backstage/dev-utils": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" - "@material-ui/core": ^4.9.13 + "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.57 "@testing-library/jest-dom": ^5.10.1 @@ -6417,7 +6487,6 @@ __metadata: "@backstage/core-plugin-api": "workspace:^" "@backstage/dev-utils": "workspace:^" "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/plugin-stack-overflow": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 @@ -6781,7 +6850,7 @@ __metadata: "@backstage/plugin-catalog-react": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" - "@material-ui/core": ^4.9.13 + "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": ^4.0.0-alpha.57 "@testing-library/jest-dom": ^5.10.1 @@ -7056,7 +7125,7 @@ __metadata: "@backstage/plugin-search-react": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" - "@material-ui/core": ^4.9.13 + "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": ^4.0.0-alpha.57 "@testing-library/jest-dom": ^5.10.1 @@ -7215,20 +7284,8 @@ __metadata: dependencies: "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" - "@backstage/core-app-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" "@backstage/errors": "workspace:^" - "@backstage/integration": "workspace:^" "@backstage/plugin-scaffolder-node": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@testing-library/jest-dom": ^5.10.1 - "@testing-library/react": ^12.1.3 - "@testing-library/user-event": ^14.0.0 - "@types/node": "*" - cross-fetch: ^3.1.5 - msw: ^0.49.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 languageName: unknown linkType: soft @@ -7281,7 +7338,7 @@ __metadata: command-exists: ^1.2.9 compression: ^1.7.4 cors: ^2.8.5 - esbuild: ^0.16.0 + esbuild: ^0.17.0 express: ^4.17.1 express-promise-router: ^4.1.0 fs-extra: 10.1.0 @@ -7361,11 +7418,11 @@ __metadata: "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.57 "@rjsf/core": ^3.2.1 - "@rjsf/core-v5": "npm:@rjsf/core@5.0.0-beta.18" + "@rjsf/core-v5": "npm:@rjsf/core@5.0.1" "@rjsf/material-ui": ^3.2.1 - "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.0.0-beta.18" - "@rjsf/utils": 5.0.0-beta.18 - "@rjsf/validator-ajv8": 5.0.0-beta.18 + "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.0.1" + "@rjsf/utils": 5.0.1 + "@rjsf/validator-ajv8": 5.0.1 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 @@ -7420,7 +7477,7 @@ __metadata: "@react-hookz/web": ^20.0.0 "@rjsf/core": ^3.2.1 "@rjsf/material-ui": ^3.2.1 - "@rjsf/utils": 5.0.0-beta.18 + "@rjsf/utils": 5.0.1 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 @@ -7552,7 +7609,31 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-search-react@^1.4.0, @backstage/plugin-search-react@workspace:^, @backstage/plugin-search-react@workspace:plugins/search-react": +"@backstage/plugin-search-react@npm:^1.4.0": + version: 1.4.0 + resolution: "@backstage/plugin-search-react@npm:1.4.0" + dependencies: + "@backstage/core-components": ^0.12.3 + "@backstage/core-plugin-api": ^1.3.0 + "@backstage/plugin-search-common": ^1.2.1 + "@backstage/theme": ^0.2.16 + "@backstage/types": ^1.0.2 + "@backstage/version-bridge": ^1.0.3 + "@material-ui/core": ^4.12.2 + "@material-ui/icons": ^4.9.1 + "@material-ui/lab": 4.0.0-alpha.57 + lodash: ^4.17.21 + qs: ^6.9.4 + react-use: ^17.3.2 + peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 + react: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 + checksum: 0fe18ee991bea12ba4b525b1ed4934f53a2cb2172851762c67d844405206ef8ed335ce8ad6412b4c4f133ae2b1f654b5086cf9997521e2e2cb2ef9cad6891e0a + languageName: node + linkType: hard + +"@backstage/plugin-search-react@workspace:^, @backstage/plugin-search-react@workspace:plugins/search-react": version: 0.0.0-use.local resolution: "@backstage/plugin-search-react@workspace:plugins/search-react" dependencies: @@ -8016,7 +8097,7 @@ __metadata: "@backstage/plugin-techdocs-react": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" - "@material-ui/core": ^4.9.13 + "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.57 "@testing-library/jest-dom": ^5.10.1 @@ -8083,7 +8164,7 @@ __metadata: "@backstage/plugin-techdocs-react": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" - "@material-ui/core": ^4.9.13 + "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.57 "@react-hookz/web": ^20.0.0 @@ -9057,9 +9138,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/android-arm64@npm:0.16.16" +"@esbuild/android-arm64@npm:0.17.5": + version: 0.17.5 + resolution: "@esbuild/android-arm64@npm:0.17.5" conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -9071,65 +9152,65 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/android-arm@npm:0.16.16" +"@esbuild/android-arm@npm:0.17.5": + version: 0.17.5 + resolution: "@esbuild/android-arm@npm:0.17.5" conditions: os=android & cpu=arm languageName: node linkType: hard -"@esbuild/android-x64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/android-x64@npm:0.16.16" +"@esbuild/android-x64@npm:0.17.5": + version: 0.17.5 + resolution: "@esbuild/android-x64@npm:0.17.5" conditions: os=android & cpu=x64 languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/darwin-arm64@npm:0.16.16" +"@esbuild/darwin-arm64@npm:0.17.5": + version: 0.17.5 + resolution: "@esbuild/darwin-arm64@npm:0.17.5" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/darwin-x64@npm:0.16.16" +"@esbuild/darwin-x64@npm:0.17.5": + version: 0.17.5 + resolution: "@esbuild/darwin-x64@npm:0.17.5" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/freebsd-arm64@npm:0.16.16" +"@esbuild/freebsd-arm64@npm:0.17.5": + version: 0.17.5 + resolution: "@esbuild/freebsd-arm64@npm:0.17.5" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/freebsd-x64@npm:0.16.16" +"@esbuild/freebsd-x64@npm:0.17.5": + version: 0.17.5 + resolution: "@esbuild/freebsd-x64@npm:0.17.5" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/linux-arm64@npm:0.16.16" +"@esbuild/linux-arm64@npm:0.17.5": + version: 0.17.5 + resolution: "@esbuild/linux-arm64@npm:0.17.5" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/linux-arm@npm:0.16.16" +"@esbuild/linux-arm@npm:0.17.5": + version: 0.17.5 + resolution: "@esbuild/linux-arm@npm:0.17.5" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/linux-ia32@npm:0.16.16" +"@esbuild/linux-ia32@npm:0.17.5": + version: 0.17.5 + resolution: "@esbuild/linux-ia32@npm:0.17.5" conditions: os=linux & cpu=ia32 languageName: node linkType: hard @@ -9141,86 +9222,86 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/linux-loong64@npm:0.16.16" +"@esbuild/linux-loong64@npm:0.17.5": + version: 0.17.5 + resolution: "@esbuild/linux-loong64@npm:0.17.5" conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/linux-mips64el@npm:0.16.16" +"@esbuild/linux-mips64el@npm:0.17.5": + version: 0.17.5 + resolution: "@esbuild/linux-mips64el@npm:0.17.5" conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/linux-ppc64@npm:0.16.16" +"@esbuild/linux-ppc64@npm:0.17.5": + version: 0.17.5 + resolution: "@esbuild/linux-ppc64@npm:0.17.5" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/linux-riscv64@npm:0.16.16" +"@esbuild/linux-riscv64@npm:0.17.5": + version: 0.17.5 + resolution: "@esbuild/linux-riscv64@npm:0.17.5" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/linux-s390x@npm:0.16.16" +"@esbuild/linux-s390x@npm:0.17.5": + version: 0.17.5 + resolution: "@esbuild/linux-s390x@npm:0.17.5" conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/linux-x64@npm:0.16.16" +"@esbuild/linux-x64@npm:0.17.5": + version: 0.17.5 + resolution: "@esbuild/linux-x64@npm:0.17.5" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/netbsd-x64@npm:0.16.16" +"@esbuild/netbsd-x64@npm:0.17.5": + version: 0.17.5 + resolution: "@esbuild/netbsd-x64@npm:0.17.5" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/openbsd-x64@npm:0.16.16" +"@esbuild/openbsd-x64@npm:0.17.5": + version: 0.17.5 + resolution: "@esbuild/openbsd-x64@npm:0.17.5" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/sunos-x64@npm:0.16.16" +"@esbuild/sunos-x64@npm:0.17.5": + version: 0.17.5 + resolution: "@esbuild/sunos-x64@npm:0.17.5" conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/win32-arm64@npm:0.16.16" +"@esbuild/win32-arm64@npm:0.17.5": + version: 0.17.5 + resolution: "@esbuild/win32-arm64@npm:0.17.5" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/win32-ia32@npm:0.16.16" +"@esbuild/win32-ia32@npm:0.17.5": + version: 0.17.5 + resolution: "@esbuild/win32-ia32@npm:0.17.5" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/win32-x64@npm:0.16.16" +"@esbuild/win32-x64@npm:0.17.5": + version: 0.17.5 + resolution: "@esbuild/win32-x64@npm:0.17.5" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -9412,13 +9493,13 @@ __metadata: linkType: hard "@graphql-codegen/cli@npm:^2.3.1": - version: 2.16.4 - resolution: "@graphql-codegen/cli@npm:2.16.4" + version: 2.16.5 + resolution: "@graphql-codegen/cli@npm:2.16.5" dependencies: "@babel/generator": ^7.18.13 "@babel/template": ^7.18.10 "@babel/types": ^7.18.13 - "@graphql-codegen/core": 2.6.8 + "@graphql-codegen/core": ^2.6.8 "@graphql-codegen/plugin-helpers": ^3.1.2 "@graphql-tools/apollo-engine-loader": ^7.3.6 "@graphql-tools/code-file-loader": ^7.3.13 @@ -9426,7 +9507,7 @@ __metadata: "@graphql-tools/github-loader": ^7.3.20 "@graphql-tools/graphql-file-loader": ^7.5.0 "@graphql-tools/json-file-loader": ^7.4.1 - "@graphql-tools/load": 7.8.0 + "@graphql-tools/load": ^7.8.0 "@graphql-tools/prisma-loader": ^7.2.49 "@graphql-tools/url-loader": ^7.13.2 "@graphql-tools/utils": ^9.0.0 @@ -9434,10 +9515,10 @@ __metadata: chalk: ^4.1.0 chokidar: ^3.5.2 cosmiconfig: ^7.0.0 - cosmiconfig-typescript-loader: 4.3.0 + cosmiconfig-typescript-loader: ^4.3.0 debounce: ^1.2.0 detect-indent: ^6.0.0 - graphql-config: 4.4.0 + graphql-config: ^4.4.0 inquirer: ^8.0.0 is-glob: ^4.0.1 json-to-pretty-yaml: ^1.2.2 @@ -9446,22 +9527,22 @@ __metadata: shell-quote: ^1.7.3 string-env-interpolation: ^1.0.1 ts-log: ^2.2.3 + ts-node: ^10.9.1 tslib: ^2.4.0 yaml: ^1.10.0 yargs: ^17.0.0 peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - ts-node: ">=10" bin: gql-gen: cjs/bin.js graphql-code-generator: cjs/bin.js graphql-codegen: cjs/bin.js graphql-codegen-esm: esm/bin.js - checksum: 6a6d99ac0220e993d71f30858b2b819bbc51685e7b376262493eff916e19be26d031f6859e71a8050c26cc69899bd2c5c0b797de09c45ae0312fd52bca2d8e65 + checksum: d1fdc1a0e678d03995bc7e4927ccd1683b7e50686f13b81d01ad6b295e2033876d05cc71d1d489270d314ac25801a9b82e16aa79982a04e982813854990e4a53 languageName: node linkType: hard -"@graphql-codegen/core@npm:2.6.8": +"@graphql-codegen/core@npm:^2.6.8": version: 2.6.8 resolution: "@graphql-codegen/core@npm:2.6.8" dependencies: @@ -9476,18 +9557,18 @@ __metadata: linkType: hard "@graphql-codegen/graphql-modules-preset@npm:^2.3.2": - version: 2.5.11 - resolution: "@graphql-codegen/graphql-modules-preset@npm:2.5.11" + version: 2.5.12 + resolution: "@graphql-codegen/graphql-modules-preset@npm:2.5.12" dependencies: "@graphql-codegen/plugin-helpers": ^3.1.2 - "@graphql-codegen/visitor-plugin-common": 2.13.7 + "@graphql-codegen/visitor-plugin-common": 2.13.8 "@graphql-tools/utils": ^9.0.0 change-case-all: 1.0.15 parse-filepath: ^1.0.2 tslib: ~2.4.0 peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: c77f05964ff1253ee522ee43ef19e939933b3162150da0d6c0c9fb243020f058af1146160aba307427f0ecf6dfafaa16935fc8fe57cb74f94fb784671bb31f6b + checksum: ca2354d5eb899bca7af2ddb68a1ad96fd046b53c07bb0323478d18e155e0bb988bb6bae4ed1578e37ffb9cb004900e7abb92b4a8b3826b6fe903b422501f8ef2 languageName: node linkType: hard @@ -9521,39 +9602,39 @@ __metadata: linkType: hard "@graphql-codegen/typescript-resolvers@npm:^2.4.3": - version: 2.7.12 - resolution: "@graphql-codegen/typescript-resolvers@npm:2.7.12" + version: 2.7.13 + resolution: "@graphql-codegen/typescript-resolvers@npm:2.7.13" dependencies: "@graphql-codegen/plugin-helpers": ^3.1.2 - "@graphql-codegen/typescript": ^2.8.7 - "@graphql-codegen/visitor-plugin-common": 2.13.7 + "@graphql-codegen/typescript": ^2.8.8 + "@graphql-codegen/visitor-plugin-common": 2.13.8 "@graphql-tools/utils": ^9.0.0 auto-bind: ~4.0.0 tslib: ~2.4.0 peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: f8f60d972720f42f7407d91febfa4ae91f4e6cc2bd990babe85f8d1c77a3fa8dcc4ac85d8267ce24942703fc28ff6f38f4d8215e098f34fe1b35063aa08ef5a0 + checksum: 9ddfeb295e55055d450f30942c476edbc05722943d5265e9eaea9f89cef9eecb749be1ece9ce9247d53bdcc7688ca305100327d28096f5fe6aee387cf3f275f5 languageName: node linkType: hard -"@graphql-codegen/typescript@npm:^2.4.2, @graphql-codegen/typescript@npm:^2.8.7": - version: 2.8.7 - resolution: "@graphql-codegen/typescript@npm:2.8.7" +"@graphql-codegen/typescript@npm:^2.4.2, @graphql-codegen/typescript@npm:^2.8.8": + version: 2.8.8 + resolution: "@graphql-codegen/typescript@npm:2.8.8" dependencies: "@graphql-codegen/plugin-helpers": ^3.1.2 "@graphql-codegen/schema-ast": ^2.6.1 - "@graphql-codegen/visitor-plugin-common": 2.13.7 + "@graphql-codegen/visitor-plugin-common": 2.13.8 auto-bind: ~4.0.0 tslib: ~2.4.0 peerDependencies: graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 67cbafc0dc8695222fd3b2db26c3fcd91148a1dba7bb5dcf71eaf6425dadbaa378c5703f2844e34718954aa283aa95919d8d4650bd1d0b85b22b404ffc3436fa + checksum: ebc338bc88fd239b9ef70d900778791af2c68f7a0fa074d870cc5fcaee3ea182dfce8a1f366f53bcd5e81f95bb9e26e00e1b41e6b2ad3305cf7e6f44bf57d649 languageName: node linkType: hard -"@graphql-codegen/visitor-plugin-common@npm:2.13.7": - version: 2.13.7 - resolution: "@graphql-codegen/visitor-plugin-common@npm:2.13.7" +"@graphql-codegen/visitor-plugin-common@npm:2.13.8": + version: 2.13.8 + resolution: "@graphql-codegen/visitor-plugin-common@npm:2.13.8" dependencies: "@graphql-codegen/plugin-helpers": ^3.1.2 "@graphql-tools/optimize": ^1.3.0 @@ -9567,7 +9648,7 @@ __metadata: tslib: ~2.4.0 peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 4218af8b1542789d9c8c614ccb4362a2b4944d5c3a4a59909844fe9f1f8672825adb28deeb1b9a4d45410e1ae94cde9bd1f5c5d888ae53469260d6668814732e + checksum: 4ca8074bfb84a7c6f88216c2b327a600b57da35eae9b659656592c48f197e44004dcc5c2ab500a5d3a94e2753f47903e5e113162c8a362de08e307e564d416a5 languageName: node linkType: hard @@ -9815,17 +9896,17 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/load@npm:7.8.0, @graphql-tools/load@npm:^7.5.5": - version: 7.8.0 - resolution: "@graphql-tools/load@npm:7.8.0" +"@graphql-tools/load@npm:^7.5.5, @graphql-tools/load@npm:^7.8.0": + version: 7.8.10 + resolution: "@graphql-tools/load@npm:7.8.10" dependencies: - "@graphql-tools/schema": 9.0.4 - "@graphql-tools/utils": 8.12.0 + "@graphql-tools/schema": 9.0.14 + "@graphql-tools/utils": 9.1.4 p-limit: 3.1.0 tslib: ^2.4.0 peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 24ade442e13429d087ceac905cef4e6a14d0961e2b231adf91180a4d674de08ac6de66e6103c3e118b6ccf24065492bb69f5c99cb336e71a579ab382c8574791 + checksum: 9b1fd7041fc69072c4f7d6bc320c9de7f990e1792db567d3d913b9cc77f5c164ffee968dd90a688d89856e1e8c01beb8e1bbe9f22464fa8c563553229c3a3f28 languageName: node linkType: hard @@ -9865,27 +9946,15 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/merge@npm:8.3.15, @graphql-tools/merge@npm:^8.2.6": - version: 8.3.15 - resolution: "@graphql-tools/merge@npm:8.3.15" +"@graphql-tools/merge@npm:8.3.16, @graphql-tools/merge@npm:^8.2.6": + version: 8.3.16 + resolution: "@graphql-tools/merge@npm:8.3.16" dependencies: "@graphql-tools/utils": 9.1.4 tslib: ^2.4.0 peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 7823d3b3a2bb7a661826eb8fce8a4fcb17439224818aa08ca814d7b25324b66b790cf8e7fa083dfa9f41b2213355fb1f0db88d1e7334788347a6d69c8f5555e9 - languageName: node - linkType: hard - -"@graphql-tools/merge@npm:8.3.6": - version: 8.3.6 - resolution: "@graphql-tools/merge@npm:8.3.6" - dependencies: - "@graphql-tools/utils": 8.12.0 - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 3e45ebff0dce9524e72c4af1d2b9799c16515c1236290e07cd68fb2226c4e54734e2444d89a64b387b7ba991d15c6f948fdfc20c77a74b1d24babddd865ff32a + checksum: 4d7fa594e0d97b6d596c85619a8203cb9c88452b75efac4191697de00db5d043639ed47f6bf0a3ccc11e8638714d92a4a8bc37e77b61b46790ddf4a1e5d4bb87 languageName: node linkType: hard @@ -9998,31 +10067,17 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/schema@npm:9.0.4": - version: 9.0.4 - resolution: "@graphql-tools/schema@npm:9.0.4" +"@graphql-tools/schema@npm:9.0.14, @graphql-tools/schema@npm:^9.0.0": + version: 9.0.14 + resolution: "@graphql-tools/schema@npm:9.0.14" dependencies: - "@graphql-tools/merge": 8.3.6 - "@graphql-tools/utils": 8.12.0 - tslib: ^2.4.0 - value-or-promise: 1.0.11 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 0644ba225ff7fb03c6fb7f026b6a77a4ac5dd14fd10bb562ea0072bfe0258620fd4789b851b0b97007db8754d0b7d88a1061bb98bacc679b22e2eb7706e79e0e - languageName: node - linkType: hard - -"@graphql-tools/schema@npm:^9.0.0": - version: 9.0.13 - resolution: "@graphql-tools/schema@npm:9.0.13" - dependencies: - "@graphql-tools/merge": 8.3.15 + "@graphql-tools/merge": 8.3.16 "@graphql-tools/utils": 9.1.4 tslib: ^2.4.0 value-or-promise: 1.0.12 peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: fa5c5033c79e3ab210207c68bf80729448f0ae0bf071e029a218043d952dec8352b0d4ad467ca789a08e292d60c1ee111d266a2193bd50759c9eb82e8f9ad586 + checksum: ae958892363fe8b1715a9fd3c4bdb56d0d5d429693dbb9774ce930d104ed5a7c94db3c41c12d91fd930bf90ab186337d3ba660e765a99a98bde892f0d2dcf40e languageName: node linkType: hard @@ -10049,17 +10104,6 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/utils@npm:8.12.0": - version: 8.12.0 - resolution: "@graphql-tools/utils@npm:8.12.0" - dependencies: - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 24edc6ba3bcfa9a4c1d1d37117c3f96d847beed9638325083c32c6ec9674729dc89fc8cc389d317ae5d9dba22e91443bd9788f1dc8de91a1b6f1e592112bd48f - languageName: node - linkType: hard - "@graphql-tools/utils@npm:8.6.9": version: 8.6.9 resolution: "@graphql-tools/utils@npm:8.6.9" @@ -11338,7 +11382,7 @@ __metadata: languageName: node linkType: hard -"@material-ui/core@npm:^4.11.0, @material-ui/core@npm:^4.11.3, @material-ui/core@npm:^4.12.1, @material-ui/core@npm:^4.12.2, @material-ui/core@npm:^4.12.4, @material-ui/core@npm:^4.9.10, @material-ui/core@npm:^4.9.13": +"@material-ui/core@npm:^4.11.0, @material-ui/core@npm:^4.11.3, @material-ui/core@npm:^4.12.1, @material-ui/core@npm:^4.12.2, @material-ui/core@npm:^4.12.4": version: 4.12.4 resolution: "@material-ui/core@npm:4.12.4" dependencies: @@ -12757,18 +12801,18 @@ __metadata: languageName: node linkType: hard -"@rjsf/core-v5@npm:@rjsf/core@5.0.0-beta.18": - version: 5.0.0-beta.18 - resolution: "@rjsf/core@npm:5.0.0-beta.18" +"@rjsf/core-v5@npm:@rjsf/core@5.0.1": + version: 5.0.1 + resolution: "@rjsf/core@npm:5.0.1" dependencies: lodash: ^4.17.15 lodash-es: ^4.17.15 nanoid: ^3.3.4 prop-types: ^15.7.2 peerDependencies: - "@rjsf/utils": ^5.0.0-beta.1 + "@rjsf/utils": ^5.0.0 react: ^16.14.0 || >=17 - checksum: 1a2f2d43929790c20b6aeaa99b56bb02fc523edfa47eeffa29437dd80e337f9af5b4e4b274a637ac83e33b91799fda2a459e84903efe709def05018820f0fa83 + checksum: befd0b39aab7462f23ed926ca17314a049f338e81cdda8233e35c45febb34e3d1ff550ca8db7e64570342be281e3556a4cb045b52af86a0a551041d5ee22472b languageName: node linkType: hard @@ -12791,16 +12835,16 @@ __metadata: languageName: node linkType: hard -"@rjsf/material-ui-v5@npm:@rjsf/material-ui@5.0.0-beta.18": - version: 5.0.0-beta.18 - resolution: "@rjsf/material-ui@npm:5.0.0-beta.18" +"@rjsf/material-ui-v5@npm:@rjsf/material-ui@5.0.1": + version: 5.0.1 + resolution: "@rjsf/material-ui@npm:5.0.1" peerDependencies: "@material-ui/core": ^4.12.3 "@material-ui/icons": ^4.11.2 - "@rjsf/core": ^5.0.0-beta.1 - "@rjsf/utils": ^5.0.0-beta.1 + "@rjsf/core": ^5.0.0 + "@rjsf/utils": ^5.0.0 react: ^16.14.0 || >=17 - checksum: b40a86d4aaeb863c1e7ce7fc0256adc0e4a8cfce510c6957fdc3385d0eac3292349501c1364b640fafbdce78e214ebb927199a2a5bdeb3d7814a7680bb8d8d44 + checksum: 041f21caef8fd8e594c3b517eea15344c97017d03de5e608b1aead3e94cca474dc874930b64f59b506c1e578889664718d07e1e580fcffc78611dad3d33099fc languageName: node linkType: hard @@ -12816,9 +12860,9 @@ __metadata: languageName: node linkType: hard -"@rjsf/utils@npm:5.0.0-beta.18": - version: 5.0.0-beta.18 - resolution: "@rjsf/utils@npm:5.0.0-beta.18" +"@rjsf/utils@npm:5.0.1": + version: 5.0.1 + resolution: "@rjsf/utils@npm:5.0.1" dependencies: json-schema-merge-allof: ^0.8.1 jsonpointer: ^5.0.1 @@ -12827,21 +12871,21 @@ __metadata: react-is: ^18.2.0 peerDependencies: react: ^16.14.0 || >=17 - checksum: ac71ec2a96449e70bb7aa8af901804e3152a94908607ee8b0be90249bf5ff571c69f63b55abc6f95f3f1ec12d9a0bf467013c08b9f4276ff31ce44a36ee72633 + checksum: 7bf76106eced48cfdf3072a26306ff00d0792774dfe501b061db110e9dd2e17bead77bc9b335c85adf27926ab860c39ee4f676007f8f07e74a438f3a31004692 languageName: node linkType: hard -"@rjsf/validator-ajv8@npm:5.0.0-beta.18": - version: 5.0.0-beta.18 - resolution: "@rjsf/validator-ajv8@npm:5.0.0-beta.18" +"@rjsf/validator-ajv8@npm:5.0.1": + version: 5.0.1 + resolution: "@rjsf/validator-ajv8@npm:5.0.1" dependencies: ajv: ^8.11.0 ajv-formats: ^2.1.1 lodash: ^4.17.15 lodash-es: ^4.17.15 peerDependencies: - "@rjsf/utils": ^5.0.0-beta.16 - checksum: eb4ca8b40a21bbca4f7dd67900aa4423aaaf3fa1e4d893c8a5d00e869b7fc44514e0f262b240556f22b4dc9363ce6e554046bb8c42d599c92d191fa5bee84d0d + "@rjsf/utils": ^5.0.0 + checksum: 7d36dac876fd3536dda26af5726e847af02a9880fac9feb2683809e8c1f3743e4f5ff8399e961a79f5383e28fdb5a1e9695d89ebf7dffaa22dd76948be830c54 languageName: node linkType: hard @@ -12927,13 +12971,13 @@ __metadata: linkType: hard "@roadiehq/backstage-plugin-travis-ci@npm:^2.0.5": - version: 2.1.2 - resolution: "@roadiehq/backstage-plugin-travis-ci@npm:2.1.2" + version: 2.1.3 + resolution: "@roadiehq/backstage-plugin-travis-ci@npm:2.1.3" dependencies: - "@backstage/catalog-model": ^1.1.4 - "@backstage/core-components": ^0.12.2 - "@backstage/core-plugin-api": ^1.2.0 - "@backstage/plugin-catalog-react": ^1.2.3 + "@backstage/catalog-model": ^1.1.5 + "@backstage/core-components": ^0.12.3 + "@backstage/core-plugin-api": ^1.3.0 + "@backstage/plugin-catalog-react": ^1.2.4 "@backstage/theme": ^0.2.16 "@material-ui/core": ^4.11.3 "@material-ui/icons": ^4.11.2 @@ -12948,7 +12992,7 @@ __metadata: react-dom: ^16.13.1 || ^17.0.0 react-router: 6.0.0-beta.0 || ^6.3.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: 64e2878fd517e63eb765a65c60f1276cc6a12e4abb128001ed92a1e634546c0ec9236cbb67c6b534ece126fe64b5fb251e985fe3e5f42ce4500b6108b9f7f889 + checksum: 8051bd38465f73c1d09c7a88fe86f3c32fcd8d32924d7a5c0100cad0b6fba5e48684dc4b15ebdbbdc8f351c9e05286e1546b0a4499ad1385848e205737354d89 languageName: node linkType: hard @@ -13448,90 +13492,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.28": - version: 1.3.28 - resolution: "@swc/core-darwin-arm64@npm:1.3.28" +"@swc/core-darwin-arm64@npm:1.3.30": + version: 1.3.30 + resolution: "@swc/core-darwin-arm64@npm:1.3.30" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.28": - version: 1.3.28 - resolution: "@swc/core-darwin-x64@npm:1.3.28" +"@swc/core-darwin-x64@npm:1.3.30": + version: 1.3.30 + resolution: "@swc/core-darwin-x64@npm:1.3.30" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.28": - version: 1.3.28 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.28" +"@swc/core-linux-arm-gnueabihf@npm:1.3.30": + version: 1.3.30 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.30" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.28": - version: 1.3.28 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.28" +"@swc/core-linux-arm64-gnu@npm:1.3.30": + version: 1.3.30 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.30" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.28": - version: 1.3.28 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.28" +"@swc/core-linux-arm64-musl@npm:1.3.30": + version: 1.3.30 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.30" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.28": - version: 1.3.28 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.28" +"@swc/core-linux-x64-gnu@npm:1.3.30": + version: 1.3.30 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.30" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.28": - version: 1.3.28 - resolution: "@swc/core-linux-x64-musl@npm:1.3.28" +"@swc/core-linux-x64-musl@npm:1.3.30": + version: 1.3.30 + resolution: "@swc/core-linux-x64-musl@npm:1.3.30" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.28": - version: 1.3.28 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.28" +"@swc/core-win32-arm64-msvc@npm:1.3.30": + version: 1.3.30 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.30" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.28": - version: 1.3.28 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.28" +"@swc/core-win32-ia32-msvc@npm:1.3.30": + version: 1.3.30 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.30" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.28": - version: 1.3.28 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.28" +"@swc/core-win32-x64-msvc@npm:1.3.30": + version: 1.3.30 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.30" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.9": - version: 1.3.28 - resolution: "@swc/core@npm:1.3.28" + version: 1.3.30 + resolution: "@swc/core@npm:1.3.30" dependencies: - "@swc/core-darwin-arm64": 1.3.28 - "@swc/core-darwin-x64": 1.3.28 - "@swc/core-linux-arm-gnueabihf": 1.3.28 - "@swc/core-linux-arm64-gnu": 1.3.28 - "@swc/core-linux-arm64-musl": 1.3.28 - "@swc/core-linux-x64-gnu": 1.3.28 - "@swc/core-linux-x64-musl": 1.3.28 - "@swc/core-win32-arm64-msvc": 1.3.28 - "@swc/core-win32-ia32-msvc": 1.3.28 - "@swc/core-win32-x64-msvc": 1.3.28 + "@swc/core-darwin-arm64": 1.3.30 + "@swc/core-darwin-x64": 1.3.30 + "@swc/core-linux-arm-gnueabihf": 1.3.30 + "@swc/core-linux-arm64-gnu": 1.3.30 + "@swc/core-linux-arm64-musl": 1.3.30 + "@swc/core-linux-x64-gnu": 1.3.30 + "@swc/core-linux-x64-musl": 1.3.30 + "@swc/core-win32-arm64-msvc": 1.3.30 + "@swc/core-win32-ia32-msvc": 1.3.30 + "@swc/core-win32-x64-msvc": 1.3.30 dependenciesMeta: "@swc/core-darwin-arm64": optional: true @@ -13553,7 +13597,7 @@ __metadata: optional: true "@swc/core-win32-x64-msvc": optional: true - checksum: bc96bb6cf476bf815d2f9308b280c119f8c8ecc4e9ba459322415d884c21dcad040ae8c69646811e598e0039ab497c8f15031c331fd6d13ea5bdf848b9c9f44f + checksum: 157a8ae43ebc73fa28d53e913fd7fc879289d5479ba5ea0c5e9abad0b379ca7e292d45f4f07bfd3ec0ff1998b55f300737724dfe463f1f7b361661e083db950c languageName: node linkType: hard @@ -14391,14 +14435,14 @@ __metadata: linkType: hard "@types/express@npm:*, @types/express@npm:^4.17.13, @types/express@npm:^4.17.15, @types/express@npm:^4.17.6": - version: 4.17.15 - resolution: "@types/express@npm:4.17.15" + version: 4.17.16 + resolution: "@types/express@npm:4.17.16" dependencies: "@types/body-parser": "*" "@types/express-serve-static-core": ^4.17.31 "@types/qs": "*" "@types/serve-static": "*" - checksum: b4acd8a836d4f6409cdf79b12d6e660485249b62500cccd61e7997d2f520093edf77d7f8498ca79d64a112c6434b6de5ca48039b8fde2c881679eced7e96979b + checksum: 43f3ed2cea6e5e83c7c1098c5152f644e975fd764443717ff9c812a1518416a9e7e9f824ffe852c118888cbfb994ed023cad08331f49b19ced469bb185cdd5cd languageName: node linkType: hard @@ -15756,6 +15800,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/scope-manager@npm:5.49.0": + version: 5.49.0 + resolution: "@typescript-eslint/scope-manager@npm:5.49.0" + dependencies: + "@typescript-eslint/types": 5.49.0 + "@typescript-eslint/visitor-keys": 5.49.0 + checksum: 466047e24ff8a4195f14aadde39375f22891bdaced09e58c89f2c32af0aa4a0d87e71a5f006f6ab76858e6f30c4b764b1e0ef7bc26713bb78add30638108c45f + languageName: node + linkType: hard + "@typescript-eslint/scope-manager@npm:5.9.0": version: 5.9.0 resolution: "@typescript-eslint/scope-manager@npm:5.9.0" @@ -15790,6 +15844,13 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/types@npm:5.49.0": + version: 5.49.0 + resolution: "@typescript-eslint/types@npm:5.49.0" + checksum: 41f72a043007fc3f3356b5a38d7bfa54871545b4a309810a062f044cff25122413a9660ce6d83d1221762f60d067351d020b0cb68f7e1279817f53e77ce8f33d + languageName: node + linkType: hard + "@typescript-eslint/types@npm:5.9.0": version: 5.9.0 resolution: "@typescript-eslint/types@npm:5.9.0" @@ -15815,6 +15876,24 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/typescript-estree@npm:5.49.0": + version: 5.49.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.49.0" + dependencies: + "@typescript-eslint/types": 5.49.0 + "@typescript-eslint/visitor-keys": 5.49.0 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + semver: ^7.3.7 + tsutils: ^3.21.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: f331af9f0ef3ce3157c421b8cc727dec5aa0a60add305aa4c676a02c63ec07799105268af192c5ed193a682b7ed804564d29d49bdbd2019678e495d80e65e29a + languageName: node + linkType: hard + "@typescript-eslint/typescript-estree@npm:5.9.0": version: 5.9.0 resolution: "@typescript-eslint/typescript-estree@npm:5.9.0" @@ -15833,7 +15912,7 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.48.1, @typescript-eslint/utils@npm:^5.10.0, @typescript-eslint/utils@npm:^5.13.0": +"@typescript-eslint/utils@npm:5.48.1": version: 5.48.1 resolution: "@typescript-eslint/utils@npm:5.48.1" dependencies: @@ -15851,6 +15930,24 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/utils@npm:^5.10.0, @typescript-eslint/utils@npm:^5.43.0": + version: 5.49.0 + resolution: "@typescript-eslint/utils@npm:5.49.0" + dependencies: + "@types/json-schema": ^7.0.9 + "@types/semver": ^7.3.12 + "@typescript-eslint/scope-manager": 5.49.0 + "@typescript-eslint/types": 5.49.0 + "@typescript-eslint/typescript-estree": 5.49.0 + eslint-scope: ^5.1.1 + eslint-utils: ^3.0.0 + semver: ^7.3.7 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 8218c566637d5104dfb2346216f8cb4c244f31c2a39e261aafe554b8abd48bd630a0d0807a0a8d776af8f9d9914c8776d86abf0a523049f3c5619c498a7e5b1e + languageName: node + linkType: hard + "@typescript-eslint/visitor-keys@npm:5.48.1": version: 5.48.1 resolution: "@typescript-eslint/visitor-keys@npm:5.48.1" @@ -15861,6 +15958,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/visitor-keys@npm:5.49.0": + version: 5.49.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.49.0" + dependencies: + "@typescript-eslint/types": 5.49.0 + eslint-visitor-keys: ^3.3.0 + checksum: 46dc7bc713e8825d1fccba521fdf7c6e2f8829e491c2afd44dbe4105c6432e3c3dfe7e1ecb221401269d639264bb4af77b60a7b65521fcff9ab02cd31d8ef782 + languageName: node + linkType: hard + "@typescript-eslint/visitor-keys@npm:5.9.0": version: 5.9.0 resolution: "@typescript-eslint/visitor-keys@npm:5.9.0" @@ -19397,7 +19504,7 @@ __metadata: languageName: node linkType: hard -"cosmiconfig-typescript-loader@npm:4.3.0": +"cosmiconfig-typescript-loader@npm:^4.3.0": version: 4.3.0 resolution: "cosmiconfig-typescript-loader@npm:4.3.0" peerDependencies: @@ -21649,32 +21756,32 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.16.0": - version: 0.16.16 - resolution: "esbuild@npm:0.16.16" +"esbuild@npm:^0.17.0": + version: 0.17.5 + resolution: "esbuild@npm:0.17.5" dependencies: - "@esbuild/android-arm": 0.16.16 - "@esbuild/android-arm64": 0.16.16 - "@esbuild/android-x64": 0.16.16 - "@esbuild/darwin-arm64": 0.16.16 - "@esbuild/darwin-x64": 0.16.16 - "@esbuild/freebsd-arm64": 0.16.16 - "@esbuild/freebsd-x64": 0.16.16 - "@esbuild/linux-arm": 0.16.16 - "@esbuild/linux-arm64": 0.16.16 - "@esbuild/linux-ia32": 0.16.16 - "@esbuild/linux-loong64": 0.16.16 - "@esbuild/linux-mips64el": 0.16.16 - "@esbuild/linux-ppc64": 0.16.16 - "@esbuild/linux-riscv64": 0.16.16 - "@esbuild/linux-s390x": 0.16.16 - "@esbuild/linux-x64": 0.16.16 - "@esbuild/netbsd-x64": 0.16.16 - "@esbuild/openbsd-x64": 0.16.16 - "@esbuild/sunos-x64": 0.16.16 - "@esbuild/win32-arm64": 0.16.16 - "@esbuild/win32-ia32": 0.16.16 - "@esbuild/win32-x64": 0.16.16 + "@esbuild/android-arm": 0.17.5 + "@esbuild/android-arm64": 0.17.5 + "@esbuild/android-x64": 0.17.5 + "@esbuild/darwin-arm64": 0.17.5 + "@esbuild/darwin-x64": 0.17.5 + "@esbuild/freebsd-arm64": 0.17.5 + "@esbuild/freebsd-x64": 0.17.5 + "@esbuild/linux-arm": 0.17.5 + "@esbuild/linux-arm64": 0.17.5 + "@esbuild/linux-ia32": 0.17.5 + "@esbuild/linux-loong64": 0.17.5 + "@esbuild/linux-mips64el": 0.17.5 + "@esbuild/linux-ppc64": 0.17.5 + "@esbuild/linux-riscv64": 0.17.5 + "@esbuild/linux-s390x": 0.17.5 + "@esbuild/linux-x64": 0.17.5 + "@esbuild/netbsd-x64": 0.17.5 + "@esbuild/openbsd-x64": 0.17.5 + "@esbuild/sunos-x64": 0.17.5 + "@esbuild/win32-arm64": 0.17.5 + "@esbuild/win32-ia32": 0.17.5 + "@esbuild/win32-x64": 0.17.5 dependenciesMeta: "@esbuild/android-arm": optional: true @@ -21722,7 +21829,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: d3163ec01e017776df6b68e1825caa2323918f0d03eb92250bdcdff80410a2c0eb5b3807955db84d83b1b91cf24af9815a1d19efc2343c490be3e5d7b27a834f + checksum: 31829b46a0cad65f58d90d39b66fd32a2de820539dd8530199975e417aa0ecd63cfc340e402f4f4e9235906a1a05969ddac1d4ad1ba611a3f11c0f62516b9390 languageName: node linkType: hard @@ -21916,8 +22023,8 @@ __metadata: linkType: hard "eslint-plugin-jsx-a11y@npm:^6.5.1": - version: 6.7.0 - resolution: "eslint-plugin-jsx-a11y@npm:6.7.0" + version: 6.7.1 + resolution: "eslint-plugin-jsx-a11y@npm:6.7.1" dependencies: "@babel/runtime": ^7.20.7 aria-query: ^5.1.3 @@ -21937,7 +22044,7 @@ __metadata: semver: ^6.3.0 peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: b7ea212bcf84912d264229e5e3cf255bc95a1193de1c7453d275a7afc959ce679c1bffb77cfd3d17f9b7105f41e0f62c8edb7f6d76985c79647edaa9f08aa814 + checksum: f166dd5fe7257c7b891c6692e6a3ede6f237a14043ae3d97581daf318fc5833ddc6b4871aa34ab7656187430170500f6d806895747ea17ecdf8231a666c3c2fd languageName: node linkType: hard @@ -21979,8 +22086,8 @@ __metadata: linkType: hard "eslint-plugin-react@npm:^7.28.0": - version: 7.32.1 - resolution: "eslint-plugin-react@npm:7.32.1" + version: 7.32.2 + resolution: "eslint-plugin-react@npm:7.32.2" dependencies: array-includes: ^3.1.6 array.prototype.flatmap: ^1.3.1 @@ -21999,18 +22106,18 @@ __metadata: string.prototype.matchall: ^4.0.8 peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: e20eab61161a3db6211c2bd1eb9be3e407fd14e72c06c5f39a078b6ac37427b2af6056ee70e3954249bca0a04088ae797a0c8ba909fb8802e29712de2a41262d + checksum: 2232b3b8945aa50b7773919c15cd96892acf35d2f82503667a79e2f55def90f728ed4f0e496f0f157acbe1bd4397c5615b676ae7428fe84488a544ca53feb944 languageName: node linkType: hard "eslint-plugin-testing-library@npm:^5.9.1": - version: 5.9.1 - resolution: "eslint-plugin-testing-library@npm:5.9.1" + version: 5.10.0 + resolution: "eslint-plugin-testing-library@npm:5.10.0" dependencies: - "@typescript-eslint/utils": ^5.13.0 + "@typescript-eslint/utils": ^5.43.0 peerDependencies: eslint: ^7.5.0 || ^8.0.0 - checksum: d09f9486945807e9587d52b6979117bc41b750df741567381a06219671096afb318696a0e0db63e253e150fead40e77ef9653ee00f1dda83fc8920e3b3c47107 + checksum: 3278fc4683a99d24ac2b6d2ed0359db1b0509674350e4b9a958a226f57b4b90e070c02e1f4c2806da885d8025c1e8c952cb9a5e9751e69baac3d12cfe6804000 languageName: node linkType: hard @@ -24083,7 +24190,7 @@ __metadata: languageName: node linkType: hard -"graphql-config@npm:4.4.0": +"graphql-config@npm:^4.4.0": version: 4.4.0 resolution: "graphql-config@npm:4.4.0" dependencies: @@ -24959,9 +25066,9 @@ __metadata: linkType: hard "immer@npm:^9.0.1, immer@npm:^9.0.7": - version: 9.0.18 - resolution: "immer@npm:9.0.18" - checksum: 85b3153dd01fce73c40591d0d6d7cd95878dab49f8ec4744c044adac05e0dab847b30c26259c478a5f87f974897be6df2780ff5bf86c8a0a27578fdeb300eb10 + version: 9.0.19 + resolution: "immer@npm:9.0.19" + checksum: f02ee53989989c287cd548a3d817fccf0bfe56db919755ee94a72ea3ae78a00363fba93ee6c010fe54a664380c29c53d44ed4091c6a86cae60957ad2cfabc010 languageName: node linkType: hard @@ -27124,15 +27231,15 @@ __metadata: linkType: hard "json-schema-library@npm:^7.3.9": - version: 7.4.4 - resolution: "json-schema-library@npm:7.4.4" + version: 7.4.5 + resolution: "json-schema-library@npm:7.4.5" dependencies: "@sagold/json-pointer": ^5.0.0 "@sagold/json-query": ^6.0.0 deepmerge: ^4.2.2 fast-deep-equal: ^3.1.3 valid-url: ^1.0.9 - checksum: e485c7f40bcfe04b96f457e02bc4ecb5bfe6b1d91df6a788909d1048a48bd51ecc5fe6bdd8759289a95c37fa63b3347b29d6d93f1b26a47f40cff21981d331d5 + checksum: 3e7a070ab81dca119ae259c71eec01f81a9287573c5e47de366d1ee48cf85c694fc5402a7c090947e3367cc9118bdbb34d1ce131135077f9f83b7387f6a0471c languageName: node linkType: hard @@ -30651,14 +30758,14 @@ __metadata: linkType: hard "openid-client@npm:^5.2.1, openid-client@npm:^5.3.0": - version: 5.3.1 - resolution: "openid-client@npm:5.3.1" + version: 5.3.2 + resolution: "openid-client@npm:5.3.2" dependencies: jose: ^4.10.0 lru-cache: ^6.0.0 object-hash: ^2.0.1 oidc-token-hash: ^5.0.1 - checksum: e8993cfe6ac55942fb7a5fc4db8ab88ab36bbcf2a6519993a9a2e288bfc248fcfb07804b6785eb7852a9eea0eec27f80ae57a29193c0b835f31f611b11b9bda1 + checksum: 59dc58d5b5cb795f3500f2d9d7ce604f6fb4c00623b16660fdf635d2789c3b2bb32e328ff10c918f9fa4e7fb269c768658d00769761d301be2d96d6150e07051 languageName: node linkType: hard @@ -33229,8 +33336,8 @@ __metadata: linkType: hard "react-markdown@npm:^8.0.0": - version: 8.0.4 - resolution: "react-markdown@npm:8.0.4" + version: 8.0.5 + resolution: "react-markdown@npm:8.0.5" dependencies: "@types/hast": ^2.0.0 "@types/prop-types": ^15.0.0 @@ -33243,14 +33350,14 @@ __metadata: remark-parse: ^10.0.0 remark-rehype: ^10.0.0 space-separated-tokens: ^2.0.0 - style-to-object: ^0.3.0 + style-to-object: ^0.4.0 unified: ^10.0.0 unist-util-visit: ^4.0.0 vfile: ^5.0.0 peerDependencies: "@types/react": ">=16" react: ">=16" - checksum: 9feec3734694ef05f450779a1adac10dbb768b8f3adbf4c81f59ca3cea8fd2f6a578fa4c488183597a7418f972715e5d84705cc76f278b55c86d622e82561bf8 + checksum: 9d11b7aba16216d590e56b4744e05d2925141bfb0f5885b3d9400ccf006cd24b79ce3b3d20af8a083a01324215b58fa4c5979e44f69d54123ff1dd5dacb0dc89 languageName: node linkType: hard @@ -36206,12 +36313,12 @@ __metadata: languageName: node linkType: hard -"style-to-object@npm:^0.3.0": - version: 0.3.0 - resolution: "style-to-object@npm:0.3.0" +"style-to-object@npm:^0.4.0": + version: 0.4.1 + resolution: "style-to-object@npm:0.4.1" dependencies: inline-style-parser: 0.1.1 - checksum: 4d7084015207f2a606dfc10c29cb5ba569f2fe8005551df7396110dd694d6ff650f2debafa95bd5d147dfb4ca50f57868e2a7f91bf5d11ef734fe7ccbd7abf59 + checksum: 2ea213e98eed21764ae1d1dc9359231a9f2d480d6ba55344c4c15eb275f0809f1845786e66d4caf62414a5cc8f112ce9425a58d251c77224060373e0db48f8c2 languageName: node linkType: hard @@ -36461,13 +36568,13 @@ __metadata: linkType: hard "swr@npm:^2.0.0": - version: 2.0.1 - resolution: "swr@npm:2.0.1" + version: 2.0.3 + resolution: "swr@npm:2.0.3" dependencies: use-sync-external-store: ^1.2.0 peerDependencies: react: ^16.11.0 || ^17.0.0 || ^18.0.0 - checksum: 5466e46a80bccf722c212ea3f14668b4e7f047d958f3da7252fba3529e6b1773a1762aa4bbf43aec104cc50625dbd55380539eeef59fd5ad9ebca6ad0552f45d + checksum: 968071e3336b81194879fd94553777793314e773cd2a27665617131403dca6b7e4d3697ab00d0b0aa456c107c0c8d86f9ce52bac22f8533e8421099870d46b17 languageName: node linkType: hard @@ -36596,7 +36703,7 @@ __metadata: "@backstage/plugin-techdocs-react": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" - "@material-ui/core": ^4.11.0 + "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3