diff --git a/.changeset/empty-clocks-argue.md b/.changeset/empty-clocks-argue.md new file mode 100644 index 0000000000..e3c5985f8a --- /dev/null +++ b/.changeset/empty-clocks-argue.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-app-api': patch +--- + +Fixed bug in `AppRouter` to determine the correct `signOutTargetUrl` if `app.baseUrl` contains a `basePath` diff --git a/.changeset/heavy-plants-doubt.md b/.changeset/heavy-plants-doubt.md new file mode 100644 index 0000000000..3988a16752 --- /dev/null +++ b/.changeset/heavy-plants-doubt.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-user-settings': patch +--- + +Added experimental support for declarative integration via the `/alpha` subpath. diff --git a/.changeset/itchy-rabbits-exist.md b/.changeset/itchy-rabbits-exist.md index acac771a97..6a16ac5648 100644 --- a/.changeset/itchy-rabbits-exist.md +++ b/.changeset/itchy-rabbits-exist.md @@ -2,6 +2,6 @@ '@backstage/cli': minor --- -The new backend start command that used to be enabled by setting `EXPERIMENTAL_BACKEND_START` is now the default. To revert to the old behavior, set `LEGACY_BACKEND_START` instead. +**BREAKING** The new backend start command that used to be enabled by setting `EXPERIMENTAL_BACKEND_START` is now the default. To revert to the old behavior set `LEGACY_BACKEND_START`, which is recommended if you haven't migrated to the new backend system. This new command is no longer based on Webpack, but instead uses Node.js loaders to transpile on the fly. Rather than hot reloading modules the entire backend is now restarted on change, but the SQLite database state is still maintained across restarts via a parent process. diff --git a/.changeset/light-squids-deny.md b/.changeset/light-squids-deny.md new file mode 100644 index 0000000000..07a124bed3 --- /dev/null +++ b/.changeset/light-squids-deny.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-catalog-graphql': minor +'@backstage/plugin-graphql-backend': minor +--- + +This package has been deprecated, consider using [@frontside/backstage-plugin-graphql-backend](https://www.npmjs.com/package/@frontside/backstage-plugin-graphql-backend) instead. diff --git a/.changeset/long-owls-complain.md b/.changeset/long-owls-complain.md new file mode 100644 index 0000000000..f96b0f0987 --- /dev/null +++ b/.changeset/long-owls-complain.md @@ -0,0 +1,5 @@ +--- +'@backstage/frontend-app-api': patch +--- + +Fixed an issue preventing the routing system to match subroutes diff --git a/.changeset/many-impalas-wait.md b/.changeset/many-impalas-wait.md new file mode 100644 index 0000000000..843adf66a1 --- /dev/null +++ b/.changeset/many-impalas-wait.md @@ -0,0 +1,5 @@ +--- +'@backstage/frontend-plugin-api': patch +--- + +Plugins can now be assigned `routes` and `externalRoutes` when created. diff --git a/.changeset/modern-owls-mate.md b/.changeset/modern-owls-mate.md new file mode 100644 index 0000000000..bed33c6bbc --- /dev/null +++ b/.changeset/modern-owls-mate.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs': minor +--- + +Added experimental support for declarative integration via the `/alpha` subpath. diff --git a/.changeset/olive-islands-sneeze.md b/.changeset/olive-islands-sneeze.md new file mode 100644 index 0000000000..b44f071acc --- /dev/null +++ b/.changeset/olive-islands-sneeze.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-catalog-backend-module-github': patch +'@backstage/cli': patch +--- + +Request slightly smaller pages of data from GitHub diff --git a/.changeset/orange-cycles-wait.md b/.changeset/orange-cycles-wait.md new file mode 100644 index 0000000000..5e71b69e80 --- /dev/null +++ b/.changeset/orange-cycles-wait.md @@ -0,0 +1,5 @@ +--- +'@backstage/frontend-app-api': patch +--- + +Added the `bindRoutes` option to `createApp`. diff --git a/.changeset/rare-glasses-play.md b/.changeset/rare-glasses-play.md new file mode 100644 index 0000000000..7613f6f1bc --- /dev/null +++ b/.changeset/rare-glasses-play.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-react': patch +--- + +Handle mixed decimals and bigint when calculating k8s resource usage diff --git a/.changeset/red-baboons-warn.md b/.changeset/red-baboons-warn.md new file mode 100644 index 0000000000..80b7cd3cad --- /dev/null +++ b/.changeset/red-baboons-warn.md @@ -0,0 +1,5 @@ +--- +'@backstage/dev-utils': patch +--- + +Moving development `dependencies` to `devDependencies` diff --git a/.changeset/renovate-0a0b7ba.md b/.changeset/renovate-0a0b7ba.md new file mode 100644 index 0000000000..dd43bcc8fa --- /dev/null +++ b/.changeset/renovate-0a0b7ba.md @@ -0,0 +1,8 @@ +--- +'@backstage/backend-common': patch +'@backstage/plugin-kubernetes-backend': patch +'@backstage/plugin-kubernetes-common': patch +'@backstage/plugin-kubernetes': patch +--- + +Updated dependency `@kubernetes/client-node` to `0.19.0`. diff --git a/.changeset/renovate-2633beb.md b/.changeset/renovate-2633beb.md new file mode 100644 index 0000000000..ff4c574c85 --- /dev/null +++ b/.changeset/renovate-2633beb.md @@ -0,0 +1,104 @@ +--- +'@backstage/app-defaults': patch +'@backstage/core-app-api': patch +'@backstage/core-components': patch +'@backstage/core-plugin-api': patch +'@backstage/dev-utils': patch +'@backstage/frontend-app-api': patch +'@backstage/frontend-plugin-api': patch +'@backstage/integration-react': patch +'@backstage/test-utils': patch +'@backstage/version-bridge': patch +'@backstage/plugin-adr': patch +'@backstage/plugin-airbrake': patch +'@backstage/plugin-allure': patch +'@backstage/plugin-analytics-module-ga': patch +'@backstage/plugin-analytics-module-ga4': patch +'@backstage/plugin-analytics-module-newrelic-browser': patch +'@backstage/plugin-apache-airflow': patch +'@backstage/plugin-api-docs-module-protoc-gen-doc': patch +'@backstage/plugin-api-docs': patch +'@backstage/plugin-apollo-explorer': patch +'@backstage/plugin-azure-devops': patch +'@backstage/plugin-azure-sites': patch +'@backstage/plugin-badges': patch +'@backstage/plugin-bazaar': patch +'@backstage/plugin-bitrise': patch +'@backstage/plugin-catalog-graph': patch +'@backstage/plugin-catalog-import': patch +'@backstage/plugin-catalog-react': patch +'@backstage/plugin-catalog-unprocessed-entities': patch +'@backstage/plugin-catalog': patch +'@backstage/plugin-circleci': patch +'@backstage/plugin-cloudbuild': patch +'@backstage/plugin-code-climate': patch +'@backstage/plugin-code-coverage': patch +'@backstage/plugin-codescene': patch +'@backstage/plugin-config-schema': patch +'@backstage/plugin-cost-insights': patch +'@backstage/plugin-devtools': patch +'@backstage/plugin-dynatrace': patch +'@backstage/plugin-entity-feedback': patch +'@backstage/plugin-entity-validation': patch +'@backstage/plugin-explore-react': patch +'@backstage/plugin-explore': patch +'@backstage/plugin-firehydrant': patch +'@backstage/plugin-fossa': patch +'@backstage/plugin-gcalendar': patch +'@backstage/plugin-gcp-projects': patch +'@backstage/plugin-git-release-manager': patch +'@backstage/plugin-github-actions': patch +'@backstage/plugin-github-deployments': patch +'@backstage/plugin-github-issues': patch +'@backstage/plugin-github-pull-requests-board': patch +'@backstage/plugin-gitops-profiles': patch +'@backstage/plugin-gocd': patch +'@backstage/plugin-graphiql': patch +'@backstage/plugin-graphql-voyager': patch +'@backstage/plugin-home-react': patch +'@backstage/plugin-home': patch +'@backstage/plugin-ilert': patch +'@backstage/plugin-jenkins': patch +'@backstage/plugin-kafka': patch +'@backstage/plugin-kubernetes-cluster': patch +'@backstage/plugin-kubernetes-react': patch +'@backstage/plugin-kubernetes': patch +'@backstage/plugin-lighthouse': patch +'@backstage/plugin-linguist': patch +'@backstage/plugin-microsoft-calendar': patch +'@backstage/plugin-newrelic-dashboard': patch +'@backstage/plugin-newrelic': patch +'@backstage/plugin-nomad': patch +'@backstage/plugin-octopus-deploy': patch +'@backstage/plugin-opencost': patch +'@backstage/plugin-org-react': patch +'@backstage/plugin-org': patch +'@backstage/plugin-pagerduty': patch +'@backstage/plugin-periskop': patch +'@backstage/plugin-permission-react': patch +'@backstage/plugin-playlist': patch +'@backstage/plugin-puppetdb': patch +'@backstage/plugin-rollbar': patch +'@backstage/plugin-scaffolder-react': patch +'@backstage/plugin-scaffolder': patch +'@backstage/plugin-search-react': patch +'@backstage/plugin-search': patch +'@backstage/plugin-sentry': patch +'@backstage/plugin-shortcuts': patch +'@backstage/plugin-sonarqube': patch +'@backstage/plugin-splunk-on-call': patch +'@backstage/plugin-stack-overflow': patch +'@backstage/plugin-stackstorm': patch +'@backstage/plugin-tech-insights': patch +'@backstage/plugin-tech-radar': patch +'@backstage/plugin-techdocs-addons-test-utils': patch +'@backstage/plugin-techdocs-module-addons-contrib': patch +'@backstage/plugin-techdocs-react': patch +'@backstage/plugin-techdocs': patch +'@backstage/plugin-todo': patch +'@backstage/plugin-user-settings': patch +'@backstage/plugin-vault': patch +'@backstage/plugin-xcmetrics': patch +--- + +Updated dependency `@testing-library/jest-dom` to `^6.0.0`. diff --git a/.changeset/renovate-37d5549.md b/.changeset/renovate-37d5549.md new file mode 100644 index 0000000000..4aae56e839 --- /dev/null +++ b/.changeset/renovate-37d5549.md @@ -0,0 +1,86 @@ +--- +'@backstage/core-app-api': patch +'@backstage/core-components': patch +'@backstage/core-plugin-api': patch +'@backstage/dev-utils': patch +'@backstage/integration-react': patch +'@backstage/plugin-adr': patch +'@backstage/plugin-airbrake': patch +'@backstage/plugin-allure': patch +'@backstage/plugin-analytics-module-ga': patch +'@backstage/plugin-analytics-module-ga4': patch +'@backstage/plugin-apache-airflow': patch +'@backstage/plugin-api-docs': patch +'@backstage/plugin-apollo-explorer': patch +'@backstage/plugin-azure-devops': patch +'@backstage/plugin-azure-sites': patch +'@backstage/plugin-bitrise': patch +'@backstage/plugin-catalog-graph': patch +'@backstage/plugin-catalog-import': patch +'@backstage/plugin-catalog-react': patch +'@backstage/plugin-catalog': patch +'@backstage/plugin-circleci': patch +'@backstage/plugin-cloudbuild': patch +'@backstage/plugin-code-climate': patch +'@backstage/plugin-code-coverage': patch +'@backstage/plugin-codescene': patch +'@backstage/plugin-config-schema': patch +'@backstage/plugin-cost-insights': patch +'@backstage/plugin-dynatrace': patch +'@backstage/plugin-entity-feedback': patch +'@backstage/plugin-entity-validation': patch +'@backstage/plugin-explore-react': patch +'@backstage/plugin-explore': patch +'@backstage/plugin-firehydrant': patch +'@backstage/plugin-fossa': patch +'@backstage/plugin-gcalendar': patch +'@backstage/plugin-gcp-projects': patch +'@backstage/plugin-git-release-manager': patch +'@backstage/plugin-github-actions': patch +'@backstage/plugin-github-deployments': patch +'@backstage/plugin-github-issues': patch +'@backstage/plugin-github-pull-requests-board': patch +'@backstage/plugin-gitops-profiles': patch +'@backstage/plugin-gocd': patch +'@backstage/plugin-graphiql': patch +'@backstage/plugin-graphql-voyager': patch +'@backstage/plugin-home-react': patch +'@backstage/plugin-home': patch +'@backstage/plugin-ilert': patch +'@backstage/plugin-jenkins': patch +'@backstage/plugin-kafka': patch +'@backstage/plugin-kubernetes-cluster': patch +'@backstage/plugin-kubernetes': patch +'@backstage/plugin-lighthouse': patch +'@backstage/plugin-linguist': patch +'@backstage/plugin-microsoft-calendar': patch +'@backstage/plugin-newrelic': patch +'@backstage/plugin-octopus-deploy': patch +'@backstage/plugin-org-react': patch +'@backstage/plugin-org': patch +'@backstage/plugin-pagerduty': patch +'@backstage/plugin-periskop': patch +'@backstage/plugin-playlist': patch +'@backstage/plugin-rollbar': patch +'@backstage/plugin-scaffolder-react': patch +'@backstage/plugin-scaffolder': patch +'@backstage/plugin-search-react': patch +'@backstage/plugin-search': patch +'@backstage/plugin-sentry': patch +'@backstage/plugin-shortcuts': patch +'@backstage/plugin-sonarqube': patch +'@backstage/plugin-splunk-on-call': patch +'@backstage/plugin-stack-overflow': patch +'@backstage/plugin-stackstorm': patch +'@backstage/plugin-tech-insights': patch +'@backstage/plugin-tech-radar': patch +'@backstage/plugin-techdocs-addons-test-utils': patch +'@backstage/plugin-techdocs-module-addons-contrib': patch +'@backstage/plugin-techdocs': patch +'@backstage/plugin-todo': patch +'@backstage/plugin-user-settings': patch +'@backstage/plugin-vault': patch +'@backstage/plugin-xcmetrics': patch +--- + +Updated dependency `@testing-library/dom` to `^9.0.0`. diff --git a/.changeset/renovate-a6a783f.md b/.changeset/renovate-a6a783f.md new file mode 100644 index 0000000000..a4c6188ee6 --- /dev/null +++ b/.changeset/renovate-a6a783f.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-kubernetes': patch +--- + +Updated dependency `xterm-addon-attach` to `^0.9.0`. +Updated dependency `xterm-addon-fit` to `^0.8.0`. diff --git a/.changeset/shiny-birds-melt.md b/.changeset/shiny-birds-melt.md new file mode 100644 index 0000000000..16591b6d2f --- /dev/null +++ b/.changeset/shiny-birds-melt.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-app-api': patch +--- + +Fixed a bug in `TranslationApi` implementation where in some cases it wouldn't notify subscribers of language changes. diff --git a/.changeset/silent-years-marry.md b/.changeset/silent-years-marry.md new file mode 100644 index 0000000000..6053261784 --- /dev/null +++ b/.changeset/silent-years-marry.md @@ -0,0 +1,8 @@ +--- +'@backstage/plugin-kubernetes-backend': minor +--- + +**BREAKING** Allow passing undefined `labelSelector` to `KubernetesFetcher` + +`KubernetesFetch` no longer auto-adds `labelSelector` when empty string was passed. +This is only applicable if you have custom ObjectProvider implementation, as build-in `KubernetesFanOutHandler` already does this diff --git a/.changeset/swift-kings-add.md b/.changeset/swift-kings-add.md new file mode 100644 index 0000000000..9e9c158eec --- /dev/null +++ b/.changeset/swift-kings-add.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-newrelic-dashboard': patch +--- + +Fix the styles for NewRelicDashboard, add more responsiveness diff --git a/.changeset/tiny-suns-deny.md b/.changeset/tiny-suns-deny.md new file mode 100644 index 0000000000..b00830c75c --- /dev/null +++ b/.changeset/tiny-suns-deny.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Bump dev dependencies `lerna@7.3.0` on the template diff --git a/.changeset/twelve-snakes-sell.md b/.changeset/twelve-snakes-sell.md new file mode 100644 index 0000000000..7f91b2910f --- /dev/null +++ b/.changeset/twelve-snakes-sell.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-search-backend': patch +--- + +Set the default length limit to search query to 100. To override it, define `search.maxTermLength` in the config file. diff --git a/.changeset/wild-toys-arrive.md b/.changeset/wild-toys-arrive.md new file mode 100644 index 0000000000..4aad036a96 --- /dev/null +++ b/.changeset/wild-toys-arrive.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-newrelic-dashboard': minor +--- + +Add storybook for newrelic-dashboard plugin. diff --git a/.github/vale/Vocab/Backstage/accept.txt b/.github/vale/Vocab/Backstage/accept.txt index aadbaa3985..e6c0aa9632 100644 --- a/.github/vale/Vocab/Backstage/accept.txt +++ b/.github/vale/Vocab/Backstage/accept.txt @@ -25,6 +25,7 @@ backend's backported backporting BEPs +bigint Bigtable Billett bitbucket @@ -453,4 +454,4 @@ zsh Pulumi Lightsail PR -rebasing \ No newline at end of file +rebasing diff --git a/.gitignore b/.gitignore index 7149dbabc1..c0ef0d2001 100644 --- a/.gitignore +++ b/.gitignore @@ -159,4 +159,7 @@ e2e-test-report/ # VS Code backing up svg files *svg.bkp -*svg.dtmp \ No newline at end of file +*svg.dtmp + +# Scripts +plugins-report.csv \ No newline at end of file diff --git a/docs/features/software-catalog/configuration.md b/docs/features/software-catalog/configuration.md index bd914cc56c..97c75a01ff 100644 --- a/docs/features/software-catalog/configuration.md +++ b/docs/features/software-catalog/configuration.md @@ -44,6 +44,20 @@ When multiple `catalog-info.yaml` files with the same `metadata.name` property are discovered, one will be processed and all others will be skipped. This action is logged for further investigation. +### Local File (`type: file`) Configurations + +In addition to url locations, you can use the `file` location type to bring in content from the local file system. You should only use this for local development, test setups and example data, not for production data. +You are also not able to use placeholders in them like `$text`. You can however reference other files relative to the current file. See the full [catalog example data set here](https://github.com/backstage/backstage/tree/master/packages/catalog-model/examples) for an extensive example. + +Here is an example pulling in the `all.yaml` file from the examples folder. Note the use of `../../` to go up two levels from the current execution path of the backend. This is typically `packages/backend/`. + +```yaml +catalog: + locations: + - type: file + target: ../../examples/all.yaml +``` + ### Integration Processors Integrations may simply provide a mechanism to handle `url` location type for an diff --git a/docs/features/software-templates/input-examples.md b/docs/features/software-templates/input-examples.md index c44ee39269..ad56ef2d36 100644 --- a/docs/features/software-templates/input-examples.md +++ b/docs/features/software-templates/input-examples.md @@ -110,10 +110,11 @@ parameters: arrayObjects: title: Array with custom objects type: array + minItems: 0 ui:options: - addable: false - orderable: false - removable: false + addable: true + orderable: true + removable: true items: type: object properties: diff --git a/docs/features/techdocs/how-to-guides.md b/docs/features/techdocs/how-to-guides.md index 8c98ec48d4..6a70e9e2aa 100644 --- a/docs/features/techdocs/how-to-guides.md +++ b/docs/features/techdocs/how-to-guides.md @@ -525,6 +525,39 @@ techdocs: This way, all iframes where the host in the src attribute is in the `sanitizer.allowedIframeHosts` list will be displayed. +## How to render PlantUML diagram in TechDocs + +PlantUML allows you to create diagrams from plain text language. Each diagram description begins with the keyword - (@startXYZ and @endXYZ, depending on the kind of diagram). For UML Diagrams, Keywords @startuml & @enduml should be used. Further details for all types of diagrams can be found at [PlantUML Language Reference Guide](https://plantuml.com/guide). + +### UML Diagram Details:- + +#### Embedded PlantUML Diagram Example + +Here, the markdown file itself contains the diagram description. + +````md +```plantuml +@startuml +title Login Sequence + ComponentA->ComponentB: Login Request + note right of ComponentB: ComponentB logs message + ComponentB->ComponentA: Login Response +@enduml +``` +```` + +#### Referenced PlantUML Diagram Example + +Here, the markdown file refers to another file (_.puml or _.pu) which contains the diagram description. + +````md +```plantuml +!include umldiagram.puml +``` +```` + +Note: To refer external diagram files, we need to include the diagrams directory in the path. Please refer [`Dockerfile`](https://github.com/backstage/techdocs-container/blob/main/Dockerfile) for details. + ## How to add Mermaid support in TechDocs To add `Mermaid` support in TechDocs, you can use [`kroki`](https://kroki.io) diff --git a/docs/releases/v1.19.0-next.0-changelog.md b/docs/releases/v1.19.0-next.0-changelog.md index d1861165b9..b1c85e238e 100644 --- a/docs/releases/v1.19.0-next.0-changelog.md +++ b/docs/releases/v1.19.0-next.0-changelog.md @@ -4,7 +4,7 @@ ### Minor Changes -- 7077dbf131: The new backend start command that used to be enabled by setting `EXPERIMENTAL_BACKEND_START` is now the default. To revert to the old behavior, set `LEGACY_BACKEND_START` instead. +- 7077dbf131: **BREAKING** The new backend start command that used to be enabled by setting `EXPERIMENTAL_BACKEND_START` is now the default. To revert to the old behavior set `LEGACY_BACKEND_START`, which is recommended if you haven't migrated to the new backend system. This new command is no longer based on Webpack, but instead uses Node.js loaders to transpile on the fly. Rather than hot reloading modules the entire backend is now restarted on change, but the SQLite database state is still maintained across restarts via a parent process. diff --git a/microsite/yarn.lock b/microsite/yarn.lock index 9edcca323c..835727014c 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -10810,15 +10810,15 @@ __metadata: linkType: hard "sass@npm:^1.57.1": - version: 1.69.2 - resolution: "sass@npm:1.69.2" + version: 1.69.3 + resolution: "sass@npm:1.69.3" dependencies: chokidar: ">=3.0.0 <4.0.0" immutable: ^4.0.0 source-map-js: ">=0.6.2 <2.0.0" bin: sass: sass.js - checksum: 25c6aaf993a40ce33e66c6c3a25690ce573a3c890024ba3dea5416a17c7db6ec39542d4b4e62c2c429005737630d6b48ab841f99fd534ac1b441f37d2c34e0c4 + checksum: b89a3370c7ede462b344e2136bf1407bf375855c1ec54f73b6257b18fe59dae5377eb9f7b25f21ae4a25d8f0bc41a165d8d7e5f693d8285b1aa51ac6056c4d19 languageName: node linkType: hard diff --git a/package.json b/package.json index bad49ab55f..b50e087aa7 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "build:api-reports": "yarn build:api-reports:only --tsc", "build:api-reports:only": "backstage-repo-tools api-reports --allow-warnings 'packages/core-components,plugins/+(catalog|catalog-import|git-release-manager|jenkins|kubernetes)' -o ae-wrong-input-file-type --validate-release-tags", "build:api-docs": "LANG=en_EN yarn build:api-reports --docs", + "build:plugins-report": "node ./scripts/build-plugins-report", "tsc": "tsc", "tsc:full": "backstage-cli repo clean && tsc --skipLibCheck false --incremental false", "clean": "backstage-cli repo clean", diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json index 79b0c14b17..7695d128e7 100644 --- a/packages/app-defaults/package.json +++ b/packages/app-defaults/package.json @@ -49,7 +49,7 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/test-utils": "workspace:^", - "@testing-library/jest-dom": "^5.10.1", + "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^12.1.3", "@types/react": "^16.13.1 || ^17.0.0" }, diff --git a/packages/app-next-example-plugin/api-report.md b/packages/app-next-example-plugin/api-report.md index 68a0471b6b..83449a102f 100644 --- a/packages/app-next-example-plugin/api-report.md +++ b/packages/app-next-example-plugin/api-report.md @@ -3,11 +3,13 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts +import { AnyExternalRoutes } from '@backstage/core-plugin-api'; +import { AnyRoutes } from '@backstage/core-plugin-api'; import { BackstagePlugin } from '@backstage/frontend-plugin-api'; import { default as React_2 } from 'react'; // @public (undocumented) -const examplePlugin: BackstagePlugin; +const examplePlugin: BackstagePlugin; export default examplePlugin; // @public (undocumented) diff --git a/packages/app-next/package.json b/packages/app-next/package.json index b7fc704476..b1d158fb9f 100644 --- a/packages/app-next/package.json +++ b/packages/app-next/package.json @@ -98,8 +98,8 @@ }, "devDependencies": { "@backstage/test-utils": "workspace:^", - "@testing-library/dom": "^8.0.0", - "@testing-library/jest-dom": "^5.10.1", + "@testing-library/dom": "^9.0.0", + "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/jquery": "^3.3.34", diff --git a/packages/app-next/src/App.tsx b/packages/app-next/src/App.tsx index 01353feb4f..4d72cca14f 100644 --- a/packages/app-next/src/App.tsx +++ b/packages/app-next/src/App.tsx @@ -14,10 +14,18 @@ * limitations under the License. */ +import React from 'react'; import { createApp } from '@backstage/frontend-app-api'; import { pagesPlugin } from './examples/pagesPlugin'; import graphiqlPlugin from '@backstage/plugin-graphiql/alpha'; import techRadarPlugin from '@backstage/plugin-tech-radar/alpha'; +import userSettingsPlugin from '@backstage/plugin-user-settings/alpha'; +import { + createExtensionOverrides, + createPageExtension, +} from '@backstage/frontend-plugin-api'; +import { entityRouteRef } from '@backstage/plugin-catalog-react'; +import techdocsPlugin from '@backstage/plugin-techdocs/alpha'; /* @@ -48,16 +56,27 @@ TODO: /* app.tsx */ +const entityPageExtension = createPageExtension({ + id: 'catalog:entity', + defaultPath: '/catalog/:namespace/:kind/:name', + routeRef: entityRouteRef, + loader: async () =>
Just a temporary mocked entity page
, +}); + const app = createApp({ - features: [graphiqlPlugin, pagesPlugin, techRadarPlugin], - // bindRoutes({ bind }) { - // bind(catalogPlugin.externalRoutes, { - // createComponent: scaffolderPlugin.routes.root, - // }); - // bind(scaffolderPlugin.externalRoutes, { - // registerComponent: catalogImportPlugin.routes.importPage, - // }); - // }, + features: [ + graphiqlPlugin, + pagesPlugin, + techRadarPlugin, + techdocsPlugin, + userSettingsPlugin, + createExtensionOverrides({ + extensions: [entityPageExtension], + }), + ], + bindRoutes({ bind }) { + bind(pagesPlugin.externalRoutes, { pageX: pagesPlugin.routes.pageX }); + }, }); // const legacyApp = createLegacyApp({ plugins: [legacyGraphiqlPlugin] }); diff --git a/packages/app-next/src/examples/pagesPlugin.tsx b/packages/app-next/src/examples/pagesPlugin.tsx index 1ec1cfa5a1..ef6b55ff4c 100644 --- a/packages/app-next/src/examples/pagesPlugin.tsx +++ b/packages/app-next/src/examples/pagesPlugin.tsx @@ -20,11 +20,17 @@ import { createPageExtension, createPlugin, } from '@backstage/frontend-plugin-api'; -import { useRouteRef, createRouteRef } from '@backstage/core-plugin-api'; +import { + useRouteRef, + createRouteRef, + createExternalRouteRef, +} from '@backstage/core-plugin-api'; import { Route, Routes } from 'react-router-dom'; const indexRouteRef = createRouteRef({ id: 'index' }); const page1RouteRef = createRouteRef({ id: 'page1' }); +export const externalPageXRouteRef = createExternalRouteRef({ id: 'pageX' }); +export const pageXRouteRef = createRouteRef({ id: 'pageX' }); // const page2RouteRef = createSubRouteRef({ // id: 'page2', // parent: page1RouteRef, @@ -50,6 +56,9 @@ const IndexPage = createPageExtension({
Search
+
+ Settings +
); }; @@ -64,6 +73,7 @@ const Page1 = createPageExtension({ loader: async () => { const Component = () => { const indexLink = useRouteRef(indexRouteRef); + const xLink = useRouteRef(externalPageXRouteRef); // const page2Link = useRouteRef(page2RouteRef); return ( @@ -72,6 +82,7 @@ const Page1 = createPageExtension({ Go back Page 2 {/* Page 2 */} + Page X
Sub-page content: @@ -89,6 +100,26 @@ const Page1 = createPageExtension({ }, }); +const ExternalPage = createPageExtension({ + id: 'pageX', + defaultPath: '/pageX', + routeRef: pageXRouteRef, + loader: async () => { + const Component = () => { + const indexLink = useRouteRef(indexRouteRef); + // const pageXLink = useRouteRef(pageXRouteRef); + + return ( +
+

This is page X

+ Go back +
+ ); + }; + return ; + }, +}); + export const pagesPlugin = createPlugin({ id: 'pages', // routes: { @@ -98,5 +129,12 @@ export const pagesPlugin = createPlugin({ // // OR // // 'page1' // }, - extensions: [IndexPage, Page1], + routes: { + page1: page1RouteRef, + pageX: pageXRouteRef, + }, + externalRoutes: { + pageX: externalPageXRouteRef, + }, + extensions: [IndexPage, Page1, ExternalPage], }); diff --git a/packages/app/package.json b/packages/app/package.json index b8ecc84b9d..ce344d1aa9 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -104,8 +104,8 @@ "devDependencies": { "@backstage/test-utils": "workspace:^", "@playwright/test": "^1.32.3", - "@testing-library/dom": "^8.0.0", - "@testing-library/jest-dom": "^5.10.1", + "@testing-library/dom": "^9.0.0", + "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/jquery": "^3.3.34", diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index 0191c67a55..9ca46d9473 100644 --- a/packages/backend-common/package.json +++ b/packages/backend-common/package.json @@ -67,7 +67,7 @@ "@google-cloud/storage": "^6.0.0", "@keyv/memcache": "^1.3.5", "@keyv/redis": "^2.5.3", - "@kubernetes/client-node": "0.18.1", + "@kubernetes/client-node": "0.19.0", "@manypkg/get-packages": "^1.1.3", "@octokit/rest": "^19.0.3", "@types/cors": "^2.8.6", diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index b22f7d2983..8df01b050e 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -55,7 +55,6 @@ import search from './plugins/search'; import techdocs from './plugins/techdocs'; import techInsights from './plugins/techInsights'; import todo from './plugins/todo'; -import graphql from './plugins/graphql'; import app from './plugins/app'; import badges from './plugins/badges'; import jenkins from './plugins/jenkins'; @@ -155,7 +154,6 @@ async function main() { const todoEnv = useHotMemoize(module, () => createEnv('todo')); const kubernetesEnv = useHotMemoize(module, () => createEnv('kubernetes')); const kafkaEnv = useHotMemoize(module, () => createEnv('kafka')); - const graphqlEnv = useHotMemoize(module, () => createEnv('graphql')); const appEnv = useHotMemoize(module, () => createEnv('app')); const badgesEnv = useHotMemoize(module, () => createEnv('badges')); const jenkinsEnv = useHotMemoize(module, () => createEnv('jenkins')); @@ -190,7 +188,6 @@ async function main() { apiRouter.use('/kubernetes', await kubernetes(kubernetesEnv)); apiRouter.use('/kafka', await kafka(kafkaEnv)); apiRouter.use('/proxy', await proxy(proxyEnv)); - apiRouter.use('/graphql', await graphql(graphqlEnv)); apiRouter.use('/badges', await badges(badgesEnv)); apiRouter.use('/jenkins', await jenkins(jenkinsEnv)); apiRouter.use('/permission', await permission(permissionEnv)); diff --git a/packages/backend/src/plugins/graphql.ts b/packages/backend/src/plugins/graphql.ts deleted file mode 100644 index c9aafa70ff..0000000000 --- a/packages/backend/src/plugins/graphql.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * 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 { createRouter } from '@backstage/plugin-graphql-backend'; -import { Router } from 'express'; -import { PluginEnvironment } from '../types'; - -export default async function createPlugin( - env: PluginEnvironment, -): Promise { - return await createRouter({ - logger: env.logger, - config: env.config, - }); -} diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index da412a58a1..a3a6b005c0 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -61,7 +61,7 @@ ### Minor Changes -- 7077dbf131: The new backend start command that used to be enabled by setting `EXPERIMENTAL_BACKEND_START` is now the default. To revert to the old behavior, set `LEGACY_BACKEND_START` instead. +- 7077dbf131: **BREAKING** The new backend start command that used to be enabled by setting `EXPERIMENTAL_BACKEND_START` is now the default. To revert to the old behavior set `LEGACY_BACKEND_START`, which is recommended if you haven't migrated to the new backend system. This new command is no longer based on Webpack, but instead uses Node.js loaders to transpile on the fly. Rather than hot reloading modules the entire backend is now restarted on change, but the SQLite database state is still maintained across restarts via a parent process. diff --git a/packages/cli/src/commands/onboard/discovery/providers/github/GithubDiscoveryProvider.ts b/packages/cli/src/commands/onboard/discovery/providers/github/GithubDiscoveryProvider.ts index d5a3dc4a77..a24756edd7 100644 --- a/packages/cli/src/commands/onboard/discovery/providers/github/GithubDiscoveryProvider.ts +++ b/packages/cli/src/commands/onboard/discovery/providers/github/GithubDiscoveryProvider.ts @@ -113,7 +113,7 @@ export class GithubDiscoveryProvider implements Provider { const query = `query repositories($org: String!, $cursor: String) { repositoryOwner(login: $org) { login - repositories(first: 100, after: $cursor) { + repositories(first: 50, after: $cursor) { nodes { name url diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json index e3332998df..b566ff6fe6 100644 --- a/packages/core-app-api/package.json +++ b/packages/core-app-api/package.json @@ -64,8 +64,8 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/test-utils": "workspace:^", - "@testing-library/dom": "^8.0.0", - "@testing-library/jest-dom": "^5.10.1", + "@testing-library/dom": "^9.0.0", + "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", "@testing-library/user-event": "^14.0.0", diff --git a/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.test.ts b/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.test.ts index 224430752c..d5b812c5d7 100644 --- a/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.test.ts +++ b/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.test.ts @@ -377,8 +377,7 @@ describe('I18nextTranslationApi', () => { }, }); }); - - expect(translations).toEqual(['foo', null, 'Föö', null, 'Føø']); + expect(translations).toEqual(['foo', 'Föö', 'Føø']); }); describe('formatting', () => { diff --git a/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.ts b/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.ts index 01e75d6df2..d0ef35568f 100644 --- a/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.ts +++ b/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.ts @@ -241,7 +241,6 @@ export class I18nextTranslationApi implements TranslationApi { return new ObservableImpl>(subscriber => { let loadTicket = {}; // To check for stale loads - let lastSnapshotWasReady = false; const loadResource = () => { loadTicket = {}; @@ -250,8 +249,7 @@ export class I18nextTranslationApi implements TranslationApi { () => { if (ticket === loadTicket) { const snapshot = this.#createSnapshot(internalRef); - if (snapshot.ready || lastSnapshotWasReady) { - lastSnapshotWasReady = snapshot.ready; + if (snapshot.ready) { subscriber.next(snapshot); } } @@ -266,12 +264,9 @@ export class I18nextTranslationApi implements TranslationApi { const onChange = () => { const snapshot = this.#createSnapshot(internalRef); - if (lastSnapshotWasReady && !snapshot.ready) { - lastSnapshotWasReady = snapshot.ready; + if (snapshot.ready) { subscriber.next(snapshot); - } - - if (!snapshot.ready) { + } else { loadResource(); } }; diff --git a/packages/core-app-api/src/app/AppRouter.tsx b/packages/core-app-api/src/app/AppRouter.tsx index b799983a3b..9d07be1ffd 100644 --- a/packages/core-app-api/src/app/AppRouter.tsx +++ b/packages/core-app-api/src/app/AppRouter.tsx @@ -70,7 +70,7 @@ function SignInPageWrapper({ }) { const [identityApi, setIdentityApi] = useState(); const configApi = useApi(configApiRef); - const basePath = getBasePath(configApi); + const basePath = readBasePath(configApi); if (!identityApi) { return ; diff --git a/packages/core-components/package.json b/packages/core-components/package.json index 1a5067b874..3bbaa8ee6a 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -86,8 +86,8 @@ "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/test-utils": "workspace:^", - "@testing-library/dom": "^8.0.0", - "@testing-library/jest-dom": "^5.10.1", + "@testing-library/dom": "^9.0.0", + "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", "@testing-library/user-event": "^14.0.0", diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json index bc81e292cb..81f77e7dcf 100644 --- a/packages/core-plugin-api/package.json +++ b/packages/core-plugin-api/package.json @@ -62,8 +62,8 @@ "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/test-utils": "workspace:^", - "@testing-library/dom": "^8.0.0", - "@testing-library/jest-dom": "^5.10.1", + "@testing-library/dom": "^9.0.0", + "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", "@testing-library/user-event": "^14.0.0" diff --git a/packages/create-app/src/lib/tasks.test.ts b/packages/create-app/src/lib/tasks.test.ts index e122374004..c436bf5ad2 100644 --- a/packages/create-app/src/lib/tasks.test.ts +++ b/packages/create-app/src/lib/tasks.test.ts @@ -103,6 +103,7 @@ describe('tasks', () => { const mockDir = createMockDirectory(); + const origCwd = process.cwd(); const realChdir = process.chdir; // If anyone calls chdir then make it resolve within the tmpdir const mockChdir = jest.spyOn(process, 'chdir'); @@ -130,6 +131,10 @@ describe('tasks', () => { mockChdir.mockReset(); }); + afterAll(() => { + realChdir(origCwd); + }); + describe('checkAppExistsTask', () => { it('should do nothing if the directory does not exist', async () => { const dir = 'projects/'; diff --git a/packages/create-app/templates/default-app/lerna.json b/packages/create-app/templates/default-app/lerna.json index 322929db1d..529a62fe38 100644 --- a/packages/create-app/templates/default-app/lerna.json +++ b/packages/create-app/templates/default-app/lerna.json @@ -1,6 +1,6 @@ { "packages": ["packages/*", "plugins/*"], "npmClient": "yarn", - "useWorkspaces": true, - "version": "0.1.0" + "version": "0.1.0", + "$schema": "node_modules/lerna/schemas/lerna-schema.json" } diff --git a/packages/create-app/templates/default-app/package.json.hbs b/packages/create-app/templates/default-app/package.json.hbs index 844a7bca9d..b74957dd56 100644 --- a/packages/create-app/templates/default-app/package.json.hbs +++ b/packages/create-app/templates/default-app/package.json.hbs @@ -36,7 +36,7 @@ "@playwright/test": "^1.32.3", "@spotify/prettier-config": "^12.0.0", "concurrently": "^8.0.0", - "lerna": "^4.0.0", + "lerna": "^7.3.0", "node-gyp": "^9.0.0", "prettier": "^2.3.2", "typescript": "~5.2.0" diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index 172b66132e..5ec49ded70 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -40,17 +40,11 @@ "@backstage/core-plugin-api": "workspace:^", "@backstage/integration-react": "workspace:^", "@backstage/plugin-catalog-react": "workspace:^", - "@backstage/test-utils": "workspace:^", "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@testing-library/dom": "^8.0.0", - "@testing-library/jest-dom": "^5.10.1", - "@testing-library/react": "^12.1.3", - "@testing-library/user-event": "^14.0.0", "@types/react": "^16.13.1 || ^17.0.0", - "react-use": "^17.2.4", - "zen-observable": "^0.10.0" + "react-use": "^17.2.4" }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", @@ -58,7 +52,13 @@ "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { - "@backstage/cli": "workspace:^" + "@backstage/cli": "workspace:^", + "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^9.0.0", + "@testing-library/jest-dom": "^6.0.0", + "@testing-library/react": "^12.1.3", + "@testing-library/user-event": "^14.0.0", + "zen-observable": "^0.10.0" }, "files": [ "dist" diff --git a/packages/frontend-app-api/api-report.md b/packages/frontend-app-api/api-report.md index a576d4cfe4..74c34be5f4 100644 --- a/packages/frontend-app-api/api-report.md +++ b/packages/frontend-app-api/api-report.md @@ -3,6 +3,7 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts +import { AppRouteBinder } from '@backstage/core-app-api'; import { BackstagePlugin } from '@backstage/frontend-plugin-api'; import { Config } from '@backstage/config'; import { ConfigApi } from '@backstage/core-plugin-api'; @@ -14,6 +15,7 @@ import { JSX as JSX_2 } from 'react'; export function createApp(options: { features?: (BackstagePlugin | ExtensionOverrides)[]; configLoader?: () => Promise; + bindRoutes?(context: { bind: AppRouteBinder }): void; featureLoader?: (ctx: { config: ConfigApi; }) => Promise<(BackstagePlugin | ExtensionOverrides)[]>; diff --git a/packages/frontend-app-api/package.json b/packages/frontend-app-api/package.json index 6b4b3be10c..7a1c5aa79f 100644 --- a/packages/frontend-app-api/package.json +++ b/packages/frontend-app-api/package.json @@ -25,7 +25,7 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/test-utils": "workspace:^", - "@testing-library/jest-dom": "^5.10.1", + "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^12.1.3" }, "configSchema": "config.d.ts", diff --git a/packages/frontend-app-api/src/extensions/CoreRoutes.tsx b/packages/frontend-app-api/src/extensions/CoreRoutes.tsx index 5006a87cac..8d22b40eec 100644 --- a/packages/frontend-app-api/src/extensions/CoreRoutes.tsx +++ b/packages/frontend-app-api/src/extensions/CoreRoutes.tsx @@ -39,7 +39,7 @@ export const CoreRoutes = createExtension({ const Routes = () => { const element = useRoutes( inputs.routes.map(route => ({ - path: route.path, + path: `${route.path}/*`, element: route.element, })), ); diff --git a/packages/frontend-app-api/src/wiring/createApp.tsx b/packages/frontend-app-api/src/wiring/createApp.tsx index 3999cad738..f262ecde72 100644 --- a/packages/frontend-app-api/src/wiring/createApp.tsx +++ b/packages/frontend-app-api/src/wiring/createApp.tsx @@ -57,6 +57,7 @@ import { ApiFactoryRegistry, ApiProvider, ApiResolver, + AppRouteBinder, AppThemeSelector, } from '@backstage/core-app-api'; @@ -76,6 +77,12 @@ import { overrideBaseUrlConfigs } from '../../../core-app-api/src/app/overrideBa // eslint-disable-next-line @backstage/no-relative-monorepo-imports import { RoutingProvider } from '../../../core-app-api/src/routing/RoutingProvider'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports +import { resolveRouteBindings } from '../../../core-app-api/src/app/resolveRouteBindings'; +// eslint-disable-next-line @backstage/no-relative-monorepo-imports +import { AppLanguageSelector } from '../../../core-app-api/src/apis/implementations/AppLanguageApi/AppLanguageSelector'; +// eslint-disable-next-line @backstage/no-relative-monorepo-imports +import { I18nextTranslationApi } from '../../../core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi'; +// eslint-disable-next-line @backstage/no-relative-monorepo-imports import { apis as defaultApis, components as defaultComponents, @@ -86,6 +93,10 @@ import { SidebarItem } from '@backstage/core-components'; import { DarkTheme, LightTheme } from '../extensions/themes'; import { extractRouteInfoFromInstanceTree } from '../routing/extractRouteInfoFromInstanceTree'; import { getOrCreateGlobalSingleton } from '@backstage/version-bridge'; +import { + appLanguageApiRef, + translationApiRef, +} from '@backstage/core-plugin-api/alpha'; /** @public */ export interface ExtensionTreeNode { @@ -261,6 +272,7 @@ export function createInstances(options: { export function createApp(options: { features?: (BackstagePlugin | ExtensionOverrides)[]; configLoader?: () => Promise; + bindRoutes?(context: { bind: AppRouteBinder }): void; featureLoader?: (ctx: { config: ConfigApi; }) => Promise<(BackstagePlugin | ExtensionOverrides)[]>; @@ -301,7 +313,7 @@ export function createApp(options: { {/* TODO: set base path using the logic from AppRouter */} @@ -460,6 +472,21 @@ function createApiHolder( factory: () => configApi, }); + factoryRegistry.register('static', { + api: appLanguageApiRef, + deps: {}, + factory: () => AppLanguageSelector.createWithStorage(), + }); + + factoryRegistry.register('default', { + api: translationApiRef, + deps: { languageApi: appLanguageApiRef }, + factory: ({ languageApi }) => + I18nextTranslationApi.create({ + languageApi, + }), + }); + // TODO: ship these as default extensions instead for (const factory of defaultApis as AnyApiFactory[]) { if (!factoryRegistry.register('app', factory)) { diff --git a/packages/frontend-plugin-api/api-report.md b/packages/frontend-plugin-api/api-report.md index 36de6114e6..071b617851 100644 --- a/packages/frontend-plugin-api/api-report.md +++ b/packages/frontend-plugin-api/api-report.md @@ -7,6 +7,8 @@ import { AnyApiFactory } from '@backstage/core-plugin-api'; import { AnyApiRef } from '@backstage/core-plugin-api'; +import { AnyExternalRoutes } from '@backstage/core-plugin-api'; +import { AnyRoutes } from '@backstage/core-plugin-api'; import { AppTheme } from '@backstage/core-plugin-api'; import { IconComponent } from '@backstage/core-plugin-api'; import { JsonObject } from '@backstage/types'; @@ -40,13 +42,20 @@ export type AnyExtensionInputMap = { }; // @public (undocumented) -export interface BackstagePlugin { +export interface BackstagePlugin< + Routes extends AnyRoutes = AnyRoutes, + ExternalRoutes extends AnyExternalRoutes = AnyExternalRoutes, +> { // (undocumented) $$type: '@backstage/BackstagePlugin'; // (undocumented) extensions: Extension[]; // (undocumented) + externalRoutes: ExternalRoutes; + // (undocumented) id: string; + // (undocumented) + routes: Routes; } // @public (undocumented) @@ -205,7 +214,12 @@ export function createPageExtension< ): Extension; // @public (undocumented) -export function createPlugin(options: PluginOptions): BackstagePlugin; +export function createPlugin< + Routes extends AnyRoutes = AnyRoutes, + ExternalRoutes extends AnyExternalRoutes = AnyExternalRoutes, +>( + options: PluginOptions, +): BackstagePlugin; // @public (undocumented) export function createSchemaFromZod( @@ -338,11 +352,18 @@ export type NavTarget = { }; // @public (undocumented) -export interface PluginOptions { +export interface PluginOptions< + Routes extends AnyRoutes, + ExternalRoutes extends AnyExternalRoutes, +> { // (undocumented) extensions?: Extension[]; // (undocumented) + externalRoutes?: ExternalRoutes; + // (undocumented) id: string; + // (undocumented) + routes?: Routes; } // @public (undocumented) diff --git a/packages/frontend-plugin-api/package.json b/packages/frontend-plugin-api/package.json index a46bf181e4..d80e2baee4 100644 --- a/packages/frontend-plugin-api/package.json +++ b/packages/frontend-plugin-api/package.json @@ -26,7 +26,7 @@ "@backstage/cli": "workspace:^", "@backstage/frontend-app-api": "workspace:^", "@backstage/test-utils": "workspace:^", - "@testing-library/jest-dom": "^5.10.1", + "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^12.1.3" }, "files": [ diff --git a/packages/frontend-plugin-api/src/wiring/createPlugin.ts b/packages/frontend-plugin-api/src/wiring/createPlugin.ts index bd8e9954ef..3afb5cedff 100644 --- a/packages/frontend-plugin-api/src/wiring/createPlugin.ts +++ b/packages/frontend-plugin-api/src/wiring/createPlugin.ts @@ -14,26 +14,44 @@ * limitations under the License. */ +import { AnyExternalRoutes, AnyRoutes } from '@backstage/core-plugin-api'; import { Extension } from './createExtension'; /** @public */ -export interface PluginOptions { +export interface PluginOptions< + Routes extends AnyRoutes, + ExternalRoutes extends AnyExternalRoutes, +> { id: string; + routes?: Routes; + externalRoutes?: ExternalRoutes; extensions?: Extension[]; } /** @public */ -export interface BackstagePlugin { +export interface BackstagePlugin< + Routes extends AnyRoutes = AnyRoutes, + ExternalRoutes extends AnyExternalRoutes = AnyExternalRoutes, +> { $$type: '@backstage/BackstagePlugin'; id: string; extensions: Extension[]; + routes: Routes; + externalRoutes: ExternalRoutes; } /** @public */ -export function createPlugin(options: PluginOptions): BackstagePlugin { +export function createPlugin< + Routes extends AnyRoutes = AnyRoutes, + ExternalRoutes extends AnyExternalRoutes = AnyExternalRoutes, +>( + options: PluginOptions, +): BackstagePlugin { return { ...options, - $$type: '@backstage/BackstagePlugin', + routes: options.routes ?? ({} as Routes), + externalRoutes: options.externalRoutes ?? ({} as ExternalRoutes), extensions: options.extensions ?? [], + $$type: '@backstage/BackstagePlugin', }; } diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index 4f25bc3578..7a919ed13a 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -47,8 +47,8 @@ "@backstage/core-components": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", - "@testing-library/dom": "^8.0.0", - "@testing-library/jest-dom": "^5.10.1", + "@testing-library/dom": "^9.0.0", + "@testing-library/jest-dom": "^6.0.0", "msw": "^1.0.0" }, "files": [ diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index 55e78486cf..86e85f9173 100644 --- a/packages/techdocs-cli-embedded-app/package.json +++ b/packages/techdocs-cli-embedded-app/package.json @@ -36,8 +36,8 @@ }, "devDependencies": { "@backstage/cli": "workspace:^", - "@testing-library/dom": "^8.0.0", - "@testing-library/jest-dom": "^5.10.1", + "@testing-library/dom": "^9.0.0", + "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/react": "*", diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 14bda275e7..5f7bbb6af8 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -68,7 +68,7 @@ }, "devDependencies": { "@backstage/cli": "workspace:^", - "@testing-library/jest-dom": "^5.10.1", + "@testing-library/jest-dom": "^6.0.0", "msw": "^1.0.0" }, "files": [ diff --git a/packages/version-bridge/package.json b/packages/version-bridge/package.json index f14b263747..851128d025 100644 --- a/packages/version-bridge/package.json +++ b/packages/version-bridge/package.json @@ -42,7 +42,7 @@ }, "devDependencies": { "@backstage/cli": "workspace:^", - "@testing-library/jest-dom": "^5.10.1", + "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0" }, diff --git a/plugins/adr/alpha-api-report.md b/plugins/adr/alpha-api-report.md index 9d0bd071b1..6dd1c8043f 100644 --- a/plugins/adr/alpha-api-report.md +++ b/plugins/adr/alpha-api-report.md @@ -3,6 +3,8 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts +import { AnyExternalRoutes } from '@backstage/core-plugin-api'; +import { AnyRoutes } from '@backstage/core-plugin-api'; import { BackstagePlugin } from '@backstage/frontend-plugin-api'; import { Extension } from '@backstage/frontend-plugin-api'; import { TranslationRef } from '@backstage/core-plugin-api/alpha'; @@ -24,7 +26,7 @@ export const adrTranslationRef: TranslationRef< >; // @alpha (undocumented) -const _default: BackstagePlugin; +const _default: BackstagePlugin; export default _default; // (No @packageDocumentation comment for this package) diff --git a/plugins/adr/package.json b/plugins/adr/package.json index 6624bf38d5..72511596e7 100644 --- a/plugins/adr/package.json +++ b/plugins/adr/package.json @@ -71,8 +71,8 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", - "@testing-library/dom": "^8.0.0", - "@testing-library/jest-dom": "^5.10.1", + "@testing-library/dom": "^9.0.0", + "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/git-url-parse": "^9.0.0", diff --git a/plugins/airbrake/package.json b/plugins/airbrake/package.json index 65a5706ae8..e308bee851 100644 --- a/plugins/airbrake/package.json +++ b/plugins/airbrake/package.json @@ -52,8 +52,8 @@ "@backstage/cli": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", - "@testing-library/dom": "^8.0.0", - "@testing-library/jest-dom": "^5.10.1", + "@testing-library/dom": "^9.0.0", + "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "msw": "^1.0.0" diff --git a/plugins/allure/package.json b/plugins/allure/package.json index dec5815989..f3f02f86dd 100644 --- a/plugins/allure/package.json +++ b/plugins/allure/package.json @@ -51,8 +51,8 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", - "@testing-library/dom": "^8.0.0", - "@testing-library/jest-dom": "^5.10.1", + "@testing-library/dom": "^9.0.0", + "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "msw": "^1.0.0" diff --git a/plugins/analytics-module-ga/package.json b/plugins/analytics-module-ga/package.json index c06717bb68..0b79da313f 100644 --- a/plugins/analytics-module-ga/package.json +++ b/plugins/analytics-module-ga/package.json @@ -49,8 +49,8 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", - "@testing-library/dom": "^8.0.0", - "@testing-library/jest-dom": "^5.10.1", + "@testing-library/dom": "^9.0.0", + "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/react": "^16.13.1 || ^17.0.0", diff --git a/plugins/analytics-module-ga4/package.json b/plugins/analytics-module-ga4/package.json index e719aa88d9..db8259cdfb 100644 --- a/plugins/analytics-module-ga4/package.json +++ b/plugins/analytics-module-ga4/package.json @@ -46,8 +46,8 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", - "@testing-library/dom": "^8.0.0", - "@testing-library/jest-dom": "^5.10.1", + "@testing-library/dom": "^9.0.0", + "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/jest": "^28.1.3", diff --git a/plugins/analytics-module-newrelic-browser/package.json b/plugins/analytics-module-newrelic-browser/package.json index d3c29f0e6c..040462ad20 100644 --- a/plugins/analytics-module-newrelic-browser/package.json +++ b/plugins/analytics-module-newrelic-browser/package.json @@ -37,7 +37,7 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", - "@testing-library/jest-dom": "^5.10.1", + "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "msw": "^1.0.0" diff --git a/plugins/apache-airflow/package.json b/plugins/apache-airflow/package.json index 7a0c7cbcc2..1b314c9004 100644 --- a/plugins/apache-airflow/package.json +++ b/plugins/apache-airflow/package.json @@ -49,8 +49,8 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", - "@testing-library/dom": "^8.0.0", - "@testing-library/jest-dom": "^5.10.1", + "@testing-library/dom": "^9.0.0", + "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "msw": "^1.0.0" diff --git a/plugins/api-docs-module-protoc-gen-doc/package.json b/plugins/api-docs-module-protoc-gen-doc/package.json index e0ad10f4f0..c7a952bc4f 100644 --- a/plugins/api-docs-module-protoc-gen-doc/package.json +++ b/plugins/api-docs-module-protoc-gen-doc/package.json @@ -42,7 +42,7 @@ }, "devDependencies": { "@backstage/cli": "workspace:^", - "@testing-library/jest-dom": "^5.16.4" + "@testing-library/jest-dom": "^6.0.0" }, "files": [ "dist" diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index c115ac4444..fb00aa8683 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -61,8 +61,8 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", - "@testing-library/dom": "^8.0.0", - "@testing-library/jest-dom": "^5.10.1", + "@testing-library/dom": "^9.0.0", + "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/swagger-ui-react": "^4.18.0", diff --git a/plugins/apollo-explorer/package.json b/plugins/apollo-explorer/package.json index 95f743f130..c15726029d 100644 --- a/plugins/apollo-explorer/package.json +++ b/plugins/apollo-explorer/package.json @@ -49,8 +49,8 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", - "@testing-library/dom": "^8.0.0", - "@testing-library/jest-dom": "^5.10.1", + "@testing-library/dom": "^9.0.0", + "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "msw": "^1.0.0" diff --git a/plugins/auth-backend/src/service/standaloneServer.ts b/plugins/auth-backend/src/service/standaloneServer.ts index abda3a341c..0c311d5949 100644 --- a/plugins/auth-backend/src/service/standaloneServer.ts +++ b/plugins/auth-backend/src/service/standaloneServer.ts @@ -18,7 +18,7 @@ import { createServiceBuilder, loadBackendConfig, ServerTokenManager, - SingleHostDiscovery, + HostDiscovery, useHotMemoize, } from '@backstage/backend-common'; import { Server } from 'http'; @@ -35,7 +35,7 @@ export async function startStandaloneServer( ): Promise { const logger = options.logger.child({ service: 'auth-backend' }); const config = await loadBackendConfig({ logger, argv: process.argv }); - const discovery = SingleHostDiscovery.fromConfig(config); + const discovery = HostDiscovery.fromConfig(config); const database = useHotMemoize(module, () => { const knex = Knex({ diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json index 90615005ee..45dccce464 100644 --- a/plugins/azure-devops/package.json +++ b/plugins/azure-devops/package.json @@ -54,8 +54,8 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", - "@testing-library/dom": "^8.0.0", - "@testing-library/jest-dom": "^5.10.1", + "@testing-library/dom": "^9.0.0", + "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "msw": "^1.0.0" diff --git a/plugins/azure-sites/package.json b/plugins/azure-sites/package.json index 99dd46a36a..ee97dae742 100644 --- a/plugins/azure-sites/package.json +++ b/plugins/azure-sites/package.json @@ -56,8 +56,8 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", - "@testing-library/dom": "^8.0.0", - "@testing-library/jest-dom": "^5.10.1", + "@testing-library/dom": "^9.0.0", + "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "msw": "^1.0.0" diff --git a/plugins/badges-backend/src/service/router-obfuscated.test.ts b/plugins/badges-backend/src/service/router-obfuscated.test.ts index 3c9ec0d2b6..49d0368c7f 100644 --- a/plugins/badges-backend/src/service/router-obfuscated.test.ts +++ b/plugins/badges-backend/src/service/router-obfuscated.test.ts @@ -20,7 +20,7 @@ import { getVoidLogger, PluginEndpointDiscovery, ServerTokenManager, - SingleHostDiscovery, + HostDiscovery, } from '@backstage/backend-common'; import { CatalogApi } from '@backstage/catalog-client'; import type { Entity } from '@backstage/catalog-model'; @@ -138,7 +138,7 @@ describe('createRouter', () => { }; beforeAll(async () => { - discovery = SingleHostDiscovery.fromConfig(config); + discovery = HostDiscovery.fromConfig(config); const tokenManager = ServerTokenManager.noop(); const router = await createRouter({ badgeBuilder, diff --git a/plugins/badges-backend/src/service/router.test.ts b/plugins/badges-backend/src/service/router.test.ts index 2ecae6b452..6ccb8e3be7 100644 --- a/plugins/badges-backend/src/service/router.test.ts +++ b/plugins/badges-backend/src/service/router.test.ts @@ -20,7 +20,7 @@ import { getVoidLogger, PluginEndpointDiscovery, ServerTokenManager, - SingleHostDiscovery, + HostDiscovery, } from '@backstage/backend-common'; import { CatalogApi } from '@backstage/catalog-client'; import type { Entity } from '@backstage/catalog-model'; @@ -113,7 +113,7 @@ describe('createRouter', () => { }, ); - discovery = SingleHostDiscovery.fromConfig(config); + discovery = HostDiscovery.fromConfig(config); const tokenManager = ServerTokenManager.noop(); const router = await createRouter({ badgeBuilder, diff --git a/plugins/badges-backend/src/service/standaloneServer.ts b/plugins/badges-backend/src/service/standaloneServer.ts index b07e1fa3b1..75185c4aef 100644 --- a/plugins/badges-backend/src/service/standaloneServer.ts +++ b/plugins/badges-backend/src/service/standaloneServer.ts @@ -20,7 +20,7 @@ import { createServiceBuilder, loadBackendConfig, ServerTokenManager, - SingleHostDiscovery, + HostDiscovery, useHotMemoize, } from '@backstage/backend-common'; import { createRouter } from './router'; @@ -39,7 +39,7 @@ export async function startStandaloneServer( ): Promise { const logger = options.logger.child({ service: 'badges-backend' }); const config = await loadBackendConfig({ logger, argv: process.argv }); - const discovery = SingleHostDiscovery.fromConfig(config); + const discovery = HostDiscovery.fromConfig(config); const database = useHotMemoize(module, () => { return Knex({ client: 'better-sqlite3', diff --git a/plugins/badges/package.json b/plugins/badges/package.json index ef2e6c7ce8..e52a8a1c3c 100644 --- a/plugins/badges/package.json +++ b/plugins/badges/package.json @@ -52,7 +52,7 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", - "@testing-library/jest-dom": "^5.16.5" + "@testing-library/jest-dom": "^6.0.0" }, "files": [ "dist" diff --git a/plugins/bazaar/package.json b/plugins/bazaar/package.json index 46b012d4b4..b035ec8fd9 100644 --- a/plugins/bazaar/package.json +++ b/plugins/bazaar/package.json @@ -43,7 +43,7 @@ "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@material-ui/pickers": "^3.3.10", - "@testing-library/jest-dom": "^5.10.1", + "@testing-library/jest-dom": "^6.0.0", "@types/react": "^16.13.1 || ^17.0.0", "luxon": "^3.0.0", "material-ui-search-bar": "^1.0.0", @@ -58,7 +58,7 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/dev-utils": "workspace:^", - "@testing-library/jest-dom": "^5.10.1" + "@testing-library/jest-dom": "^6.0.0" }, "files": [ "dist" diff --git a/plugins/bitrise/package.json b/plugins/bitrise/package.json index b0bca55062..5a00a4e4b8 100644 --- a/plugins/bitrise/package.json +++ b/plugins/bitrise/package.json @@ -55,8 +55,8 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", - "@testing-library/dom": "^8.0.0", - "@testing-library/jest-dom": "^5.10.1", + "@testing-library/dom": "^9.0.0", + "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/recharts": "^1.8.15", diff --git a/plugins/catalog-backend-module-github/src/lib/github.ts b/plugins/catalog-backend-module-github/src/lib/github.ts index 073e6c1587..cf6b400443 100644 --- a/plugins/catalog-backend-module-github/src/lib/github.ts +++ b/plugins/catalog-backend-module-github/src/lib/github.ts @@ -462,7 +462,7 @@ export async function getOrganizationRepositories( query repositories($org: String!, $catalogPathRef: String!, $cursor: String) { repositoryOwner(login: $org) { login - repositories(first: 100, after: $cursor) { + repositories(first: 50, after: $cursor) { nodes { name catalogInfoFile: object(expression: $catalogPathRef) { diff --git a/plugins/catalog-backend/src/service/standaloneServer.ts b/plugins/catalog-backend/src/service/standaloneServer.ts index e48515fb8b..cff4fa1f94 100644 --- a/plugins/catalog-backend/src/service/standaloneServer.ts +++ b/plugins/catalog-backend/src/service/standaloneServer.ts @@ -19,7 +19,7 @@ import { DatabaseManager, loadBackendConfig, ServerTokenManager, - SingleHostDiscovery, + HostDiscovery, UrlReaders, useHotMemoize, } from '@backstage/backend-common'; @@ -53,7 +53,7 @@ export async function startStandaloneServer( ); return manager.forPlugin('catalog'); }); - const discovery = SingleHostDiscovery.fromConfig(config); + const discovery = HostDiscovery.fromConfig(config); const tokenManager = ServerTokenManager.fromConfig(config, { logger, }); diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index 3c58eebd3f..909ed5329d 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -57,8 +57,8 @@ "@backstage/dev-utils": "workspace:^", "@backstage/plugin-catalog": "workspace:^", "@backstage/test-utils": "workspace:^", - "@testing-library/dom": "^8.0.0", - "@testing-library/jest-dom": "^5.10.1", + "@testing-library/dom": "^9.0.0", + "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", "@testing-library/user-event": "^14.0.0" diff --git a/plugins/catalog-graphql/README.md b/plugins/catalog-graphql/README.md index e05672e3a5..021d0d1b20 100644 --- a/plugins/catalog-graphql/README.md +++ b/plugins/catalog-graphql/README.md @@ -1,11 +1,3 @@ # Catalog GraphQL Plugin -## Getting Started - -This is the Catalog GraphQL plugin. - -It provides the `catalog` part of the GraphQL schema. - -To register it with the GraphQL backend, be sure to follow the [Getting Started](../graphql-backend/README.md#getting-started) guide of the GraphQL plugin. - -