From 8b50969764ac2c210ecbe1d6eb6fad03466e7db6 Mon Sep 17 00:00:00 2001 From: blam Date: Fri, 19 Apr 2024 17:06:23 +0200 Subject: [PATCH] chore: removed things Signed-off-by: blam --- packages/app-next/package.json | 57 +- packages/app/package.json | 46 - packages/backend-next/package.json | 13 +- packages/backend/package.json | 18 - packages/core-compat-api/package.json | 4 +- plugins/linguist-backend/CHANGELOG.md | 1085 ---- plugins/linguist-backend/README.md | 3 - plugins/linguist-backend/api-report.md | 123 - plugins/linguist-backend/catalog-info.yaml | 9 - plugins/linguist-backend/config.d.ts | 72 - plugins/linguist-backend/knip-report.md | 2 - .../migrations/20221115_init.js | 63 - .../20230216_remove_processed_date_default.js | 39 - plugins/linguist-backend/package.json | 67 - .../src/api/LinguistBackendClient.test.ts | 417 -- .../src/api/LinguistBackendClient.ts | 283 -- plugins/linguist-backend/src/api/index.ts | 17 - .../src/db/LinguistBackendDatabase.test.ts | 200 - .../src/db/LinguistBackendDatabase.ts | 183 - plugins/linguist-backend/src/db/index.ts | 18 - plugins/linguist-backend/src/index.ts | 26 - plugins/linguist-backend/src/plugin.ts | 77 - .../processor/LinguistTagsProcessor.test.ts | 343 -- .../src/processor/LinguistTagsProcessor.ts | 268 - .../LinguistTagsProcessor.test.ts.snap | 707 --- plugins/linguist-backend/src/run.ts | 33 - .../src/service/router.test.ts | 130 - .../linguist-backend/src/service/router.ts | 177 - .../src/service/standaloneServer.ts | 82 - plugins/linguist-backend/src/setupTests.ts | 17 - plugins/linguist-common/.eslintrc.js | 1 - plugins/linguist-common/CHANGELOG.md | 38 - plugins/linguist-common/README.md | 3 - plugins/linguist-common/api-report.md | 51 - plugins/linguist-common/catalog-info.yaml | 10 - plugins/linguist-common/knip-report.md | 2 - plugins/linguist-common/package.json | 40 - plugins/linguist-common/src/constants.ts | 18 - plugins/linguist-common/src/index.ts | 18 - plugins/linguist-common/src/setupTests.ts | 16 - plugins/linguist-common/src/types.ts | 56 - plugins/linguist/.eslintrc.js | 5 - plugins/linguist/CHANGELOG.md | 844 ---- plugins/linguist/README.md | 3 - plugins/linguist/api-report-alpha.md | 23 - plugins/linguist/api-report.md | 22 - plugins/linguist/catalog-info.yaml | 9 - plugins/linguist/dev/index.tsx | 27 - plugins/linguist/docs/linguist-no-data.png | Bin 12455 -> 0 bytes plugins/linguist/docs/linguist-with-data.png | Bin 15731 -> 0 bytes plugins/linguist/knip-report.md | 2 - plugins/linguist/package.json | 75 - plugins/linguist/src/alpha.ts | 19 - plugins/linguist/src/alpha/index.ts | 17 - plugins/linguist/src/alpha/plugin.tsx | 56 - plugins/linguist/src/api/LinguistApi.ts | 26 - plugins/linguist/src/api/LinguistClient.ts | 56 - plugins/linguist/src/api/index.ts | 18 - .../components/LinguistCard/LinguistCard.tsx | 151 - .../src/components/LinguistCard/index.ts | 17 - plugins/linguist/src/hooks/index.ts | 17 - plugins/linguist/src/hooks/useLanguages.ts | 41 - plugins/linguist/src/index.ts | 20 - plugins/linguist/src/plugin.test.ts | 22 - plugins/linguist/src/plugin.ts | 56 - plugins/linguist/src/setupTests.ts | 17 - plugins/linguist/src/translation.ts | 27 - plugins/nomad-backend/.eslintrc.js | 1 - plugins/nomad-backend/CHANGELOG.md | 425 -- plugins/nomad-backend/README.md | 3 - plugins/nomad-backend/api-report.md | 27 - plugins/nomad-backend/catalog-info.yaml | 9 - plugins/nomad-backend/knip-report.md | 2 - plugins/nomad-backend/package.json | 51 - plugins/nomad-backend/src/index.ts | 17 - plugins/nomad-backend/src/plugin.test.ts | 22 - plugins/nomad-backend/src/plugin.ts | 54 - plugins/nomad-backend/src/run.ts | 34 - .../nomad-backend/src/service/router.test.ts | 51 - plugins/nomad-backend/src/service/router.ts | 126 - .../src/service/standaloneServer.ts | 52 - plugins/nomad-backend/src/setupTests.ts | 16 - plugins/nomad/.eslintrc.js | 5 - plugins/nomad/CHANGELOG.md | 525 -- plugins/nomad/README.md | 3 - plugins/nomad/api-report.md | 35 - plugins/nomad/catalog-info.yaml | 9 - plugins/nomad/dev/index.tsx | 19 - plugins/nomad/img/allocations-component.png | Bin 120025 -> 0 bytes plugins/nomad/img/job-versions-component.png | Bin 53458 -> 0 bytes plugins/nomad/knip-report.md | 8 - plugins/nomad/package.json | 84 - plugins/nomad/src/Router.tsx | 46 - plugins/nomad/src/annotations.ts | 35 - plugins/nomad/src/api.ts | 160 - .../EntityNomadAllocationListTable.tsx | 203 - .../EntityNomadJobVersionListCard.tsx | 154 - plugins/nomad/src/components/index.ts | 18 - plugins/nomad/src/index.ts | 24 - plugins/nomad/src/plugin.test.ts | 34 - plugins/nomad/src/plugin.ts | 87 - plugins/nomad/src/routes.ts | 20 - plugins/nomad/src/setupTests.ts | 17 - plugins/pagerduty/.eslintrc.js | 5 - plugins/pagerduty/CHANGELOG.md | 1861 ------- plugins/pagerduty/README.md | 3 - plugins/pagerduty/api-report.md | 226 - plugins/pagerduty/catalog-info.yaml | 10 - plugins/pagerduty/config.d.ts | 28 - plugins/pagerduty/dev/index.tsx | 41 - plugins/pagerduty/dev/mockEntity.ts | 35 - plugins/pagerduty/dev/mockPagerDutyApi.ts | 146 - plugins/pagerduty/doc/pd1.png | Bin 23748 -> 0 bytes plugins/pagerduty/doc/pd2.png | Bin 22614 -> 0 bytes plugins/pagerduty/doc/pd3.png | Bin 49539 -> 0 bytes plugins/pagerduty/doc/pd4.png | Bin 24061 -> 0 bytes plugins/pagerduty/knip-report.md | 8 - plugins/pagerduty/package.json | 70 - plugins/pagerduty/src/api/client.test.ts | 376 -- plugins/pagerduty/src/api/client.ts | 200 - plugins/pagerduty/src/api/index.ts | 27 - plugins/pagerduty/src/api/types.ts | 118 - plugins/pagerduty/src/assets/emptystate.svg | 1 - .../ChangeEvents/ChangeEventEmptyState.tsx | 42 - .../ChangeEvents/ChangeEventListItem.tsx | 100 - .../ChangeEvents/ChangeEvents.test.tsx | 155 - .../components/ChangeEvents/ChangeEvents.tsx | 73 - .../src/components/ChangeEvents/index.ts | 17 - .../EntityPagerDutyCard/index.test.tsx | 367 -- .../components/EntityPagerDutyCard/index.tsx | 48 - .../components/Errors/MissingTokenError.tsx | 35 - .../Errors/ServiceNotFoundError.tsx | 35 - .../pagerduty/src/components/Errors/index.ts | 18 - .../components/Escalation/Escalation.test.tsx | 94 - .../Escalation/EscalationPolicy.tsx | 72 - .../components/Escalation/EscalationUser.tsx | 76 - .../Escalation/EscalationUsersEmptyState.tsx | 46 - .../src/components/Escalation/index.ts | 17 - .../HomePagePagerDutyCard/Content.tsx | 29 - .../components/HomePagePagerDutyCard/index.ts | 17 - .../Incident/IncidentEmptyState.tsx | 42 - .../components/Incident/IncidentListItem.tsx | 118 - .../components/Incident/Incidents.test.tsx | 123 - .../src/components/Incident/Incidents.tsx | 73 - .../src/components/Incident/index.ts | 17 - .../PagerDutyCard/PagerDutyCard.test.tsx | 289 -- .../PagerDutyCard/PagerDutyCard.tsx | 204 - .../src/components/PagerDutyCard/index.ts | 17 - .../components/TriggerButton/index.test.tsx | 126 - .../src/components/TriggerButton/index.tsx | 69 - .../TriggerDialog/TriggerDialog.test.tsx | 85 - .../TriggerDialog/TriggerDialog.tsx | 157 - .../src/components/TriggerDialog/index.ts | 17 - plugins/pagerduty/src/components/constants.ts | 17 - plugins/pagerduty/src/components/index.ts | 35 - .../src/components/pagerDutyEntity.test.ts | 98 - .../src/components/pagerDutyEntity.ts | 29 - plugins/pagerduty/src/components/types.ts | 93 - plugins/pagerduty/src/deprecated.ts | 29 - plugins/pagerduty/src/hooks/index.ts | 25 - plugins/pagerduty/src/index.ts | 35 - plugins/pagerduty/src/plugin.test.ts | 22 - plugins/pagerduty/src/plugin.ts | 99 - plugins/pagerduty/src/setupTests.ts | 17 - plugins/pagerduty/src/types.ts | 25 - .../.eslintrc.js | 0 .../CHANGELOG.md | 310 ++ .../README.md | 8 + .../api-report.md | 59 + .../catalog-info.yaml | 10 + .../knip-report.md | 8 + .../package.json | 61 + .../src/actions/bitbucket.examples.test.ts | 368 ++ .../src/actions/bitbucket.examples.ts | 203 + .../src/actions/bitbucket.test.ts | 619 +++ .../src/actions/bitbucket.ts | 424 ++ .../src/deprecated.ts | 43 + .../src}/index.ts | 14 +- .../src/module.ts | 58 + .../package.json | 2 +- yarn.lock | 4379 +---------------- 181 files changed, 2338 insertions(+), 19263 deletions(-) delete mode 100644 plugins/linguist-backend/CHANGELOG.md delete mode 100644 plugins/linguist-backend/README.md delete mode 100644 plugins/linguist-backend/api-report.md delete mode 100644 plugins/linguist-backend/catalog-info.yaml delete mode 100644 plugins/linguist-backend/config.d.ts delete mode 100644 plugins/linguist-backend/knip-report.md delete mode 100644 plugins/linguist-backend/migrations/20221115_init.js delete mode 100644 plugins/linguist-backend/migrations/20230216_remove_processed_date_default.js delete mode 100644 plugins/linguist-backend/package.json delete mode 100644 plugins/linguist-backend/src/api/LinguistBackendClient.test.ts delete mode 100644 plugins/linguist-backend/src/api/LinguistBackendClient.ts delete mode 100644 plugins/linguist-backend/src/api/index.ts delete mode 100644 plugins/linguist-backend/src/db/LinguistBackendDatabase.test.ts delete mode 100644 plugins/linguist-backend/src/db/LinguistBackendDatabase.ts delete mode 100644 plugins/linguist-backend/src/db/index.ts delete mode 100644 plugins/linguist-backend/src/index.ts delete mode 100644 plugins/linguist-backend/src/plugin.ts delete mode 100644 plugins/linguist-backend/src/processor/LinguistTagsProcessor.test.ts delete mode 100644 plugins/linguist-backend/src/processor/LinguistTagsProcessor.ts delete mode 100644 plugins/linguist-backend/src/processor/__snapshots__/LinguistTagsProcessor.test.ts.snap delete mode 100644 plugins/linguist-backend/src/run.ts delete mode 100644 plugins/linguist-backend/src/service/router.test.ts delete mode 100644 plugins/linguist-backend/src/service/router.ts delete mode 100644 plugins/linguist-backend/src/service/standaloneServer.ts delete mode 100644 plugins/linguist-backend/src/setupTests.ts delete mode 100644 plugins/linguist-common/.eslintrc.js delete mode 100644 plugins/linguist-common/CHANGELOG.md delete mode 100644 plugins/linguist-common/README.md delete mode 100644 plugins/linguist-common/api-report.md delete mode 100644 plugins/linguist-common/catalog-info.yaml delete mode 100644 plugins/linguist-common/knip-report.md delete mode 100644 plugins/linguist-common/package.json delete mode 100644 plugins/linguist-common/src/constants.ts delete mode 100644 plugins/linguist-common/src/index.ts delete mode 100644 plugins/linguist-common/src/setupTests.ts delete mode 100644 plugins/linguist-common/src/types.ts delete mode 100644 plugins/linguist/.eslintrc.js delete mode 100644 plugins/linguist/CHANGELOG.md delete mode 100644 plugins/linguist/README.md delete mode 100644 plugins/linguist/api-report-alpha.md delete mode 100644 plugins/linguist/api-report.md delete mode 100644 plugins/linguist/catalog-info.yaml delete mode 100644 plugins/linguist/dev/index.tsx delete mode 100644 plugins/linguist/docs/linguist-no-data.png delete mode 100644 plugins/linguist/docs/linguist-with-data.png delete mode 100644 plugins/linguist/knip-report.md delete mode 100644 plugins/linguist/package.json delete mode 100644 plugins/linguist/src/alpha.ts delete mode 100644 plugins/linguist/src/alpha/index.ts delete mode 100644 plugins/linguist/src/alpha/plugin.tsx delete mode 100644 plugins/linguist/src/api/LinguistApi.ts delete mode 100644 plugins/linguist/src/api/LinguistClient.ts delete mode 100644 plugins/linguist/src/api/index.ts delete mode 100644 plugins/linguist/src/components/LinguistCard/LinguistCard.tsx delete mode 100644 plugins/linguist/src/components/LinguistCard/index.ts delete mode 100644 plugins/linguist/src/hooks/index.ts delete mode 100644 plugins/linguist/src/hooks/useLanguages.ts delete mode 100644 plugins/linguist/src/index.ts delete mode 100644 plugins/linguist/src/plugin.test.ts delete mode 100644 plugins/linguist/src/plugin.ts delete mode 100644 plugins/linguist/src/setupTests.ts delete mode 100644 plugins/linguist/src/translation.ts delete mode 100644 plugins/nomad-backend/.eslintrc.js delete mode 100644 plugins/nomad-backend/CHANGELOG.md delete mode 100644 plugins/nomad-backend/README.md delete mode 100644 plugins/nomad-backend/api-report.md delete mode 100644 plugins/nomad-backend/catalog-info.yaml delete mode 100644 plugins/nomad-backend/knip-report.md delete mode 100644 plugins/nomad-backend/package.json delete mode 100644 plugins/nomad-backend/src/index.ts delete mode 100644 plugins/nomad-backend/src/plugin.test.ts delete mode 100644 plugins/nomad-backend/src/plugin.ts delete mode 100644 plugins/nomad-backend/src/run.ts delete mode 100644 plugins/nomad-backend/src/service/router.test.ts delete mode 100644 plugins/nomad-backend/src/service/router.ts delete mode 100644 plugins/nomad-backend/src/service/standaloneServer.ts delete mode 100644 plugins/nomad-backend/src/setupTests.ts delete mode 100644 plugins/nomad/.eslintrc.js delete mode 100644 plugins/nomad/CHANGELOG.md delete mode 100644 plugins/nomad/README.md delete mode 100644 plugins/nomad/api-report.md delete mode 100644 plugins/nomad/catalog-info.yaml delete mode 100644 plugins/nomad/dev/index.tsx delete mode 100644 plugins/nomad/img/allocations-component.png delete mode 100644 plugins/nomad/img/job-versions-component.png delete mode 100644 plugins/nomad/knip-report.md delete mode 100644 plugins/nomad/package.json delete mode 100644 plugins/nomad/src/Router.tsx delete mode 100644 plugins/nomad/src/annotations.ts delete mode 100644 plugins/nomad/src/api.ts delete mode 100644 plugins/nomad/src/components/EntityNomadAllocationListTable/EntityNomadAllocationListTable.tsx delete mode 100644 plugins/nomad/src/components/EntityNomadJobVersionListCard/EntityNomadJobVersionListCard.tsx delete mode 100644 plugins/nomad/src/components/index.ts delete mode 100644 plugins/nomad/src/index.ts delete mode 100644 plugins/nomad/src/plugin.test.ts delete mode 100644 plugins/nomad/src/plugin.ts delete mode 100644 plugins/nomad/src/routes.ts delete mode 100644 plugins/nomad/src/setupTests.ts delete mode 100644 plugins/pagerduty/.eslintrc.js delete mode 100644 plugins/pagerduty/CHANGELOG.md delete mode 100644 plugins/pagerduty/README.md delete mode 100644 plugins/pagerduty/api-report.md delete mode 100644 plugins/pagerduty/catalog-info.yaml delete mode 100644 plugins/pagerduty/config.d.ts delete mode 100644 plugins/pagerduty/dev/index.tsx delete mode 100644 plugins/pagerduty/dev/mockEntity.ts delete mode 100644 plugins/pagerduty/dev/mockPagerDutyApi.ts delete mode 100644 plugins/pagerduty/doc/pd1.png delete mode 100644 plugins/pagerduty/doc/pd2.png delete mode 100644 plugins/pagerduty/doc/pd3.png delete mode 100644 plugins/pagerduty/doc/pd4.png delete mode 100644 plugins/pagerduty/knip-report.md delete mode 100644 plugins/pagerduty/package.json delete mode 100644 plugins/pagerduty/src/api/client.test.ts delete mode 100644 plugins/pagerduty/src/api/client.ts delete mode 100644 plugins/pagerduty/src/api/index.ts delete mode 100644 plugins/pagerduty/src/api/types.ts delete mode 100644 plugins/pagerduty/src/assets/emptystate.svg delete mode 100644 plugins/pagerduty/src/components/ChangeEvents/ChangeEventEmptyState.tsx delete mode 100644 plugins/pagerduty/src/components/ChangeEvents/ChangeEventListItem.tsx delete mode 100644 plugins/pagerduty/src/components/ChangeEvents/ChangeEvents.test.tsx delete mode 100644 plugins/pagerduty/src/components/ChangeEvents/ChangeEvents.tsx delete mode 100644 plugins/pagerduty/src/components/ChangeEvents/index.ts delete mode 100644 plugins/pagerduty/src/components/EntityPagerDutyCard/index.test.tsx delete mode 100644 plugins/pagerduty/src/components/EntityPagerDutyCard/index.tsx delete mode 100644 plugins/pagerduty/src/components/Errors/MissingTokenError.tsx delete mode 100644 plugins/pagerduty/src/components/Errors/ServiceNotFoundError.tsx delete mode 100644 plugins/pagerduty/src/components/Errors/index.ts delete mode 100644 plugins/pagerduty/src/components/Escalation/Escalation.test.tsx delete mode 100644 plugins/pagerduty/src/components/Escalation/EscalationPolicy.tsx delete mode 100644 plugins/pagerduty/src/components/Escalation/EscalationUser.tsx delete mode 100644 plugins/pagerduty/src/components/Escalation/EscalationUsersEmptyState.tsx delete mode 100644 plugins/pagerduty/src/components/Escalation/index.ts delete mode 100644 plugins/pagerduty/src/components/HomePagePagerDutyCard/Content.tsx delete mode 100644 plugins/pagerduty/src/components/HomePagePagerDutyCard/index.ts delete mode 100644 plugins/pagerduty/src/components/Incident/IncidentEmptyState.tsx delete mode 100644 plugins/pagerduty/src/components/Incident/IncidentListItem.tsx delete mode 100644 plugins/pagerduty/src/components/Incident/Incidents.test.tsx delete mode 100644 plugins/pagerduty/src/components/Incident/Incidents.tsx delete mode 100644 plugins/pagerduty/src/components/Incident/index.ts delete mode 100644 plugins/pagerduty/src/components/PagerDutyCard/PagerDutyCard.test.tsx delete mode 100644 plugins/pagerduty/src/components/PagerDutyCard/PagerDutyCard.tsx delete mode 100644 plugins/pagerduty/src/components/PagerDutyCard/index.ts delete mode 100644 plugins/pagerduty/src/components/TriggerButton/index.test.tsx delete mode 100644 plugins/pagerduty/src/components/TriggerButton/index.tsx delete mode 100644 plugins/pagerduty/src/components/TriggerDialog/TriggerDialog.test.tsx delete mode 100644 plugins/pagerduty/src/components/TriggerDialog/TriggerDialog.tsx delete mode 100644 plugins/pagerduty/src/components/TriggerDialog/index.ts delete mode 100644 plugins/pagerduty/src/components/constants.ts delete mode 100644 plugins/pagerduty/src/components/index.ts delete mode 100644 plugins/pagerduty/src/components/pagerDutyEntity.test.ts delete mode 100644 plugins/pagerduty/src/components/pagerDutyEntity.ts delete mode 100644 plugins/pagerduty/src/components/types.ts delete mode 100644 plugins/pagerduty/src/deprecated.ts delete mode 100644 plugins/pagerduty/src/hooks/index.ts delete mode 100644 plugins/pagerduty/src/index.ts delete mode 100644 plugins/pagerduty/src/plugin.test.ts delete mode 100644 plugins/pagerduty/src/plugin.ts delete mode 100644 plugins/pagerduty/src/setupTests.ts delete mode 100644 plugins/pagerduty/src/types.ts rename plugins/{linguist-backend => scaffolder-backend-module-bitbucket}/.eslintrc.js (100%) create mode 100644 plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md create mode 100644 plugins/scaffolder-backend-module-bitbucket/README.md create mode 100644 plugins/scaffolder-backend-module-bitbucket/api-report.md create mode 100644 plugins/scaffolder-backend-module-bitbucket/catalog-info.yaml create mode 100644 plugins/scaffolder-backend-module-bitbucket/knip-report.md create mode 100644 plugins/scaffolder-backend-module-bitbucket/package.json create mode 100644 plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucket.examples.test.ts create mode 100644 plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucket.examples.ts create mode 100644 plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucket.test.ts create mode 100644 plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucket.ts create mode 100644 plugins/scaffolder-backend-module-bitbucket/src/deprecated.ts rename plugins/{linguist-backend/src/processor => scaffolder-backend-module-bitbucket/src}/index.ts (75%) create mode 100644 plugins/scaffolder-backend-module-bitbucket/src/module.ts diff --git a/packages/app-next/package.json b/packages/app-next/package.json index d98cc91a57..5c93e16311 100644 --- a/packages/app-next/package.json +++ b/packages/app-next/package.json @@ -15,90 +15,51 @@ "@backstage/app-defaults": "workspace:^", "@backstage/catalog-model": "workspace:^", "@backstage/cli": "workspace:^", + "@backstage/config": "workspace:^", "@backstage/core-app-api": "workspace:^", - "@backstage/core-compat-api": "workspace:^", "@backstage/core-components": "workspace:^", "@backstage/core-plugin-api": "workspace:^", "@backstage/frontend-app-api": "workspace:^", - "@backstage/frontend-plugin-api": "workspace:^", "@backstage/integration-react": "workspace:^", - "@backstage/plugin-adr": "workspace:^", - "@backstage/plugin-airbrake": "workspace:^", - "@backstage/plugin-apache-airflow": "workspace:^", "@backstage/plugin-api-docs": "workspace:^", - "@backstage/plugin-app-visualizer": "workspace:^", - "@backstage/plugin-azure-devops": "workspace:^", - "@backstage/plugin-azure-sites": "workspace:^", - "@backstage/plugin-badges": "workspace:^", + "@backstage/plugin-auth-react": "workspace:^", "@backstage/plugin-catalog": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-graph": "workspace:^", "@backstage/plugin-catalog-import": "workspace:^", "@backstage/plugin-catalog-react": "workspace:^", "@backstage/plugin-catalog-unprocessed-entities": "workspace:^", - "@backstage/plugin-cloudbuild": "workspace:^", - "@backstage/plugin-code-coverage": "workspace:^", - "@backstage/plugin-cost-insights": "workspace:^", - "@backstage/plugin-devtools": "workspace:^", - "@backstage/plugin-dynatrace": "workspace:^", - "@backstage/plugin-entity-feedback": "workspace:^", - "@backstage/plugin-explore": "workspace:^", - "@backstage/plugin-gcalendar": "workspace:^", - "@backstage/plugin-gcp-projects": "workspace:^", - "@backstage/plugin-github-actions": "workspace:^", - "@backstage/plugin-gocd": "workspace:^", - "@backstage/plugin-graphiql": "workspace:^", "@backstage/plugin-home": "workspace:^", - "@backstage/plugin-jenkins": "workspace:^", - "@backstage/plugin-kafka": "workspace:^", "@backstage/plugin-kubernetes": "workspace:^", - "@backstage/plugin-lighthouse": "workspace:^", - "@backstage/plugin-linguist": "workspace:^", - "@backstage/plugin-linguist-common": "workspace:^", - "@backstage/plugin-microsoft-calendar": "workspace:^", - "@backstage/plugin-newrelic": "workspace:^", - "@backstage/plugin-newrelic-dashboard": "workspace:^", - "@backstage/plugin-octopus-deploy": "workspace:^", + "@backstage/plugin-kubernetes-cluster": "workspace:^", + "@backstage/plugin-notifications": "workspace:^", "@backstage/plugin-org": "workspace:^", - "@backstage/plugin-pagerduty": "workspace:^", "@backstage/plugin-permission-react": "workspace:^", - "@backstage/plugin-playlist": "workspace:^", - "@backstage/plugin-puppetdb": "workspace:^", - "@backstage/plugin-rollbar": "workspace:^", "@backstage/plugin-scaffolder": "workspace:^", "@backstage/plugin-scaffolder-react": "workspace:^", "@backstage/plugin-search": "workspace:^", "@backstage/plugin-search-common": "workspace:^", "@backstage/plugin-search-react": "workspace:^", - "@backstage/plugin-sentry": "workspace:^", - "@backstage/plugin-shortcuts": "workspace:^", - "@backstage/plugin-stackstorm": "workspace:^", - "@backstage/plugin-tech-insights": "workspace:^", - "@backstage/plugin-tech-radar": "workspace:^", + "@backstage/plugin-signals": "workspace:^", "@backstage/plugin-techdocs": "workspace:^", "@backstage/plugin-techdocs-module-addons-contrib": "workspace:^", "@backstage/plugin-techdocs-react": "workspace:^", - "@backstage/plugin-todo": "workspace:^", "@backstage/plugin-user-settings": "workspace:^", "@backstage/theme": "workspace:^", - "@circleci/backstage-plugin": "^0.1.1", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@octokit/rest": "^19.0.3", - "@oriflame/backstage-plugin-score-card": "^0.8.0", - "@roadiehq/backstage-plugin-buildkite": "^2.0.8", - "@roadiehq/backstage-plugin-github-insights": "^2.0.5", - "@roadiehq/backstage-plugin-github-pull-requests": "^2.2.7", - "@roadiehq/backstage-plugin-travis-ci": "^2.0.5", - "app-next-example-plugin": "workspace:^", + "@vitejs/plugin-react": "^4.0.4", "history": "^5.0.0", - "lodash": "^4.17.21", "react": "^18.0.2", "react-dom": "^18.0.2", "react-router": "^6.3.0", "react-router-dom": "^6.3.0", "react-use": "^17.2.4", + "vite": "^4.4.9", + "vite-plugin-html": "^3.2.0", + "vite-plugin-node-polyfills": "^0.21.0", "zen-observable": "^0.10.0" }, "devDependencies": { diff --git a/packages/app/package.json b/packages/app/package.json index f1911474e4..037bbc6295 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -44,81 +44,35 @@ "@backstage/core-plugin-api": "workspace:^", "@backstage/frontend-app-api": "workspace:^", "@backstage/integration-react": "workspace:^", - "@backstage/plugin-adr": "workspace:^", - "@backstage/plugin-airbrake": "workspace:^", - "@backstage/plugin-apache-airflow": "workspace:^", "@backstage/plugin-api-docs": "workspace:^", "@backstage/plugin-auth-react": "workspace:^", - "@backstage/plugin-azure-devops": "workspace:^", - "@backstage/plugin-azure-sites": "workspace:^", - "@backstage/plugin-badges": "workspace:^", "@backstage/plugin-catalog": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-graph": "workspace:^", "@backstage/plugin-catalog-import": "workspace:^", "@backstage/plugin-catalog-react": "workspace:^", "@backstage/plugin-catalog-unprocessed-entities": "workspace:^", - "@backstage/plugin-cloudbuild": "workspace:^", - "@backstage/plugin-code-coverage": "workspace:^", - "@backstage/plugin-cost-insights": "workspace:^", - "@backstage/plugin-devtools": "workspace:^", - "@backstage/plugin-dynatrace": "workspace:^", - "@backstage/plugin-entity-feedback": "workspace:^", - "@backstage/plugin-explore": "workspace:^", - "@backstage/plugin-gcalendar": "workspace:^", - "@backstage/plugin-gcp-projects": "workspace:^", - "@backstage/plugin-github-actions": "workspace:^", - "@backstage/plugin-github-pull-requests-board": "workspace:^", - "@backstage/plugin-gocd": "workspace:^", - "@backstage/plugin-graphiql": "workspace:^", "@backstage/plugin-home": "workspace:^", - "@backstage/plugin-jenkins": "workspace:^", - "@backstage/plugin-kafka": "workspace:^", "@backstage/plugin-kubernetes": "workspace:^", "@backstage/plugin-kubernetes-cluster": "workspace:^", - "@backstage/plugin-lighthouse": "workspace:^", - "@backstage/plugin-linguist": "workspace:^", - "@backstage/plugin-linguist-common": "workspace:^", - "@backstage/plugin-microsoft-calendar": "workspace:^", - "@backstage/plugin-newrelic": "workspace:^", - "@backstage/plugin-newrelic-dashboard": "workspace:^", - "@backstage/plugin-nomad": "workspace:^", "@backstage/plugin-notifications": "workspace:^", - "@backstage/plugin-octopus-deploy": "workspace:^", "@backstage/plugin-org": "workspace:^", - "@backstage/plugin-pagerduty": "workspace:^", "@backstage/plugin-permission-react": "workspace:^", - "@backstage/plugin-playlist": "workspace:^", - "@backstage/plugin-puppetdb": "workspace:^", - "@backstage/plugin-rollbar": "workspace:^", "@backstage/plugin-scaffolder": "workspace:^", "@backstage/plugin-scaffolder-react": "workspace:^", "@backstage/plugin-search": "workspace:^", "@backstage/plugin-search-common": "workspace:^", "@backstage/plugin-search-react": "workspace:^", - "@backstage/plugin-sentry": "workspace:^", - "@backstage/plugin-shortcuts": "workspace:^", "@backstage/plugin-signals": "workspace:^", - "@backstage/plugin-stack-overflow": "workspace:^", - "@backstage/plugin-stackstorm": "workspace:^", - "@backstage/plugin-tech-insights": "workspace:^", - "@backstage/plugin-tech-radar": "workspace:^", "@backstage/plugin-techdocs": "workspace:^", "@backstage/plugin-techdocs-module-addons-contrib": "workspace:^", "@backstage/plugin-techdocs-react": "workspace:^", - "@backstage/plugin-todo": "workspace:^", "@backstage/plugin-user-settings": "workspace:^", "@backstage/theme": "workspace:^", - "@circleci/backstage-plugin": "^0.1.1", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@octokit/rest": "^19.0.3", - "@oriflame/backstage-plugin-score-card": "^0.8.0", - "@roadiehq/backstage-plugin-buildkite": "^2.0.8", - "@roadiehq/backstage-plugin-github-insights": "^2.0.5", - "@roadiehq/backstage-plugin-github-pull-requests": "^2.2.7", - "@roadiehq/backstage-plugin-travis-ci": "^2.0.5", "@vitejs/plugin-react": "^4.0.4", "history": "^5.0.0", "react": "^18.0.2", diff --git a/packages/backend-next/package.json b/packages/backend-next/package.json index 757e4b269f..9de8bb1788 100644 --- a/packages/backend-next/package.json +++ b/packages/backend-next/package.json @@ -29,32 +29,23 @@ "@backstage/backend-plugin-api": "workspace:^", "@backstage/backend-tasks": "workspace:^", "@backstage/catalog-model": "workspace:^", - "@backstage/plugin-adr-backend": "workspace:^", "@backstage/plugin-app-backend": "workspace:^", "@backstage/plugin-auth-backend": "workspace:^", "@backstage/plugin-auth-backend-module-github-provider": "workspace:^", "@backstage/plugin-auth-backend-module-guest-provider": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", - "@backstage/plugin-azure-devops-backend": "workspace:^", - "@backstage/plugin-badges-backend": "workspace:^", "@backstage/plugin-catalog-backend": "workspace:^", "@backstage/plugin-catalog-backend-module-backstage-openapi": "workspace:^", "@backstage/plugin-catalog-backend-module-openapi": "workspace:^", "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "workspace:^", "@backstage/plugin-catalog-backend-module-unprocessed": "workspace:^", "@backstage/plugin-devtools-backend": "workspace:^", - "@backstage/plugin-entity-feedback-backend": "workspace:^", - "@backstage/plugin-jenkins-backend": "workspace:^", "@backstage/plugin-kubernetes-backend": "workspace:^", - "@backstage/plugin-lighthouse-backend": "workspace:^", - "@backstage/plugin-linguist-backend": "workspace:^", - "@backstage/plugin-nomad-backend": "workspace:^", "@backstage/plugin-notifications-backend": "workspace:^", "@backstage/plugin-permission-backend": "workspace:^", "@backstage/plugin-permission-backend-module-allow-all-policy": "workspace:^", "@backstage/plugin-permission-common": "workspace:^", "@backstage/plugin-permission-node": "workspace:^", - "@backstage/plugin-playlist-backend": "workspace:^", "@backstage/plugin-proxy-backend": "workspace:^", "@backstage/plugin-scaffolder-backend": "workspace:^", "@backstage/plugin-scaffolder-backend-module-github": "workspace:^", @@ -64,9 +55,7 @@ "@backstage/plugin-search-backend-module-techdocs": "workspace:^", "@backstage/plugin-search-backend-node": "workspace:^", "@backstage/plugin-signals-backend": "workspace:^", - "@backstage/plugin-sonarqube-backend": "workspace:^", - "@backstage/plugin-techdocs-backend": "workspace:^", - "@backstage/plugin-todo-backend": "workspace:^" + "@backstage/plugin-techdocs-backend": "workspace:^" }, "devDependencies": { "@backstage/cli": "workspace:^" diff --git a/packages/backend/package.json b/packages/backend/package.json index aa128febbb..ee2d70a09a 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -32,35 +32,21 @@ "@backstage/catalog-model": "workspace:^", "@backstage/config": "workspace:^", "@backstage/integration": "workspace:^", - "@backstage/plugin-adr-backend": "workspace:^", "@backstage/plugin-app-backend": "workspace:^", "@backstage/plugin-auth-backend": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", - "@backstage/plugin-azure-devops-backend": "workspace:^", - "@backstage/plugin-azure-sites-common": "workspace:^", - "@backstage/plugin-badges-backend": "workspace:^", "@backstage/plugin-catalog-backend": "workspace:^", "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "workspace:^", "@backstage/plugin-catalog-backend-module-unprocessed": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", - "@backstage/plugin-code-coverage-backend": "workspace:^", "@backstage/plugin-devtools-backend": "workspace:^", - "@backstage/plugin-entity-feedback-backend": "workspace:^", "@backstage/plugin-events-backend": "workspace:^", "@backstage/plugin-events-node": "workspace:^", - "@backstage/plugin-explore-backend": "workspace:^", - "@backstage/plugin-jenkins-backend": "workspace:^", - "@backstage/plugin-kafka-backend": "workspace:^", "@backstage/plugin-kubernetes-backend": "workspace:^", - "@backstage/plugin-lighthouse-backend": "workspace:^", - "@backstage/plugin-linguist-backend": "workspace:^", - "@backstage/plugin-nomad-backend": "workspace:^", "@backstage/plugin-permission-backend": "workspace:^", "@backstage/plugin-permission-common": "workspace:^", "@backstage/plugin-permission-node": "workspace:^", - "@backstage/plugin-playlist-backend": "workspace:^", "@backstage/plugin-proxy-backend": "workspace:^", - "@backstage/plugin-rollbar-backend": "workspace:^", "@backstage/plugin-scaffolder-backend": "workspace:^", "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown": "workspace:^", "@backstage/plugin-scaffolder-backend-module-gitlab": "workspace:^", @@ -74,11 +60,7 @@ "@backstage/plugin-search-backend-node": "workspace:^", "@backstage/plugin-signals-backend": "workspace:^", "@backstage/plugin-signals-node": "workspace:^", - "@backstage/plugin-tech-insights-backend": "workspace:^", - "@backstage/plugin-tech-insights-backend-module-jsonfc": "workspace:^", - "@backstage/plugin-tech-insights-node": "workspace:^", "@backstage/plugin-techdocs-backend": "workspace:^", - "@backstage/plugin-todo-backend": "workspace:^", "@gitbeaker/node": "^35.1.0", "@octokit/rest": "^19.0.3", "@opentelemetry/api": "^1.4.1", diff --git a/packages/core-compat-api/package.json b/packages/core-compat-api/package.json index 8edbf6a506..6dd2115b9c 100644 --- a/packages/core-compat-api/package.json +++ b/packages/core-compat-api/package.json @@ -37,13 +37,13 @@ "@types/react": "^16.13.1 || ^17.0.0" }, "devDependencies": { + "@backstage-community/plugin-puppetdb": "^0.1.18", + "@backstage-community/plugin-stackstorm": "^0.1.16", "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/frontend-app-api": "workspace:^", "@backstage/frontend-test-utils": "workspace:^", "@backstage/plugin-catalog": "workspace:^", - "@backstage/plugin-puppetdb": "workspace:^", - "@backstage/plugin-stackstorm": "workspace:^", "@oriflame/backstage-plugin-score-card": "^0.8.0", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^15.0.0" diff --git a/plugins/linguist-backend/CHANGELOG.md b/plugins/linguist-backend/CHANGELOG.md deleted file mode 100644 index 6ab8a6dd4c..0000000000 --- a/plugins/linguist-backend/CHANGELOG.md +++ /dev/null @@ -1,1085 +0,0 @@ -# @backstage/plugin-linguist-backend - -## 0.5.15 - -### Patch Changes - -- d5a1fe1: Replaced winston logger with `LoggerService` -- Updated dependencies - - @backstage/backend-common@0.21.7 - - @backstage/backend-plugin-api@0.6.17 - - @backstage/backend-tasks@0.5.22 - - @backstage/catalog-client@1.6.4 - - @backstage/plugin-catalog-node@1.11.1 - - @backstage/catalog-model@1.4.5 - - @backstage/config@1.2.0 - - @backstage/errors@1.2.4 - - @backstage/types@1.1.1 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.15-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.21.7-next.1 - - @backstage/backend-plugin-api@0.6.17-next.1 - - @backstage/catalog-client@1.6.4-next.0 - - @backstage/backend-tasks@0.5.22-next.1 - - @backstage/catalog-model@1.4.5 - - @backstage/config@1.2.0 - - @backstage/errors@1.2.4 - - @backstage/types@1.1.1 - - @backstage/plugin-catalog-node@1.11.1-next.1 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.15-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.21.7-next.0 - - @backstage/backend-plugin-api@0.6.17-next.0 - - @backstage/backend-tasks@0.5.22-next.0 - - @backstage/catalog-client@1.6.3 - - @backstage/catalog-model@1.4.5 - - @backstage/config@1.2.0 - - @backstage/errors@1.2.4 - - @backstage/types@1.1.1 - - @backstage/plugin-catalog-node@1.11.1-next.0 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.14 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-node@1.11.0 - - @backstage/catalog-client@1.6.3 - - @backstage/backend-common@0.21.6 - - @backstage/backend-plugin-api@0.6.16 - - @backstage/backend-tasks@0.5.21 - - @backstage/catalog-model@1.4.5 - - @backstage/config@1.2.0 - - @backstage/errors@1.2.4 - - @backstage/types@1.1.1 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.13 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-node@1.10.0 - - @backstage/catalog-client@1.6.2 - - @backstage/backend-common@0.21.5 - - @backstage/backend-tasks@0.5.20 - - @backstage/backend-plugin-api@0.6.15 - - @backstage/catalog-model@1.4.5 - - @backstage/config@1.2.0 - - @backstage/errors@1.2.4 - - @backstage/types@1.1.1 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.12 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-node@1.9.0 - -## 0.5.11 - -### Patch Changes - -- 61ff58f: Migrated to support new auth services. -- 4467036: Allow unauthenticated access to health check endpoint. -- 786c9c4: Updated dependency `luxon` to `^3.0.0`. -- 0fb419b: Updated dependency `uuid` to `^9.0.0`. - Updated dependency `@types/uuid` to `^9.0.0`. -- 051fda1: Removed unused `dependencies` and `devDependencies` identified in Knip Report -- Updated dependencies - - @backstage/backend-common@0.21.4 - - @backstage/config@1.2.0 - - @backstage/errors@1.2.4 - - @backstage/backend-plugin-api@0.6.14 - - @backstage/plugin-catalog-node@1.8.0 - - @backstage/catalog-client@1.6.1 - - @backstage/backend-tasks@0.5.19 - - @backstage/catalog-model@1.4.5 - - @backstage/types@1.1.1 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.11-next.2 - -### Patch Changes - -- 051fda1: Removed unused `dependencies` and `devDependencies` identified in Knip Report -- Updated dependencies - - @backstage/catalog-client@1.6.1-next.1 - - @backstage/backend-common@0.21.4-next.2 - - @backstage/plugin-catalog-node@1.8.0-next.2 - - @backstage/backend-plugin-api@0.6.14-next.2 - - @backstage/backend-tasks@0.5.19-next.2 - - @backstage/catalog-model@1.4.5-next.0 - - @backstage/config@1.2.0-next.1 - - @backstage/errors@1.2.4-next.0 - - @backstage/types@1.1.1 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.11-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/config@1.2.0-next.1 - - @backstage/backend-common@0.21.4-next.1 - - @backstage/backend-plugin-api@0.6.14-next.1 - - @backstage/backend-tasks@0.5.19-next.1 - - @backstage/plugin-auth-node@0.4.9-next.1 - - @backstage/catalog-client@1.6.1-next.0 - - @backstage/catalog-model@1.4.5-next.0 - - @backstage/errors@1.2.4-next.0 - - @backstage/types@1.1.1 - - @backstage/plugin-catalog-node@1.8.0-next.1 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.10-next.0 - -### Patch Changes - -- 61ff58f: Migrated to support new auth services. -- 786c9c4: Updated dependency `luxon` to `^3.0.0`. -- 0fb419b: Updated dependency `uuid` to `^9.0.0`. - Updated dependency `@types/uuid` to `^9.0.0`. -- Updated dependencies - - @backstage/backend-common@0.21.3-next.0 - - @backstage/plugin-auth-node@0.4.8-next.0 - - @backstage/errors@1.2.4-next.0 - - @backstage/backend-plugin-api@0.6.13-next.0 - - @backstage/plugin-catalog-node@1.8.0-next.0 - - @backstage/backend-tasks@0.5.18-next.0 - - @backstage/catalog-client@1.6.1-next.0 - - @backstage/catalog-model@1.4.5-next.0 - - @backstage/config@1.1.2-next.0 - - @backstage/types@1.1.1 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.7 - -### Patch Changes - -- b64ce5a: Updated New Backend System instructions to use default import -- 9aac2b0: Use `--cwd` as the first `yarn` argument -- 6bb6f3e: Updated dependency `fs-extra` to `^11.2.0`. - Updated dependency `@types/fs-extra` to `^11.0.0`. -- Updated dependencies - - @backstage/backend-common@0.21.0 - - @backstage/plugin-auth-node@0.4.4 - - @backstage/backend-plugin-api@0.6.10 - - @backstage/backend-tasks@0.5.15 - - @backstage/catalog-model@1.4.4 - - @backstage/catalog-client@1.6.0 - - @backstage/plugin-catalog-node@1.7.0 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - - @backstage/types@1.1.1 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.7-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.21.0-next.3 - - @backstage/backend-tasks@0.5.15-next.3 - - @backstage/plugin-catalog-node@1.6.2-next.3 - - @backstage/plugin-auth-node@0.4.4-next.3 - - @backstage/backend-plugin-api@0.6.10-next.3 - - @backstage/catalog-client@1.6.0-next.1 - - @backstage/catalog-model@1.4.4-next.0 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - - @backstage/types@1.1.1 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.7-next.2 - -### Patch Changes - -- 9aac2b0: Use `--cwd` as the first `yarn` argument -- Updated dependencies - - @backstage/backend-common@0.21.0-next.2 - - @backstage/backend-plugin-api@0.6.10-next.2 - - @backstage/backend-tasks@0.5.15-next.2 - - @backstage/plugin-auth-node@0.4.4-next.2 - - @backstage/plugin-catalog-node@1.6.2-next.2 - - @backstage/config@1.1.1 - - @backstage/catalog-client@1.6.0-next.1 - - @backstage/catalog-model@1.4.4-next.0 - - @backstage/errors@1.2.3 - - @backstage/types@1.1.1 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.7-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/catalog-model@1.4.4-next.0 - - @backstage/catalog-client@1.6.0-next.1 - - @backstage/backend-plugin-api@0.6.10-next.1 - - @backstage/backend-common@0.21.0-next.1 - - @backstage/backend-tasks@0.5.15-next.1 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - - @backstage/types@1.1.1 - - @backstage/plugin-auth-node@0.4.4-next.1 - - @backstage/plugin-catalog-node@1.6.2-next.1 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.7-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.21.0-next.0 - - @backstage/catalog-client@1.6.0-next.0 - - @backstage/backend-tasks@0.5.15-next.0 - - @backstage/plugin-auth-node@0.4.4-next.0 - - @backstage/plugin-catalog-node@1.6.2-next.0 - - @backstage/backend-plugin-api@0.6.10-next.0 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - - @backstage/types@1.1.1 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.6 - -### Patch Changes - -- 4016f21: Remove some unused dependencies -- Updated dependencies - - @backstage/backend-common@0.20.1 - - @backstage/catalog-client@1.5.2 - - @backstage/backend-plugin-api@0.6.9 - - @backstage/plugin-catalog-node@1.6.1 - - @backstage/backend-tasks@0.5.14 - - @backstage/plugin-auth-node@0.4.3 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - - @backstage/types@1.1.1 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.6-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-plugin-api@0.6.9-next.2 - - @backstage/backend-common@0.20.1-next.2 - - @backstage/plugin-auth-node@0.4.3-next.2 - - @backstage/plugin-catalog-node@1.6.1-next.2 - - @backstage/backend-tasks@0.5.14-next.2 - -## 0.5.6-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.20.1-next.1 - - @backstage/config@1.1.1 - - @backstage/backend-tasks@0.5.14-next.1 - - @backstage/plugin-auth-node@0.4.3-next.1 - - @backstage/backend-plugin-api@0.6.9-next.1 - - @backstage/catalog-client@1.5.2-next.0 - - @backstage/catalog-model@1.4.3 - - @backstage/errors@1.2.3 - - @backstage/types@1.1.1 - - @backstage/plugin-catalog-node@1.6.1-next.1 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.6-next.0 - -### Patch Changes - -- 4016f21: Remove some unused dependencies -- Updated dependencies - - @backstage/backend-common@0.20.1-next.0 - - @backstage/catalog-client@1.5.2-next.0 - - @backstage/plugin-catalog-node@1.6.1-next.0 - - @backstage/backend-plugin-api@0.6.9-next.0 - - @backstage/backend-tasks@0.5.14-next.0 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - - @backstage/types@1.1.1 - - @backstage/plugin-auth-node@0.4.3-next.0 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.5 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.20.0 - - @backstage/plugin-catalog-node@1.6.0 - - @backstage/catalog-client@1.5.0 - - @backstage/backend-tasks@0.5.13 - - @backstage/plugin-auth-node@0.4.2 - - @backstage/backend-plugin-api@0.6.8 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - - @backstage/types@1.1.1 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.5-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.20.0-next.3 - - @backstage/backend-plugin-api@0.6.8-next.3 - - @backstage/backend-tasks@0.5.13-next.3 - - @backstage/catalog-client@1.5.0-next.1 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - - @backstage/types@1.1.1 - - @backstage/plugin-auth-node@0.4.2-next.3 - - @backstage/plugin-catalog-node@1.6.0-next.3 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.5-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-node@1.6.0-next.2 - - @backstage/backend-common@0.20.0-next.2 - - @backstage/plugin-auth-node@0.4.2-next.2 - - @backstage/catalog-client@1.5.0-next.1 - - @backstage/backend-plugin-api@0.6.8-next.2 - - @backstage/backend-tasks@0.5.13-next.2 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - - @backstage/types@1.1.1 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.5-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/catalog-client@1.5.0-next.0 - - @backstage/backend-common@0.20.0-next.1 - - @backstage/backend-plugin-api@0.6.8-next.1 - - @backstage/backend-tasks@0.5.13-next.1 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - - @backstage/types@1.1.1 - - @backstage/plugin-auth-node@0.4.2-next.1 - - @backstage/plugin-catalog-node@1.5.1-next.1 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.5-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.20.0-next.0 - - @backstage/backend-tasks@0.5.13-next.0 - - @backstage/plugin-auth-node@0.4.2-next.0 - - @backstage/plugin-catalog-node@1.5.1-next.0 - - @backstage/backend-plugin-api@0.6.8-next.0 - - @backstage/catalog-client@1.4.6 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - - @backstage/types@1.1.1 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.4 - -### Patch Changes - -- 013611b42e: `knex` has been bumped to major version 3 and `better-sqlite3` to major version 9, which deprecate node 16 support. -- Updated dependencies - - @backstage/plugin-catalog-node@1.5.0 - - @backstage/backend-common@0.19.9 - - @backstage/backend-plugin-api@0.6.7 - - @backstage/backend-tasks@0.5.12 - - @backstage/catalog-client@1.4.6 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - - @backstage/types@1.1.1 - - @backstage/plugin-auth-node@0.4.1 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.4-next.2 - -### Patch Changes - -- [#20570](https://github.com/backstage/backstage/pull/20570) [`013611b42e`](https://github.com/backstage/backstage/commit/013611b42ed457fefa9bb85fddf416cf5e0c1f76) Thanks [@freben](https://github.com/freben)! - `knex` has been bumped to major version 3 and `better-sqlite3` to major version 9, which deprecate node 16 support. - -- Updated dependencies - - @backstage/backend-plugin-api@0.6.7-next.2 - - @backstage/backend-common@0.19.9-next.2 - - @backstage/backend-tasks@0.5.12-next.2 - - @backstage/plugin-auth-node@0.4.1-next.2 - - @backstage/plugin-catalog-node@1.5.0-next.2 - -## 0.5.4-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-node@1.5.0-next.1 - - @backstage/backend-common@0.19.9-next.1 - - @backstage/backend-tasks@0.5.12-next.1 - - @backstage/plugin-auth-node@0.4.1-next.1 - - @backstage/backend-plugin-api@0.6.7-next.1 - - @backstage/catalog-client@1.4.5 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - - @backstage/types@1.1.1 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.4-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.19.9-next.0 - - @backstage/backend-plugin-api@0.6.7-next.0 - - @backstage/backend-tasks@0.5.12-next.0 - - @backstage/catalog-client@1.4.5 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - - @backstage/types@1.1.1 - - @backstage/plugin-auth-node@0.4.1-next.0 - - @backstage/plugin-catalog-node@1.4.8-next.0 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.3 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-tasks@0.5.11 - - @backstage/backend-common@0.19.8 - - @backstage/plugin-catalog-node@1.4.7 - - @backstage/plugin-auth-node@0.4.0 - - @backstage/catalog-model@1.4.3 - - @backstage/errors@1.2.3 - - @backstage/backend-plugin-api@0.6.6 - - @backstage/catalog-client@1.4.5 - - @backstage/config@1.1.1 - - @backstage/types@1.1.1 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.3-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.19.8-next.2 - - @backstage/plugin-auth-node@0.4.0-next.2 - - @backstage/catalog-model@1.4.3-next.0 - - @backstage/errors@1.2.3-next.0 - - @backstage/backend-tasks@0.5.11-next.2 - - @backstage/plugin-catalog-node@1.4.7-next.2 - - @backstage/backend-plugin-api@0.6.6-next.2 - - @backstage/catalog-client@1.4.5-next.0 - - @backstage/config@1.1.1-next.0 - - @backstage/types@1.1.1 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.2-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-tasks@0.5.10-next.1 - - @backstage/plugin-catalog-node@1.4.6-next.1 - - @backstage/backend-common@0.19.7-next.1 - - @backstage/backend-plugin-api@0.6.5-next.1 - - @backstage/plugin-auth-node@0.3.2-next.1 - - @backstage/config@1.1.0 - - @backstage/catalog-client@1.4.4 - - @backstage/catalog-model@1.4.2 - - @backstage/errors@1.2.2 - - @backstage/types@1.1.1 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.2-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-auth-node@0.3.2-next.0 - - @backstage/backend-common@0.19.7-next.0 - - @backstage/config@1.1.0 - - @backstage/backend-plugin-api@0.6.5-next.0 - - @backstage/backend-tasks@0.5.10-next.0 - - @backstage/catalog-client@1.4.4 - - @backstage/catalog-model@1.4.2 - - @backstage/errors@1.2.2 - - @backstage/types@1.1.1 - - @backstage/plugin-catalog-node@1.4.6-next.0 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.5.0 - -### Minor Changes - -- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. - - For example, if you are currently importing the plugin using the following pattern: - - ```ts - import { examplePlugin } from '@backstage/plugin-example-backend'; - - backend.add(examplePlugin); - ``` - - It should be migrated to this: - - ```ts - backend.add(import('@backstage/plugin-example-backend')); - ``` - -### Patch Changes - -- b2de501bda31: When creating the router using `createRouterFromConfig` or using the plugin for the new backend system the `linguist.useSourceLocation` configuration is now optional. -- cfc3ca6ce060: Changes needed to support MySQL -- Updated dependencies - - @backstage/backend-tasks@0.5.8 - - @backstage/backend-common@0.19.5 - - @backstage/plugin-auth-node@0.3.0 - - @backstage/config@1.1.0 - - @backstage/catalog-client@1.4.4 - - @backstage/catalog-model@1.4.2 - - @backstage/errors@1.2.2 - - @backstage/plugin-linguist-common@0.1.2 - - @backstage/types@1.1.1 - - @backstage/backend-plugin-api@0.6.3 - - @backstage/plugin-catalog-node@1.4.4 - -## 0.5.0-next.3 - -### Minor Changes - -- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. - - For example, if you are currently importing the plugin using the following pattern: - - ```ts - import { examplePlugin } from '@backstage/plugin-example-backend'; - - backend.add(examplePlugin); - ``` - - It should be migrated to this: - - ```ts - backend.add(import('@backstage/plugin-example-backend')); - ``` - -### Patch Changes - -- Updated dependencies - - @backstage/catalog-client@1.4.4-next.2 - - @backstage/catalog-model@1.4.2-next.2 - - @backstage/config@1.1.0-next.2 - - @backstage/errors@1.2.2-next.0 - - @backstage/plugin-linguist-common@0.1.2-next.0 - - @backstage/types@1.1.1-next.0 - - @backstage/backend-plugin-api@0.6.3-next.3 - - @backstage/backend-common@0.19.5-next.3 - - @backstage/backend-tasks@0.5.8-next.3 - - @backstage/plugin-auth-node@0.3.0-next.3 - - @backstage/plugin-catalog-node@1.4.4-next.3 - -## 0.4.3-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/config@1.1.0-next.1 - - @backstage/backend-tasks@0.5.8-next.2 - - @backstage/backend-common@0.19.5-next.2 - - @backstage/plugin-auth-node@0.3.0-next.2 - - @backstage/plugin-catalog-node@1.4.4-next.2 - - @backstage/backend-plugin-api@0.6.3-next.2 - - @backstage/catalog-model@1.4.2-next.1 - - @backstage/catalog-client@1.4.4-next.1 - - @backstage/errors@1.2.1 - - @backstage/types@1.1.0 - - @backstage/plugin-linguist-common@0.1.1 - -## 0.4.3-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/config@1.1.0-next.0 - - @backstage/backend-tasks@0.5.8-next.1 - - @backstage/backend-common@0.19.5-next.1 - - @backstage/backend-plugin-api@0.6.3-next.1 - - @backstage/catalog-model@1.4.2-next.0 - - @backstage/plugin-auth-node@0.3.0-next.1 - - @backstage/plugin-catalog-node@1.4.4-next.1 - - @backstage/catalog-client@1.4.4-next.0 - - @backstage/errors@1.2.1 - - @backstage/types@1.1.0 - - @backstage/plugin-linguist-common@0.1.1 - -## 0.4.2-next.0 - -### Patch Changes - -- b2de501bda31: When creating the router using `createRouterFromConfig` or using the plugin for the new backend system the `linguist.useSourceLocation` configuration is now optional. -- cfc3ca6ce060: Changes needed to support MySQL -- Updated dependencies - - @backstage/plugin-auth-node@0.3.0-next.0 - - @backstage/backend-common@0.19.4-next.0 - - @backstage/backend-tasks@0.5.7-next.0 - - @backstage/backend-plugin-api@0.6.2-next.0 - - @backstage/catalog-client@1.4.3 - - @backstage/catalog-model@1.4.1 - - @backstage/config@1.0.8 - - @backstage/errors@1.2.1 - - @backstage/types@1.1.0 - - @backstage/plugin-catalog-node@1.4.3-next.0 - - @backstage/plugin-linguist-common@0.1.1 - -## 0.4.0 - -### Minor Changes - -- d440f1dd0e72: Adds a processor to the linguist backend which can automatically add language tags to entities -- 0896d85d5ab5: **BREAKING**: Removed the alpha export plugin options from exported `linguistPlugin()` (used by the new backend system) in favour of static config. - -### Patch Changes - -- 12a8c94eda8d: Add package repository and homepage metadata -- ca5e591cb86a: Fixed bug in LinguistBackendClient.ts file where if the linguistJsOptions is specified and sent over to the linguist-js package it would get changed (another attribute would be added) causing future entities of the batch to fail with an error -- Updated dependencies - - @backstage/backend-common@0.19.2 - - @backstage/backend-plugin-api@0.6.0 - - @backstage/plugin-linguist-common@0.1.1 - - @backstage/plugin-catalog-node@1.4.1 - - @backstage/plugin-auth-node@0.2.17 - - @backstage/backend-tasks@0.5.5 - - @backstage/catalog-client@1.4.3 - - @backstage/catalog-model@1.4.1 - - @backstage/config@1.0.8 - - @backstage/errors@1.2.1 - - @backstage/types@1.1.0 - -## 0.4.0-next.2 - -### Minor Changes - -- d440f1dd0e72: Adds a processor to the linguist backend which can automatically add language tags to entities - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-linguist-common@0.1.1-next.1 - - @backstage/backend-plugin-api@0.6.0-next.2 - - @backstage/backend-tasks@0.5.5-next.2 - - @backstage/backend-common@0.19.2-next.2 - - @backstage/plugin-catalog-node@1.4.1-next.2 - - @backstage/plugin-auth-node@0.2.17-next.2 - -## 0.3.2-next.1 - -### Patch Changes - -- 12a8c94eda8d: Add package repository and homepage metadata -- Updated dependencies - - @backstage/backend-common@0.19.2-next.1 - - @backstage/plugin-linguist-common@0.1.1-next.0 - - @backstage/plugin-auth-node@0.2.17-next.1 - - @backstage/backend-plugin-api@0.6.0-next.1 - - @backstage/backend-tasks@0.5.5-next.1 - - @backstage/catalog-client@1.4.3 - - @backstage/catalog-model@1.4.1 - - @backstage/config@1.0.8 - - @backstage/errors@1.2.1 - - @backstage/types@1.1.0 - -## 0.3.2-next.0 - -### Patch Changes - -- ca5e591cb86a: Fixed bug in LinguistBackendClient.ts file where if the linguistJsOptions is specified and sent over to the linguist-js package it would get changed (another attribute would be added) causing future entities of the batch to fail with an error -- Updated dependencies - - @backstage/backend-common@0.19.2-next.0 - - @backstage/backend-plugin-api@0.5.5-next.0 - - @backstage/backend-tasks@0.5.5-next.0 - - @backstage/catalog-client@1.4.3 - - @backstage/catalog-model@1.4.1 - - @backstage/config@1.0.8 - - @backstage/errors@1.2.1 - - @backstage/types@1.1.0 - - @backstage/plugin-auth-node@0.2.17-next.0 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.3.1 - -### Patch Changes - -- ae261e79d256: Added alpha support for the [new backend system](https://backstage.io/docs/backend-system/) -- Updated dependencies - - @backstage/errors@1.2.1 - - @backstage/backend-common@0.19.1 - - @backstage/backend-plugin-api@0.5.4 - - @backstage/backend-tasks@0.5.4 - - @backstage/catalog-client@1.4.3 - - @backstage/catalog-model@1.4.1 - - @backstage/config@1.0.8 - - @backstage/types@1.1.0 - - @backstage/plugin-auth-node@0.2.16 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.3.1-next.1 - -### Patch Changes - -- ae261e79d256: Added alpha support for the [new backend system](https://backstage.io/docs/backend-system/) -- Updated dependencies - - @backstage/config@1.0.8 - -## 0.3.1-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/errors@1.2.1-next.0 - - @backstage/backend-common@0.19.1-next.0 - - @backstage/backend-tasks@0.5.4-next.0 - - @backstage/catalog-client@1.4.3-next.0 - - @backstage/catalog-model@1.4.1-next.0 - - @backstage/config@1.0.8 - - @backstage/types@1.1.0 - - @backstage/plugin-auth-node@0.2.16-next.0 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.3.0 - -### Minor Changes - -- bbf91840a52a: **BREAKING**: Removed public constructor from `LinguistBackendApi`. Removed export of `LinguistBackendDatabase` and `LinguistBackendStore` - - Several improvements to the Linguist backend have been made: - - - Added tests for the `LinguistBackendDatabase` and `LinguistBackendApi` - - Added support for using SQLite as a database, helpful for local development - - Removed the default from the `processes_date` column - - Converted the `LinguistBackendApi` into an Interface - - Added the `LinguistBackendClient` which implements the `LinguistBackendApi` Interface - - Unprocessed entities will get processed before stale entities - - Entities in the Linguist database but not in the Catalog anymore will be deleted - - Improved the README's headings - -### Patch Changes - -- e39c3829bbd4: Fix: CatalogClient call without token -- 3d11596a72b5: Update plugin installation docs to be more consistent across documentations -- Updated dependencies - - @backstage/backend-common@0.19.0 - - @backstage/catalog-client@1.4.2 - - @backstage/types@1.1.0 - - @backstage/catalog-model@1.4.0 - - @backstage/errors@1.2.0 - - @backstage/backend-tasks@0.5.3 - - @backstage/plugin-auth-node@0.2.15 - - @backstage/config@1.0.8 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.3.0-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.19.0-next.2 - - @backstage/catalog-model@1.4.0-next.1 - - @backstage/backend-tasks@0.5.3-next.2 - - @backstage/catalog-client@1.4.2-next.2 - - @backstage/config@1.0.7 - - @backstage/errors@1.2.0-next.0 - - @backstage/types@1.0.2 - - @backstage/plugin-auth-node@0.2.15-next.2 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.3.0-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.19.0-next.1 - - @backstage/errors@1.2.0-next.0 - - @backstage/catalog-model@1.4.0-next.0 - - @backstage/backend-tasks@0.5.3-next.1 - - @backstage/plugin-auth-node@0.2.15-next.1 - - @backstage/catalog-client@1.4.2-next.1 - - @backstage/config@1.0.7 - - @backstage/types@1.0.2 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.3.0-next.0 - -### Minor Changes - -- bbf91840a52a: **BREAKING**: Removed public constructor from `LinguistBackendApi`. Removed export of `LinguistBackendDatabase` and `LinguistBackendStore` - - Several improvements to the Linguist backend have been made: - - - Added tests for the `LinguistBackendDatabase` and `LinguistBackendApi` - - Added support for using SQLite as a database, helpful for local development - - Removed the default from the `processes_date` column - - Converted the `LinguistBackendApi` into an Interface - - Added the `LinguistBackendClient` which implements the `LinguistBackendApi` Interface - - Unprocessed entities will get processed before stale entities - - Entities in the Linguist database but not in the Catalog anymore will be deleted - - Improved the README's headings - -### Patch Changes - -- 3d11596a72b5: Update plugin installation docs to be more consistent across documentations -- Updated dependencies - - @backstage/catalog-client@1.4.2-next.0 - - @backstage/backend-common@0.18.6-next.0 - - @backstage/config@1.0.7 - - @backstage/backend-tasks@0.5.3-next.0 - - @backstage/catalog-model@1.3.0 - - @backstage/errors@1.1.5 - - @backstage/types@1.0.2 - - @backstage/plugin-auth-node@0.2.15-next.0 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.2.2 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.18.5 - - @backstage/backend-tasks@0.5.2 - - @backstage/plugin-auth-node@0.2.14 - - @backstage/catalog-client@1.4.1 - - @backstage/catalog-model@1.3.0 - - @backstage/config@1.0.7 - - @backstage/errors@1.1.5 - - @backstage/types@1.0.2 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.2.2-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.18.5-next.1 - - @backstage/backend-tasks@0.5.2-next.1 - - @backstage/plugin-auth-node@0.2.14-next.1 - - @backstage/config@1.0.7 - -## 0.2.2-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.18.5-next.0 - - @backstage/backend-tasks@0.5.2-next.0 - - @backstage/plugin-auth-node@0.2.14-next.0 - - @backstage/catalog-client@1.4.1 - - @backstage/catalog-model@1.3.0 - - @backstage/config@1.0.7 - - @backstage/errors@1.1.5 - - @backstage/types@1.0.2 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.2.1 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.18.4 - - @backstage/catalog-client@1.4.1 - - @backstage/backend-tasks@0.5.1 - - @backstage/catalog-model@1.3.0 - - @backstage/plugin-auth-node@0.2.13 - - @backstage/config@1.0.7 - - @backstage/errors@1.1.5 - - @backstage/types@1.0.2 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.2.1-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/catalog-model@1.3.0-next.0 - - @backstage/backend-common@0.18.4-next.2 - - @backstage/backend-tasks@0.5.1-next.2 - - @backstage/catalog-client@1.4.1-next.1 - - @backstage/config@1.0.7 - - @backstage/errors@1.1.5 - - @backstage/types@1.0.2 - - @backstage/plugin-auth-node@0.2.13-next.2 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.2.1-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.18.4-next.2 - - @backstage/catalog-client@1.4.1-next.0 - - @backstage/backend-tasks@0.5.1-next.2 - - @backstage/catalog-model@1.2.1 - - @backstage/config@1.0.7 - - @backstage/errors@1.1.5 - - @backstage/types@1.0.2 - - @backstage/plugin-auth-node@0.2.13-next.2 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.2.1-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-tasks@0.5.1-next.1 - - @backstage/backend-common@0.18.4-next.1 - - @backstage/catalog-client@1.4.0 - - @backstage/catalog-model@1.2.1 - - @backstage/config@1.0.7 - - @backstage/errors@1.1.5 - - @backstage/types@1.0.2 - - @backstage/plugin-auth-node@0.2.13-next.1 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.2.1-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.18.4-next.0 - - @backstage/config@1.0.7 - - @backstage/backend-tasks@0.5.1-next.0 - - @backstage/catalog-client@1.4.0 - - @backstage/catalog-model@1.2.1 - - @backstage/errors@1.1.5 - - @backstage/types@1.0.2 - - @backstage/plugin-auth-node@0.2.13-next.0 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.2.0 - -### Minor Changes - -- 4a1c318853d: **BREAKING** The linguist-backend `createRouter` now requires that the `tokenManger` is passed to the router. - -### Patch Changes - -- 8a298b47240: Added support for linguist-js options using the linguistJSOptions in the plugin, the available config can be found [here](https://www.npmjs.com/package/linguist-js#API). -- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. -- 2ea57821629: Fixed bug in LinguistBackendApi that caused initial batch of entities to be skipped. -- b271d5ca052: Allow kind to be configurable - - ```ts - return createRouter({ schedule: schedule, kind: ['Component'] }, { ...env }); - ``` - -- Updated dependencies - - @backstage/catalog-client@1.4.0 - - @backstage/plugin-auth-node@0.2.12 - - @backstage/backend-tasks@0.5.0 - - @backstage/backend-common@0.18.3 - - @backstage/errors@1.1.5 - - @backstage/catalog-model@1.2.1 - - @backstage/config@1.0.7 - - @backstage/types@1.0.2 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.2.0-next.2 - -### Patch Changes - -- 8a298b47240: Added support for linguist-js options using the linguistJSOptions in the plugin, the available config can be found [here](https://www.npmjs.com/package/linguist-js#API). -- Updated dependencies - - @backstage/plugin-auth-node@0.2.12-next.2 - - @backstage/backend-tasks@0.5.0-next.2 - - @backstage/backend-common@0.18.3-next.2 - - @backstage/config@1.0.7-next.0 - -## 0.2.0-next.1 - -### Patch Changes - -- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. -- b271d5ca052: Allow kind to be configurable - - ```ts - return createRouter({ schedule: schedule, kind: ['Component'] }, { ...env }); - ``` - -- Updated dependencies - - @backstage/errors@1.1.5-next.0 - - @backstage/backend-common@0.18.3-next.1 - - @backstage/catalog-client@1.4.0-next.1 - - @backstage/plugin-auth-node@0.2.12-next.1 - - @backstage/backend-tasks@0.4.4-next.1 - - @backstage/config@1.0.7-next.0 - - @backstage/catalog-model@1.2.1-next.1 - - @backstage/types@1.0.2 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.2.0-next.0 - -### Minor Changes - -- 4a1c318853: **BREAKING** The linguist-backend `createRouter` now requires that the `tokenManger` is passed to the router. - -### Patch Changes - -- 2ea5782162: Fixed bug in LinguistBackendApi that caused initial batch of entities to be skipped. -- Updated dependencies - - @backstage/catalog-client@1.4.0-next.0 - - @backstage/backend-tasks@0.4.4-next.0 - - @backstage/backend-common@0.18.3-next.0 - - @backstage/catalog-model@1.2.1-next.0 - - @backstage/config@1.0.6 - - @backstage/errors@1.1.4 - - @backstage/types@1.0.2 - - @backstage/plugin-auth-node@0.2.12-next.0 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.1.0 - -### Minor Changes - -- 75cfee5688: Introduced the Linguist plugin, checkout the plugin's `README.md` for more details! - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.18.2 - - @backstage/catalog-model@1.2.0 - - @backstage/plugin-linguist-common@0.1.0 - - @backstage/backend-tasks@0.4.3 - - @backstage/catalog-client@1.3.1 - - @backstage/config@1.0.6 - - @backstage/errors@1.1.4 - - @backstage/types@1.0.2 - - @backstage/plugin-auth-node@0.2.11 diff --git a/plugins/linguist-backend/README.md b/plugins/linguist-backend/README.md deleted file mode 100644 index a303374a39..0000000000 --- a/plugins/linguist-backend/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Deprecated - -This package has been moved to the [backstage-community/plugins](https://github.com/backstage/community-plugins) repository. Migrate to using `@backstage-community/plugin-linguist-backend` instead. diff --git a/plugins/linguist-backend/api-report.md b/plugins/linguist-backend/api-report.md deleted file mode 100644 index e59b1229f7..0000000000 --- a/plugins/linguist-backend/api-report.md +++ /dev/null @@ -1,123 +0,0 @@ -## API Report File for "@backstage/plugin-linguist-backend" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts -import { AuthService } from '@backstage/backend-plugin-api'; -import { BackendFeature } from '@backstage/backend-plugin-api'; -import { CatalogProcessor } from '@backstage/plugin-catalog-node'; -import { CatalogProcessorCache } from '@backstage/plugin-catalog-node'; -import { Config } from '@backstage/config'; -import { DiscoveryService } from '@backstage/backend-plugin-api'; -import { Entity } from '@backstage/catalog-model'; -import express from 'express'; -import { HttpAuthService } from '@backstage/backend-plugin-api'; -import { HumanDuration } from '@backstage/types'; -import { Languages } from '@backstage/plugin-linguist-common'; -import { LanguageType } from '@backstage/plugin-linguist-common'; -import { LoggerService } from '@backstage/backend-plugin-api'; -import { PluginDatabaseManager } from '@backstage/backend-common'; -import { PluginEndpointDiscovery } from '@backstage/backend-common'; -import { PluginTaskScheduler } from '@backstage/backend-tasks'; -import { TaskScheduleDefinition } from '@backstage/backend-tasks'; -import { TokenManager } from '@backstage/backend-common'; -import { UrlReader } from '@backstage/backend-common'; - -// @public (undocumented) -export function createRouter( - pluginOptions: PluginOptions, - routerOptions: RouterOptions, -): Promise; - -// @public (undocumented) -export function createRouterFromConfig( - routerOptions: RouterOptions, -): Promise; - -// @public (undocumented) -export interface LinguistBackendApi { - // (undocumented) - getEntityLanguages(entityRef: string): Promise; - // (undocumented) - processEntities(): Promise; -} - -// @public -const linguistPlugin: () => BackendFeature; -export default linguistPlugin; - -// @public -export class LinguistTagsProcessor implements CatalogProcessor { - constructor(options: LinguistTagsProcessorOptions); - // (undocumented) - static fromConfig( - config: Config, - options: LinguistTagsProcessorOptions, - ): LinguistTagsProcessor; - // (undocumented) - getProcessorName(): string; - preProcessEntity( - entity: Entity, - _: any, - __: any, - ___: any, - cache: CatalogProcessorCache, - ): Promise; -} - -// @public -export interface LinguistTagsProcessorOptions { - bytesThreshold?: number; - cacheTTL?: HumanDuration; - // (undocumented) - discovery: DiscoveryService; - languageMap?: Record; - languageTypes?: LanguageType[]; - // (undocumented) - logger: LoggerService; - shouldProcessEntity?: ShouldProcessEntity; -} - -// @public (undocumented) -export interface PluginOptions { - // (undocumented) - age?: HumanDuration; - // (undocumented) - batchSize?: number; - // (undocumented) - kind?: string[]; - // (undocumented) - linguistJsOptions?: Record; - // (undocumented) - schedule?: TaskScheduleDefinition; - // (undocumented) - useSourceLocation?: boolean; -} - -// @public (undocumented) -export interface RouterOptions { - // (undocumented) - auth?: AuthService; - // (undocumented) - config?: Config; - // (undocumented) - database: PluginDatabaseManager; - // (undocumented) - discovery: PluginEndpointDiscovery; - // (undocumented) - httpAuth?: HttpAuthService; - // (undocumented) - linguistBackendApi?: LinguistBackendApi; - // (undocumented) - logger: LoggerService; - // (undocumented) - reader: UrlReader; - // (undocumented) - scheduler?: PluginTaskScheduler; - // (undocumented) - tokenManager: TokenManager; -} - -// @public -export type ShouldProcessEntity = (entity: Entity) => boolean; -``` diff --git a/plugins/linguist-backend/catalog-info.yaml b/plugins/linguist-backend/catalog-info.yaml deleted file mode 100644 index de7545d39b..0000000000 --- a/plugins/linguist-backend/catalog-info.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: backstage.io/v1alpha1 -kind: Component -metadata: - name: backstage-plugin-linguist-backend - title: '@backstage/plugin-linguist-backend' -spec: - lifecycle: experimental - type: backstage-backend-plugin - owner: awanlin diff --git a/plugins/linguist-backend/config.d.ts b/plugins/linguist-backend/config.d.ts deleted file mode 100644 index 758210feb7..0000000000 --- a/plugins/linguist-backend/config.d.ts +++ /dev/null @@ -1,72 +0,0 @@ -/* - * 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 { TaskScheduleDefinition } from '@backstage/backend-tasks'; -import { HumanDuration } from '@backstage/types'; -import { Options as LinguistJsOptions } from 'linguist-js/dist/types'; - -export interface Config { - /** Configuration options for the linguist plugin */ - linguist?: { - schedule?: TaskScheduleDefinition; - /** - * @default 20 - */ - batchSize?: number; - /** - * @default false - */ - useSourceLocation?: boolean; - /** - * Refresh generated language breakdown - */ - age?: HumanDuration; - /** - * @default ['API', 'Component', 'Template'] - */ - kind?: string[]; - /** - * [linguist-js](https://www.npmjs.com/package/linguist-js) options - */ - linguistJsOptions?: LinguistJsOptions; - - /** Options for the tags processor */ - tagsProcessor?: { - /** - * Determines how many bytes of a language should be in a repo - * for it to be added as an entity tag. Defaults to 0. - */ - bytesThreshold?: number; - /** - * The types of linguist languages that should be processed. Can be - * any of "programming", "data", "markup", "prose". Defaults to ["programming"]. - */ - languageTypes?: string[]; - /** - * A custom mapping of linguist languages to how they should be rendered as entity tags. - * If a language is mapped to '' it will not be included as a tag. - */ - languageMap?: { - [language: string]: string | undefined; - }; - /** - * How long to cache entity languages for in memory. Used to avoid constant db hits during - * processing. Defaults to 30 minutes. - */ - cacheTTL?: HumanDuration; - }; - }; -} diff --git a/plugins/linguist-backend/knip-report.md b/plugins/linguist-backend/knip-report.md deleted file mode 100644 index 2661c35327..0000000000 --- a/plugins/linguist-backend/knip-report.md +++ /dev/null @@ -1,2 +0,0 @@ -# Knip report - diff --git a/plugins/linguist-backend/migrations/20221115_init.js b/plugins/linguist-backend/migrations/20221115_init.js deleted file mode 100644 index 359f7c8359..0000000000 --- a/plugins/linguist-backend/migrations/20221115_init.js +++ /dev/null @@ -1,63 +0,0 @@ -/* - * 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. - */ - -/** - * @param {import('knex').Knex} knex - */ -exports.up = async function up(knex) { - // Note for the reader: the knex increments types automatically make it a - // primary column, whether you like it or not. That's why the id column is - // not marked as primary as one might have expected; it's only used for - // lookups by ID. Because, SQLite and MySQL don't return RETURNING on - // inserts ... so we want a manually generated key for lookups (an uuid), - // and also an index for ordering guarantees :) - await knex.schema.createTable('entity_result', table => { - table.comment('Table containing results from running Linguist'); - table - .bigIncrements('index') - .notNullable() - .comment('An insert counter to ensure ordering'); - table.uuid('id').notNullable().comment('The ID of the Linguist result'); - table - .string('entity_ref') - .unique() - .notNullable() - .comment('The entity ref that this Linguist result applies to'); - table.text('languages').comment('The results json as a string'); - table - .dateTime('created_at') - .defaultTo(knex.fn.now()) - .notNullable() - .comment('The timestamp when this entry was created'); - table - .dateTime('processed_date') - .defaultTo(knex.fn.now()) - .comment('The timestamp when this entity was processed'); - table.index('index', 'entity_result_index_idx'); - table.index('entity_ref', 'entity_result_entity_ref_idx'); - }); -}; - -/** - * @param {import('knex').Knex} knex - */ -exports.down = async function down(knex) { - await knex.schema.alterTable('entity_result', table => { - table.dropIndex([], 'entity_result_index_idx'); - table.dropIndex([], 'entity_result_entity_ref_idx'); - }); - await knex.schema.dropTable('entity_result'); -}; diff --git a/plugins/linguist-backend/migrations/20230216_remove_processed_date_default.js b/plugins/linguist-backend/migrations/20230216_remove_processed_date_default.js deleted file mode 100644 index 5aaf02216e..0000000000 --- a/plugins/linguist-backend/migrations/20230216_remove_processed_date_default.js +++ /dev/null @@ -1,39 +0,0 @@ -/* - * 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. - */ - -/** - * @param {import('knex').Knex} knex - */ -exports.up = async function up(knex) { - // Sqlite does not support this raw SQL - if (!knex.client.config.client.includes('sqlite3')) { - await knex.raw( - 'ALTER TABLE entity_result ALTER COLUMN processed_date DROP DEFAULT;', - ); - } -}; - -/** - * @param {import('knex').Knex} knex - */ -exports.down = async function down(knex) { - // Sqlite does not support this raw SQL - if (!knex.client.config.client.includes('sqlite3')) { - await knex.raw( - 'ALTER TABLE entity_result ALTER COLUMN processed_date SET DEFAULT now();', - ); - } -}; diff --git a/plugins/linguist-backend/package.json b/plugins/linguist-backend/package.json deleted file mode 100644 index f70ef88fd0..0000000000 --- a/plugins/linguist-backend/package.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "name": "@backstage/plugin-linguist-backend", - "version": "0.5.15", - "backstage": { - "role": "backend-plugin", - "moved": "@backstage-community/plugin-linguist-backend" - }, - "publishConfig": { - "access": "public", - "main": "dist/index.cjs.js", - "types": "dist/index.d.ts" - }, - "homepage": "https://backstage.io", - "repository": { - "type": "git", - "url": "https://github.com/backstage/backstage", - "directory": "plugins/linguist-backend" - }, - "license": "Apache-2.0", - "main": "src/index.ts", - "types": "src/index.ts", - "files": [ - "dist", - "config.d.ts", - "migrations/**/*.{js,d.ts}" - ], - "scripts": { - "build": "backstage-cli package build", - "clean": "backstage-cli package clean", - "lint": "backstage-cli package lint", - "prepack": "backstage-cli package prepack", - "postpack": "backstage-cli package postpack", - "start": "backstage-cli package start", - "test": "backstage-cli package test" - }, - "dependencies": { - "@backstage/backend-common": "workspace:^", - "@backstage/backend-plugin-api": "workspace:^", - "@backstage/backend-tasks": "workspace:^", - "@backstage/catalog-client": "workspace:^", - "@backstage/catalog-model": "workspace:^", - "@backstage/config": "workspace:^", - "@backstage/errors": "workspace:^", - "@backstage/plugin-catalog-node": "workspace:^", - "@backstage/plugin-linguist-common": "workspace:^", - "@backstage/types": "workspace:^", - "@types/express": "*", - "express": "^4.18.1", - "express-promise-router": "^4.1.0", - "fs-extra": "^11.0.0", - "knex": "^3.0.0", - "linguist-js": "^2.5.3", - "luxon": "^3.0.0", - "node-fetch": "^2.6.7", - "uuid": "^9.0.0", - "yn": "^4.0.0" - }, - "devDependencies": { - "@backstage/backend-test-utils": "workspace:^", - "@backstage/cli": "workspace:^", - "@types/supertest": "^2.0.8", - "js-yaml": "^4.1.0", - "supertest": "^6.2.4" - }, - "configSchema": "config.d.ts", - "deprecated": "This package has been moved to the backstage/community-plugins repository. You should migrate to using @backstage-community/plugin-linguist-backend instead." -} diff --git a/plugins/linguist-backend/src/api/LinguistBackendClient.test.ts b/plugins/linguist-backend/src/api/LinguistBackendClient.test.ts deleted file mode 100644 index be25fa9821..0000000000 --- a/plugins/linguist-backend/src/api/LinguistBackendClient.test.ts +++ /dev/null @@ -1,417 +0,0 @@ -/* - * 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 { - getVoidLogger, - ReadTreeResponse, - UrlReader, -} from '@backstage/backend-common'; -import { CatalogApi, GetEntitiesResponse } from '@backstage/catalog-client'; -import { Results } from 'linguist-js/dist/types'; -import { DateTime } from 'luxon'; -import { LinguistBackendStore } from '../db'; -import { kindOrDefault, LinguistBackendClient } from './LinguistBackendClient'; -import fs from 'fs-extra'; -import { LINGUIST_ANNOTATION } from '@backstage/plugin-linguist-common'; -import { mockServices } from '@backstage/backend-test-utils'; - -const linguistResultMock = Promise.resolve({ - files: { - count: 4, - bytes: 6010, - results: { - '/src/index.ts': 'TypeScript', - '/src/cli.js': 'JavaScript', - '/readme.md': 'Markdown', - '/no-lang': null, - }, - alternatives: { - '~/alternatives.asc': ['AsciiDoc', 'Public Key'], - }, - }, - languages: { - count: 3, - bytes: 6000, - results: { - JavaScript: { type: 'programming', bytes: 1000, color: '#f1e05a' }, - TypeScript: { type: 'programming', bytes: 2000, color: '#2b7489' }, - Markdown: { type: 'prose', bytes: 3000, color: '#083fa1' }, - }, - }, - unknown: { - count: 1, - bytes: 10, - filenames: { - 'no-lang': 10, - }, - extensions: {}, - }, -} as Results); - -describe('kindOrDefault', () => { - it('should return default kind when undefined', () => { - expect(kindOrDefault()).toEqual(['API', 'Component', 'Template']); - }); - it('should return the default kind when empty', () => { - expect(kindOrDefault([])).toEqual(['API', 'Component', 'Template']); - }); - it('should return provided kind when not empty', () => { - expect(kindOrDefault(['API'])).toEqual(['API']); - }); -}); - -describe('Linguist backend API', () => { - const logger = getVoidLogger(); - - const store: jest.Mocked = { - insertEntityResults: jest.fn(), - insertNewEntity: jest.fn(), - getEntityResults: jest.fn(), - getProcessedEntities: jest.fn(), - getUnprocessedEntities: jest.fn(), - getAllEntities: jest.fn(), - deleteEntity: jest.fn(), - }; - - const urlReader: jest.Mocked = { - readTree: jest.fn(), - search: jest.fn(), - readUrl: jest.fn(), - }; - - const catalogApi: jest.Mocked = { - getEntities: jest.fn(), - getEntityByRef: jest.fn(), - } as any; - - const api = new LinguistBackendClient( - logger, - store, - urlReader, - mockServices.auth(), - catalogApi, - ); - - beforeEach(() => { - jest.resetAllMocks(); - }); - - it('should get languages for an entity', async () => { - store.getEntityResults.mockResolvedValue({ - languageCount: 1, - totalBytes: 2205, - processedDate: '2023-02-15T20:10:21.378Z', - breakdown: [ - { - name: 'YAML', - percentage: 100, - bytes: 2205, - type: 'data', - color: '#cb171e', - }, - ], - }); - - const entityRef = 'template:default/create-react-app-template'; - const languages = await api.getEntityLanguages(entityRef); - expect(languages).toEqual({ - languageCount: 1, - totalBytes: 2205, - processedDate: '2023-02-15T20:10:21.378Z', - breakdown: [ - { - name: 'YAML', - percentage: 100, - bytes: 2205, - type: 'data', - color: '#cb171e', - }, - ], - }); - }); - - it('should insert new entities', async () => { - const testEntityListResponse: GetEntitiesResponse = { - items: [ - { - apiVersion: 'backstage.io/v1beta1', - metadata: { - name: 'service-one', - }, - kind: 'Component', - }, - { - apiVersion: 'backstage.io/v1beta1', - metadata: { - name: 'service-two', - }, - kind: 'Component', - }, - { - apiVersion: 'backstage.io/v1beta1', - metadata: { - name: 'service-three', - }, - kind: 'Component', - }, - ], - }; - catalogApi.getEntities.mockResolvedValue(testEntityListResponse); - - await api.addNewEntities(); - expect(store.insertNewEntity).toHaveBeenCalledTimes(3); - }); - - it('should delete entities not in Catalog', async () => { - store.getAllEntities.mockResolvedValue([ - 'component:default/service-one', - 'component:default/stale-service-two', - ]); - - catalogApi.getEntityByRef.mockResolvedValueOnce({ - apiVersion: 'backstage.io/v1beta1', - metadata: { - name: 'service-one', - }, - kind: 'Component', - }); - - await api.cleanEntities(); - expect(store.deleteEntity).toHaveBeenCalledTimes(1); - }); - - it('should get default entity overview', async () => { - store.getProcessedEntities.mockResolvedValue([ - { - entityRef: 'component:default/service-one', - processedDate: DateTime.now().toJSDate(), - }, - { - entityRef: 'component:default/stale-service-two', - processedDate: DateTime.now().minus({ days: 45 }).toJSDate(), - }, - ]); - - store.getUnprocessedEntities.mockResolvedValue([ - 'component:default/service-three', - 'component:default/service-four', - 'component:default/service-five', - ]); - - const overview = await api.getEntitiesOverview(); - expect(overview.entityCount).toEqual(5); - expect(overview.processedCount).toEqual(2); - expect(overview.staleCount).toEqual(0); - expect(overview.pendingCount).toEqual(3); - expect(overview.filteredEntities).toEqual([ - 'component:default/service-three', - 'component:default/service-four', - 'component:default/service-five', - ]); - }); - - it('should get entity overview with stale items', async () => { - const apiWithAge = new LinguistBackendClient( - logger, - store, - urlReader, - mockServices.auth(), - catalogApi, - { days: 5 }, - ); - store.getProcessedEntities.mockResolvedValue([ - { - entityRef: 'component:default/service-one', - processedDate: DateTime.now().toJSDate(), - }, - { - entityRef: 'component:default/stale-service-two', - processedDate: DateTime.now().minus({ days: 45 }).toJSDate(), - }, - ]); - - store.getUnprocessedEntities.mockResolvedValue([ - 'component:default/service-three', - 'component:default/service-four', - 'component:default/service-five', - ]); - - const overview = await apiWithAge.getEntitiesOverview(); - expect(overview.entityCount).toEqual(5); - expect(overview.processedCount).toEqual(2); - expect(overview.staleCount).toEqual(1); - expect(overview.pendingCount).toEqual(4); - expect(overview.filteredEntities).toEqual([ - 'component:default/service-three', - 'component:default/service-four', - 'component:default/service-five', - 'component:default/stale-service-two', - ]); - }); - - it('should generate and save languages for an entity', async () => { - const spy = jest - .spyOn(api, 'getLinguistResults') - .mockImplementation(() => linguistResultMock); - - urlReader.readTree.mockResolvedValueOnce({ - files: async () => [ - { - content: async () => Buffer.from('-- XXX: code-data', 'utf8'), - path: 'my-file.js', - }, - ], - dir: async () => '/temp/my-code', - } as ReadTreeResponse); - - const fsSpy = jest.spyOn(fs, 'remove'); - - await api.generateEntityLanguages( - 'component:default/fake-service', - 'https://some.fake/service/', - ); - expect(api.getLinguistResults).toHaveBeenCalled(); - expect(store.insertEntityResults).toHaveBeenCalled(); - expect(fs.remove).toHaveBeenCalled(); - spy.mockClear(); - fsSpy.mockClear(); - }); - - it('should generate languages for entities using default', async () => { - store.getProcessedEntities.mockResolvedValue([ - { - entityRef: 'component:default/service-one', - processedDate: DateTime.now().toJSDate(), - }, - { - entityRef: 'component:default/stale-service-two', - processedDate: DateTime.now().minus({ days: 45 }).toJSDate(), - }, - ]); - - store.getUnprocessedEntities.mockResolvedValue([ - 'component:default/service-three', - 'component:default/service-four', - 'component:default/service-five', - ]); - - const entity = { - apiVersion: 'backstage.io/v1beta1', - metadata: { - name: 'service-one', - annotations: { - [LINGUIST_ANNOTATION]: 'https://some.fake/service/', - }, - }, - kind: 'Component', - }; - - catalogApi.getEntityByRef.mockResolvedValue(entity); - - const resultsSpy = jest - .spyOn(api, 'getLinguistResults') - .mockImplementation(() => linguistResultMock); - - urlReader.readTree.mockResolvedValue({ - files: async () => [ - { - content: async () => Buffer.from('-- XXX: code-data', 'utf8'), - path: 'my-file.js', - }, - ], - dir: async () => '/temp/my-code', - } as ReadTreeResponse); - - const fsSpy = jest.spyOn(fs, 'remove'); - - const generateEntityLanguages = jest.spyOn(api, 'generateEntityLanguages'); - await api.generateEntitiesLanguages(); - expect(generateEntityLanguages).toHaveBeenCalledTimes(3); - - generateEntityLanguages.mockClear(); - resultsSpy.mockClear(); - fsSpy.mockClear(); - }); - - it('should generate languages for entities using defined batch size', async () => { - const apiWithBatchSize = new LinguistBackendClient( - logger, - store, - urlReader, - mockServices.auth(), - catalogApi, - undefined, - 2, - ); - - store.getProcessedEntities.mockResolvedValue([ - { - entityRef: 'component:default/service-one', - processedDate: DateTime.now().toJSDate(), - }, - { - entityRef: 'component:default/stale-service-two', - processedDate: DateTime.now().minus({ days: 45 }).toJSDate(), - }, - ]); - - store.getUnprocessedEntities.mockResolvedValue([ - 'component:default/service-three', - 'component:default/service-four', - 'component:default/service-five', - ]); - - const entity = { - apiVersion: 'backstage.io/v1beta1', - metadata: { - name: 'service-one', - annotations: { - [LINGUIST_ANNOTATION]: 'https://some.fake/service/', - }, - }, - kind: 'Component', - }; - - catalogApi.getEntityByRef.mockResolvedValue(entity); - - const resultsSpy = jest - .spyOn(apiWithBatchSize, 'getLinguistResults') - .mockImplementation(() => linguistResultMock); - - urlReader.readTree.mockResolvedValue({ - files: async () => [ - { - content: async () => Buffer.from('-- XXX: code-data', 'utf8'), - path: 'my-file.js', - }, - ], - dir: async () => '/temp/my-code', - } as ReadTreeResponse); - - const fsSpy = jest.spyOn(fs, 'remove'); - - const generateEntityLanguages = jest.spyOn( - apiWithBatchSize, - 'generateEntityLanguages', - ); - await apiWithBatchSize.generateEntitiesLanguages(); - expect(generateEntityLanguages).toHaveBeenCalledTimes(2); - - generateEntityLanguages.mockClear(); - resultsSpy.mockClear(); - fsSpy.mockClear(); - }); -}); diff --git a/plugins/linguist-backend/src/api/LinguistBackendClient.ts b/plugins/linguist-backend/src/api/LinguistBackendClient.ts deleted file mode 100644 index 23236f5f85..0000000000 --- a/plugins/linguist-backend/src/api/LinguistBackendClient.ts +++ /dev/null @@ -1,283 +0,0 @@ -/* - * 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 { - EntitiesOverview, - EntityResults, - Language, - Languages, - LINGUIST_ANNOTATION, -} from '@backstage/plugin-linguist-common'; -import { - CATALOG_FILTER_EXISTS, - CatalogApi, - GetEntitiesRequest, -} from '@backstage/catalog-client'; -import { UrlReader } from '@backstage/backend-common'; - -import { DateTime } from 'luxon'; -import { LinguistBackendStore } from '../db'; -import fs from 'fs-extra'; -import linguist from 'linguist-js'; -import { - ANNOTATION_SOURCE_LOCATION, - stringifyEntityRef, -} from '@backstage/catalog-model'; -import { assertError } from '@backstage/errors'; -import { HumanDuration } from '@backstage/types'; -import { Results } from 'linguist-js/dist/types'; -import { type AuthService, LoggerService } from '@backstage/backend-plugin-api'; - -/** @public */ -export interface LinguistBackendApi { - getEntityLanguages(entityRef: string): Promise; - processEntities(): Promise; -} - -/** @public */ -export class LinguistBackendClient implements LinguistBackendApi { - private readonly logger: LoggerService; - private readonly store: LinguistBackendStore; - private readonly urlReader: UrlReader; - private readonly auth: AuthService; - - private readonly catalogApi: CatalogApi; - private readonly age?: HumanDuration; - private readonly batchSize?: number; - private readonly useSourceLocation?: boolean; - private readonly kind: string[]; - private readonly linguistJsOptions?: Record; - public constructor( - logger: LoggerService, - store: LinguistBackendStore, - urlReader: UrlReader, - auth: AuthService, - catalogApi: CatalogApi, - age?: HumanDuration, - batchSize?: number, - useSourceLocation?: boolean, - kind?: string[], - linguistJsOptions?: Record, - ) { - this.logger = logger; - this.store = store; - this.urlReader = urlReader; - this.auth = auth; - this.catalogApi = catalogApi; - this.batchSize = batchSize; - this.age = age; - this.useSourceLocation = useSourceLocation; - this.kind = kindOrDefault(kind); - this.linguistJsOptions = linguistJsOptions; - } - - async getEntityLanguages(entityRef: string): Promise { - this.logger?.debug(`Getting languages for entity "${entityRef}"`); - - return this.store.getEntityResults(entityRef); - } - - async processEntities(): Promise { - this.logger?.info('Updating list of entities'); - await this.addNewEntities(); - - this.logger?.info('Cleaning list of entities'); - await this.cleanEntities(); - - this.logger?.info('Processing applicable entities through Linguist'); - await this.generateEntitiesLanguages(); - } - - /** @internal */ - async addNewEntities(): Promise { - const annotationKey = this.useSourceLocation - ? ANNOTATION_SOURCE_LOCATION - : LINGUIST_ANNOTATION; - const request: GetEntitiesRequest = { - filter: { - kind: this.kind, - [`metadata.annotations.${annotationKey}`]: CATALOG_FILTER_EXISTS, - }, - fields: ['kind', 'metadata'], - }; - - const { token } = await this.auth.getPluginRequestToken({ - onBehalfOf: await this.auth.getOwnServiceCredentials(), - targetPluginId: 'catalog', - }); - const response = await this.catalogApi.getEntities(request, { token }); - const entities = response.items; - - entities.forEach(entity => { - const entityRef = stringifyEntityRef(entity); - this.store.insertNewEntity(entityRef); - }); - } - - /** @internal */ - async cleanEntities(): Promise { - this.logger?.info('Cleaning entities in Linguist queue'); - const allEntities = await this.store.getAllEntities(); - - for (const entityRef of allEntities) { - const { token } = await this.auth.getPluginRequestToken({ - onBehalfOf: await this.auth.getOwnServiceCredentials(), - targetPluginId: 'catalog', - }); - const result = await this.catalogApi.getEntityByRef(entityRef, { token }); - - if (!result) { - this.logger?.info( - `Entity ${entityRef} was not found in the Catalog, it will be deleted`, - ); - await this.store.deleteEntity(entityRef); - } - } - } - - /** @internal */ - async generateEntitiesLanguages(): Promise { - const entitiesOverview = await this.getEntitiesOverview(); - this.logger?.info( - `Entities overview: Entity: ${entitiesOverview.entityCount}, Processed: ${entitiesOverview.processedCount}, Pending: ${entitiesOverview.pendingCount}, Stale ${entitiesOverview.staleCount}`, - ); - - const entities = entitiesOverview.filteredEntities.slice( - 0, - this.batchSize ?? 20, - ); - - for (const entityRef of entities) { - const { token } = await this.auth.getPluginRequestToken({ - onBehalfOf: await this.auth.getOwnServiceCredentials(), - targetPluginId: 'catalog', - }); - const entity = await this.catalogApi.getEntityByRef(entityRef, { - token, - }); - const annotationKey = this.useSourceLocation - ? ANNOTATION_SOURCE_LOCATION - : LINGUIST_ANNOTATION; - - let url = entity?.metadata.annotations?.[annotationKey] ?? ''; - if (url.startsWith('url:')) { - url = url.slice(4); - } - - try { - await this.generateEntityLanguages(entityRef, url); - } catch (error) { - assertError(error); - this.logger.error( - `Unable to process "${entityRef}" using "${url}", message: ${error.message}, stack: ${error.stack}`, - ); - } - } - } - - /** @internal */ - async getEntitiesOverview(): Promise { - this.logger?.debug('Getting pending entities'); - - const processedEntities = await this.store.getProcessedEntities(); - const staleEntities = processedEntities - .filter(pe => { - if (this.age === undefined) return false; - const staleDate = DateTime.now().minus(this.age as HumanDuration); - return DateTime.fromJSDate(pe.processedDate) <= staleDate; - }) - .map(pe => pe.entityRef); - - const unprocessedEntities = await this.store.getUnprocessedEntities(); - const filteredEntities = unprocessedEntities.concat(staleEntities); - - const entitiesOverview: EntitiesOverview = { - entityCount: unprocessedEntities.length + processedEntities.length, - processedCount: processedEntities.length, - staleCount: staleEntities.length, - pendingCount: filteredEntities.length, - filteredEntities: filteredEntities, - }; - - return entitiesOverview; - } - - /** @internal */ - async generateEntityLanguages( - entityRef: string, - url: string, - ): Promise { - this.logger?.info( - `Processing languages for entity ${entityRef} from ${url}`, - ); - - const readTreeResponse = await this.urlReader.readTree(url); - const dir = await readTreeResponse.dir(); - - const results = await this.getLinguistResults(dir); - - try { - const totalBytes = results.languages.bytes; - const langResults = results.languages.results; - - const breakdown: Language[] = []; - for (const key in langResults) { - if (Object.prototype.hasOwnProperty.call(langResults, key)) { - const lang: Language = { - name: key, - percentage: +((langResults[key].bytes / totalBytes) * 100).toFixed( - 2, - ), - bytes: langResults[key].bytes, - type: langResults[key].type, - color: langResults[key].color, - }; - breakdown.push(lang); - } - } - - const languages: Languages = { - languageCount: results.languages.count, - totalBytes: totalBytes, - processedDate: new Date().toISOString(), - breakdown: breakdown, - }; - - const entityResults: EntityResults = { - entityRef: entityRef, - results: languages, - }; - - return await this.store.insertEntityResults(entityResults); - } finally { - this.logger?.info(`Cleaning up files from ${dir}`); - await fs.remove(dir); - } - } - - /** @internal */ - async getLinguistResults(dir: string): Promise { - const results = await linguist(dir, { ...this.linguistJsOptions }); - return results; - } -} - -export function kindOrDefault(kind?: string[]): string[] { - if (!kind || kind.length === 0) { - return ['API', 'Component', 'Template']; - } - return kind; -} diff --git a/plugins/linguist-backend/src/api/index.ts b/plugins/linguist-backend/src/api/index.ts deleted file mode 100644 index b3f73587e7..0000000000 --- a/plugins/linguist-backend/src/api/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * 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. - */ - -export type { LinguistBackendApi } from './LinguistBackendClient'; diff --git a/plugins/linguist-backend/src/db/LinguistBackendDatabase.test.ts b/plugins/linguist-backend/src/db/LinguistBackendDatabase.test.ts deleted file mode 100644 index 5998ddfc1e..0000000000 --- a/plugins/linguist-backend/src/db/LinguistBackendDatabase.test.ts +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Knex as KnexType, Knex } from 'knex'; -import { TestDatabases } from '@backstage/backend-test-utils'; -import { - LinguistBackendDatabase, - LinguistBackendStore, -} from './LinguistBackendDatabase'; -import { Languages, ProcessedEntity } from '@backstage/plugin-linguist-common'; - -function createDatabaseManager( - client: KnexType, - skipMigrations: boolean = false, -) { - return { - getClient: async () => client, - migrations: { - skip: skipMigrations, - }, - }; -} - -const rawDbEntityResultRows = [ - { - id: '14b32439-848a-49b2-92a4-98753f932606', - entity_ref: 'template:default/create-react-app-template', - languages: undefined, - processed_date: undefined, - }, - { - id: '8c85d3ec-ccea-4b29-9de9-ccdd7e5ba452', - entity_ref: 'template:default/docs-template', - languages: undefined, - processed_date: undefined, - }, - { - id: 'b922c87b-37bc-4505-b4af-70a1438decda', - entity_ref: 'template:default/pull-request', - languages: - '{"languageCount":1,"totalBytes":2205,"processedDate":"2023-02-15T20:10:21.378Z","breakdown":[{"name":"YAML","percentage":100,"bytes":2205,"type":"data","color":"#cb171e"}]}', - processed_date: new Date('2023-02-15 20:10:21.378Z'), - }, - { - id: 'bd555e6d-a3d0-4b48-a930-194db8f80db7', - entity_ref: 'template:default/react-ssr-template', - languages: - '{"languageCount":8,"totalBytes":8988,"processedDate":"2023-02-15T20:10:21.388Z","breakdown":[{"name":"INI","percentage":2.26,"bytes":203,"type":"data","color":"#d1dbe0"},{"name":"JavaScript","percentage":5.94,"bytes":534,"type":"programming","color":"#f1e05a"},{"name":"YAML","percentage":31.09,"bytes":2794,"type":"data","color":"#cb171e"},{"name":"Markdown","percentage":11.79,"bytes":1060,"type":"prose","color":"#083fa1"},{"name":"JSON","percentage":21.09,"bytes":1896,"type":"data","color":"#292929"},{"name":"CSS","percentage":0,"bytes":0,"type":"markup","color":"#563d7c"},{"name":"TSX","percentage":26.01,"bytes":2338,"type":"programming","color":"#3178c6"},{"name":"TypeScript","percentage":1.81,"bytes":163,"type":"programming","color":"#3178c6"}]}', - processed_date: new Date('2023-02-15 20:10:21.388Z'), - }, - { - id: '4145c0cf-44e9-4e95-9d57-781af4685b28', - entity_ref: 'template:default/springboot-template', - languages: - '{"languageCount":9,"totalBytes":80986,"processedDate":"2023-02-15T20:10:21.419Z","breakdown":[{"name":"Shell","percentage":0.16,"bytes":130,"type":"programming","color":"#89e051"},{"name":"INI","percentage":0.35,"bytes":286,"type":"data","color":"#d1dbe0"},{"name":"Dockerfile","percentage":0.3,"bytes":246,"type":"programming","color":"#384d54"},{"name":"YAML","percentage":3.92,"bytes":3171,"type":"data","color":"#cb171e"},{"name":"Markdown","percentage":1.31,"bytes":1059,"type":"prose","color":"#083fa1"},{"name":"XML","percentage":10.48,"bytes":8491,"type":"data","color":"#0060ac"},{"name":"Java","percentage":1.8,"bytes":1455,"type":"programming","color":"#b07219"},{"name":"Text","percentage":81.22,"bytes":65780,"type":"prose"},{"name":"Protocol Buffer","percentage":0.45,"bytes":368,"type":"data"}]}', - processed_date: new Date('2023-02-15 20:10:21.419Z'), - }, -]; - -describe('Linguist database', () => { - const databases = TestDatabases.create(); - let store: LinguistBackendStore; - let testDbClient: Knex; - beforeAll(async () => { - testDbClient = await databases.init('SQLITE_3'); - const database = createDatabaseManager(testDbClient); - - store = await LinguistBackendDatabase.create(await database.getClient()); - }); - beforeEach(async () => { - await testDbClient.batchInsert('entity_result', rawDbEntityResultRows); - }); - afterEach(async () => { - await testDbClient('entity_result').delete(); - }); - - it('should be able to return entity results', async () => { - const validLanguagesResult: Languages = { - languageCount: 1, - totalBytes: 2205, - processedDate: '2023-02-15T20:10:21.378Z', - breakdown: [ - { - name: 'YAML', - percentage: 100, - bytes: 2205, - type: 'data', - color: '#cb171e', - }, - ], - }; - - const entityResult = await store.getEntityResults( - 'template:default/pull-request', - ); - expect(entityResult).toMatchObject(validLanguagesResult); - }); - - it('should return empty entity results when not found', async () => { - const validEmptyLanguagesResult: Languages = { - languageCount: 0, - totalBytes: 0, - processedDate: 'undefined', - breakdown: [], - }; - - const entityResult = await store.getEntityResults( - 'template:default/create-react-app-template', - ); - expect(entityResult).toMatchObject(validEmptyLanguagesResult); - }); - - it('should be able to return unprocessed entities', async () => { - const validUnprocessedEntities: string[] = [ - 'template:default/create-react-app-template', - 'template:default/docs-template', - ]; - - const unprocessedEntities = await store.getUnprocessedEntities(); - - expect(unprocessedEntities).toMatchObject(validUnprocessedEntities); - }); - - it('should return string[] when there is no unprocessed entities', async () => { - await testDbClient('entity_result').delete(); - const unprocessedEntities = await store.getUnprocessedEntities(); - - expect(unprocessedEntities).toMatchObject([]); - }); - - it('should be able to return processed entities', async () => { - const validProcessedEntities: ProcessedEntity[] = [ - { - entityRef: 'template:default/pull-request', - processedDate: new Date('2023-02-15 20:10:21.378Z'), - }, - { - entityRef: 'template:default/react-ssr-template', - processedDate: new Date('2023-02-15 20:10:21.388Z'), - }, - { - entityRef: 'template:default/springboot-template', - processedDate: new Date('2023-02-15 20:10:21.419Z'), - }, - ]; - - const processedEntities = await store.getProcessedEntities(); - - expect(processedEntities).toMatchObject(validProcessedEntities); - }); - - it('should return string[] when there is no processed entities', async () => { - await testDbClient('entity_result').delete(); - const unprocessedEntities = await store.getProcessedEntities(); - - expect(unprocessedEntities).toMatchObject([]); - }); - - it('should insert new entities and ignore duplicates', async () => { - const before = testDbClient.from('entity_result').count(); - - await store.insertNewEntity('component:/default/new-entity-one'); - await store.insertNewEntity('component:/default/new-entity-two'); - await store.insertNewEntity('template:default/pull-request'); - - const after = testDbClient.from('entity_result').count(); - - expect(before).toEqual(after); - }); - - it('should get all entities', async () => { - const allEntities = await store.getAllEntities(); - - expect(allEntities.length).toEqual(5); - }); - - it('should delete entity by its entityRef', async () => { - const before = await testDbClient.from('entity_result').count(); - - await store.deleteEntity('template:default/create-react-app-template'); - - const after = await testDbClient.from('entity_result').count(); - - expect(before).toEqual([{ 'count(*)': 5 }]); - expect(after).toEqual([{ 'count(*)': 4 }]); - }); -}); diff --git a/plugins/linguist-backend/src/db/LinguistBackendDatabase.ts b/plugins/linguist-backend/src/db/LinguistBackendDatabase.ts deleted file mode 100644 index 5a59d18e90..0000000000 --- a/plugins/linguist-backend/src/db/LinguistBackendDatabase.ts +++ /dev/null @@ -1,183 +0,0 @@ -/* - * 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 { resolvePackagePath } from '@backstage/backend-common'; -import { Knex } from 'knex'; -import { v4 as uuid } from 'uuid'; -import { - EntityResults, - Languages, - ProcessedEntity, -} from '@backstage/plugin-linguist-common'; - -export type RawDbEntityResultRow = { - id: string; - entity_ref: string; - languages?: string; - processed_date?: Date; -}; - -/** @public */ -export interface LinguistBackendStore { - insertEntityResults(entityLanguages: EntityResults): Promise; - insertNewEntity(entityRef: string): Promise; - getEntityResults(entityRef: string): Promise; - getProcessedEntities(): Promise; - getUnprocessedEntities(): Promise; - getAllEntities(): Promise; - deleteEntity(entityRef: string): Promise; -} - -const migrationsDir = resolvePackagePath( - '@backstage/plugin-linguist-backend', - 'migrations', -); - -/** @public */ -export class LinguistBackendDatabase implements LinguistBackendStore { - static async create(knex: Knex): Promise { - await knex.migrate.latest({ - directory: migrationsDir, - }); - return new LinguistBackendDatabase(knex); - } - - constructor(private readonly db: Knex) {} - - async insertEntityResults(entityLanguages: EntityResults): Promise { - const entityLanguageId = uuid(); - const entityRef = entityLanguages.entityRef; - - const [result] = await this.db('entity_result') - .insert({ - id: entityLanguageId, - entity_ref: entityRef, - languages: JSON.stringify(entityLanguages.results), - processed_date: new Date(entityLanguages.results.processedDate), - }) - .onConflict('entity_ref') - .merge(['languages', 'processed_date']) - .returning('id'); - - return result.id; - } - - async insertNewEntity(entityRef: string): Promise { - const entityLanguageId = uuid(); - - await this.db('entity_result') - .insert({ - id: entityLanguageId, - entity_ref: entityRef, - }) - .onConflict('entity_ref') - .ignore(); // If the entity_ref is in the table already then we don't want to add it again - } - - async getEntityResults(entityRef: string): Promise { - const entityResults = await this.db('entity_result') - .whereNotNull('languages') - .where({ entity_ref: entityRef }) - .first(); - - if (!entityResults || !entityResults.languages) { - const emptyResults: Languages = { - languageCount: 0, - totalBytes: 0, - processedDate: 'undefined', - breakdown: [], - }; - return emptyResults; - } - - try { - return JSON.parse(entityResults.languages); - } catch (error) { - throw new Error(`Failed to parse languages for '${entityRef}', ${error}`); - } - } - - async getProcessedEntities(): Promise { - const rawEntities = await this.db('entity_result') - .whereNotNull('processed_date') - .whereNotNull('languages'); - - if (!rawEntities) { - return []; - } - - const processedEntities = rawEntities.map(rawEntity => { - // Note: processed_date should never be null, this is handled by the DB query above - let processedDate = new Date(); - if (rawEntity.processed_date) { - // SQLite will return a Timestamp whereas Postgres will return a proper Date - // This tests to see if we are getting a timestamp and convert if needed - processedDate = new Date(+rawEntity.processed_date.toString()); - if (isNaN(+rawEntity.processed_date.toString())) { - processedDate = rawEntity.processed_date; - } - } - - const processEntity = { - entityRef: rawEntity.entity_ref, - processedDate, - }; - - return processEntity; - }); - - return processedEntities; - } - - async getUnprocessedEntities(): Promise { - const rawEntities = await this.db('entity_result') - // TODO(ahhhndre) processed_date should always be null as well but it had a default to the current date - // once the default has been removed and released, we can then come back an enable this check - // .whereNull('processed_date') - .whereNull('languages') - .orderBy('created_at', 'asc'); - - if (!rawEntities) { - return []; - } - - const unprocessedEntities = rawEntities.map(rawEntity => { - return rawEntity.entity_ref; - }); - - return unprocessedEntities; - } - - async getAllEntities(): Promise { - const rawEntities = await this.db('entity_result'); - - if (!rawEntities) { - return []; - } - - const allEntities = rawEntities.map(rawEntity => { - return rawEntity.entity_ref; - }); - - return allEntities; - } - - async deleteEntity(entityRef: string): Promise { - await this.db('entity_result') - .where('entity_ref', entityRef) - .delete(); - } -} diff --git a/plugins/linguist-backend/src/db/index.ts b/plugins/linguist-backend/src/db/index.ts deleted file mode 100644 index c8ec15da68..0000000000 --- a/plugins/linguist-backend/src/db/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -/* - * 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. - */ - -export { LinguistBackendDatabase } from './LinguistBackendDatabase'; -export type { LinguistBackendStore } from './LinguistBackendDatabase'; diff --git a/plugins/linguist-backend/src/index.ts b/plugins/linguist-backend/src/index.ts deleted file mode 100644 index df4703bed3..0000000000 --- a/plugins/linguist-backend/src/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * 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. - */ - -/** - * Linguist backend plugin that contains the API for generating and retrieving language breakdown which is used by the Linguist frontend plugin. - * - * @packageDocumentation - */ - -export * from './processor'; -export * from './service/router'; -export type { LinguistBackendApi } from './api'; -export { linguistPlugin as default } from './plugin'; diff --git a/plugins/linguist-backend/src/plugin.ts b/plugins/linguist-backend/src/plugin.ts deleted file mode 100644 index 1a64a10773..0000000000 --- a/plugins/linguist-backend/src/plugin.ts +++ /dev/null @@ -1,77 +0,0 @@ -/* - * 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 { createRouterFromConfig } from './service/router'; - -/** - * Linguist backend plugin - * - * @public - */ -export const linguistPlugin = createBackendPlugin({ - pluginId: 'linguist', - register(env) { - env.registerInit({ - deps: { - auth: coreServices.auth, - httpAuth: coreServices.httpAuth, - logger: coreServices.logger, - config: coreServices.rootConfig, - reader: coreServices.urlReader, - database: coreServices.database, - discovery: coreServices.discovery, - scheduler: coreServices.scheduler, - tokenManager: coreServices.tokenManager, - httpRouter: coreServices.httpRouter, - }, - async init({ - auth, - httpAuth, - logger, - config, - reader, - database, - discovery, - scheduler, - tokenManager, - httpRouter, - }) { - httpRouter.use( - await createRouterFromConfig({ - auth, - httpAuth, - logger, - config, - reader, - database, - discovery, - scheduler, - tokenManager, - }), - ); - httpRouter.addAuthPolicy({ - path: '/health', - allow: 'unauthenticated', - }); - }, - }); - }, -}); diff --git a/plugins/linguist-backend/src/processor/LinguistTagsProcessor.test.ts b/plugins/linguist-backend/src/processor/LinguistTagsProcessor.test.ts deleted file mode 100644 index 4954820792..0000000000 --- a/plugins/linguist-backend/src/processor/LinguistTagsProcessor.test.ts +++ /dev/null @@ -1,343 +0,0 @@ -/* - * 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 { - LinguistTagsProcessor, - LinguistTagsProcessorOptions, - sanitizeTag, -} from './LinguistTagsProcessor'; -import { ConfigReader } from '@backstage/config'; -import { getVoidLogger } from '@backstage/backend-common'; -import { CatalogProcessorCache } from '@backstage/plugin-catalog-node'; -import { Entity, makeValidator } from '@backstage/catalog-model'; -import { DiscoveryService } from '@backstage/backend-plugin-api'; -import fetch, { Response } from 'node-fetch'; -import * as path from 'path'; -import yaml from 'js-yaml'; -import * as fs from 'fs'; - -const { isValidTag } = makeValidator(); - -jest.mock('node-fetch', () => jest.fn()); -const mockedFetch: jest.MockedFunction = - fetch as jest.MockedFunction; - -const discovery: DiscoveryService = { - getBaseUrl: jest.fn().mockResolvedValue('http://example.com/api/linguist'), - getExternalBaseUrl: jest.fn(), -}; - -let state: Record = {}; -const mockCacheGet = jest - .fn() - .mockImplementation(async (key: string) => state[key]); -const mockCacheSet = jest.fn().mockImplementation((key: string, value: any) => { - state[key] = value; -}); -const cache: CatalogProcessorCache = { - get: mockCacheGet, - set: mockCacheSet, -}; - -describe('sanitizeTag', () => { - const linguistDataSet = yaml.load( - fs.readFileSync( - path.resolve(require.resolve('linguist-js'), '../../ext/languages.yml'), - 'utf-8', - ), - ) as Object; - const languages = Object.keys(linguistDataSet); - test('Should clean up all linguist languages', () => { - const invalid = languages - .map(sanitizeTag) - .filter(lang => !isValidTag(lang)); - expect(invalid).toStrictEqual([]); - // Keep a snapshot here so that as new languages are added to linguist, - // we can spot check them to make sure the transformer for them makes sense. - expect(languages.map(sanitizeTag)).toMatchSnapshot(); - }); -}); - -describe('LinguistTagsProcessor', () => { - afterEach(() => { - mockedFetch.mockReset(); - mockCacheGet.mockClear(); - mockCacheSet.mockClear(); - state = {}; - }); - - test('Should construct fromConfig', () => { - const config = new ConfigReader({ - linguist: {}, - }); - expect(() => { - return LinguistTagsProcessor.fromConfig(config, { - logger: getVoidLogger(), - discovery, - }); - }).not.toThrow(); - }); - - test('Should assign valid language tags', async () => { - const processor = buildProcessor({}); - - mockFetchImplementation(); - const entity = baseEntity(); - await processor.preProcessEntity(entity, null, null, null, cache); - expect(mockedFetch).toHaveBeenCalledTimes(1); - expect(entity.metadata.tags).toStrictEqual([ - 'c++', - 'asp-dot-net', - 'java', - 'common-lisp', - ]); - - entity.metadata.tags?.forEach(tag => { - expect(isValidTag(tag)).toBeTruthy(); - }); - }); - - test('Should not duplicate existing tags', async () => { - const processor = buildProcessor({}); - - mockFetchImplementation(); - const entity = baseEntity(); - entity.metadata.tags = ['existing', 'tags', 'java']; - - await processor.preProcessEntity(entity, null, null, null, cache); - expect(mockedFetch).toHaveBeenCalledTimes(1); - expect(entity.metadata.tags).toStrictEqual([ - 'existing', - 'tags', - 'java', - 'c++', - 'asp-dot-net', - 'common-lisp', - ]); - }); - - test('Should not process Resource entities by default', async () => { - const processor = buildProcessor({}); - - mockFetchImplementation(); - const entity = baseEntity(); - entity.kind = 'Resource'; - - await processor.preProcessEntity(entity, null, null, null, cache); - expect(mockedFetch).toHaveBeenCalledTimes(0); - expect(entity.metadata.tags).toStrictEqual(undefined); - }); - - test('Can process Resource entities by overriding shouldProcessEntity', async () => { - const processor = buildProcessor({ - shouldProcessEntity: (entity: Entity) => { - return entity.kind === 'Resource'; - }, - }); - - mockFetchImplementation(); - const entity = baseEntity(); - entity.kind = 'Resource'; - - await processor.preProcessEntity(entity, null, null, null, cache); - expect(mockedFetch).toHaveBeenCalledTimes(1); - expect(entity.metadata.tags).toStrictEqual([ - 'c++', - 'asp-dot-net', - 'java', - 'common-lisp', - ]); - }); - - test('Can omit languages using languageMap', async () => { - const processor = buildProcessor({ - languageMap: { - Java: '', - 'ASP.net': '', - }, - }); - - mockFetchImplementation(); - const entity = baseEntity(); - await processor.preProcessEntity(entity, null, null, null, cache); - expect(mockedFetch).toHaveBeenCalledTimes(1); - expect(entity.metadata.tags).toStrictEqual(['c++', 'common-lisp']); - }); - - test('Can rewrite langs using languageMap', async () => { - const processor = buildProcessor({ - languageMap: { - Java: 'notjava', - }, - }); - - mockFetchImplementation(); - const entity = baseEntity(); - await processor.preProcessEntity(entity, null, null, null, cache); - expect(mockedFetch).toHaveBeenCalledTimes(1); - expect(entity.metadata.tags).toStrictEqual([ - 'c++', - 'asp-dot-net', - 'notjava', - 'common-lisp', - ]); - }); - - test('Can omit languages less than bytesThreshold', async () => { - const processor = buildProcessor({ - bytesThreshold: 5000, - }); - - mockFetchImplementation(); - const entity = baseEntity(); - await processor.preProcessEntity(entity, null, null, null, cache); - expect(mockedFetch).toHaveBeenCalledTimes(1); - expect(entity.metadata.tags).toStrictEqual(['java', 'common-lisp']); - }); - - test('Can include languages that arent programming', async () => { - const processor = buildProcessor({ - languageTypes: ['data'], - }); - - mockFetchImplementation(); - const entity = baseEntity(); - await processor.preProcessEntity(entity, null, null, null, cache); - expect(mockedFetch).toHaveBeenCalledTimes(1); - expect(entity.metadata.tags).toStrictEqual(['yaml', 'json']); - }); - - test('Refetches from API when cache disabled', async () => { - const processor = buildProcessor({ - cacheTTL: { minutes: 0 }, - }); - - mockFetchImplementation(); - const entity = baseEntity(); - await processor.preProcessEntity(entity, null, null, null, cache); - expect(mockedFetch).toHaveBeenCalledTimes(1); - expect(mockCacheGet).toHaveBeenCalledTimes(0); - expect(mockCacheSet).toHaveBeenCalledTimes(0); - mockedFetch.mockClear(); - await processor.preProcessEntity(entity, null, null, null, cache); - expect(mockedFetch).toHaveBeenCalledTimes(1); - expect(mockCacheGet).toHaveBeenCalledTimes(0); - expect(mockCacheSet).toHaveBeenCalledTimes(0); - }); - - test('Caches across runs with cache enabled', async () => { - const processor = buildProcessor({ - cacheTTL: { minutes: 5 }, - }); - - mockFetchImplementation(); - const entity = baseEntity(); - await processor.preProcessEntity(entity, null, null, null, cache); - expect(mockedFetch).toHaveBeenCalledTimes(1); - expect(mockCacheGet).toHaveBeenCalledTimes(1); - expect(mockCacheSet).toHaveBeenCalledTimes(1); - - mockedFetch.mockClear(); - mockCacheGet.mockClear(); - mockCacheSet.mockClear(); - await processor.preProcessEntity(entity, null, null, null, cache); - expect(mockedFetch).toHaveBeenCalledTimes(0); - expect(mockCacheGet).toHaveBeenCalledTimes(1); - expect(mockCacheSet).toHaveBeenCalledTimes(0); - }); -}); - -function mockFetchImplementation(): void { - mockedFetch.mockResolvedValue({ - json: jest.fn().mockResolvedValue({ - languageCount: 6, - totalBytes: 43823, - processedDate: '2023-06-20T21:37:48.337Z', - breakdown: [ - { - name: 'YAML', - percentage: 2.23, - bytes: 979, - type: 'data', - color: '#cb171e', - }, - { - name: 'JSON', - percentage: 1.31, - bytes: 574, - type: 'data', - color: '#292929', - }, - { - name: 'C++', - percentage: 5.25, - bytes: 2300, - type: 'programming', - color: '#f34b7d', - }, - { - name: 'ASP.net', - percentage: 6.97, - bytes: 3053, - type: 'programming', - color: '#178600', - }, - { - name: 'Java', - percentage: 12.79, - bytes: 5603, - type: 'programming', - color: '#b07219', - }, - { - name: 'Common Lisp', - percentage: 71.46, - bytes: 31314, - type: 'programming', - color: '#3fb68b', - }, - ], - }), - } as unknown as Response); -} - -function baseEntity(): Entity { - return { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Component', - metadata: { - name: 'foo', - }, - }; -} - -function buildProcessor(options: Partial) { - const config = new ConfigReader({ - linguist: { - tagsProcessor: { - bytesThreshold: options.bytesThreshold, - languageTypes: options.languageTypes, - languageMap: options.languageMap, - cacheTTL: options.cacheTTL, - }, - }, - }); - return LinguistTagsProcessor.fromConfig(config, { - logger: getVoidLogger(), - discovery, - shouldProcessEntity: options.shouldProcessEntity, - }); -} diff --git a/plugins/linguist-backend/src/processor/LinguistTagsProcessor.ts b/plugins/linguist-backend/src/processor/LinguistTagsProcessor.ts deleted file mode 100644 index 456de3809f..0000000000 --- a/plugins/linguist-backend/src/processor/LinguistTagsProcessor.ts +++ /dev/null @@ -1,268 +0,0 @@ -/* - * 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 { Entity, stringifyEntityRef } from '@backstage/catalog-model'; -import { - CatalogProcessor, - CatalogProcessorCache, -} from '@backstage/plugin-catalog-node'; -import { DiscoveryService, LoggerService } from '@backstage/backend-plugin-api'; -import { Languages, LanguageType } from '@backstage/plugin-linguist-common'; -import fetch from 'node-fetch'; -import { durationToMilliseconds, HumanDuration } from '@backstage/types'; -import { Config } from '@backstage/config'; - -/** - * A function which given an entity, determines if it should be processed for linguist tags. - * @public - */ -export type ShouldProcessEntity = (entity: Entity) => boolean; - -interface CachedData { - [key: string]: number | string[]; - languages: string[]; - cachedTime: number; -} - -/** - * The constructor options for building the LinguistTagsProcessor - * @public - */ -export interface LinguistTagsProcessorOptions { - logger: LoggerService; - discovery: DiscoveryService; - /** - * Optional map that gives full control over which linguist languages should be included as tags and - * how they should be represented. The keys should be exact matches to languages in the linguist - * and the values should be how they render as backstage tags. Keep in mind that backstage has character - * requirements for tags. If you map a key to a falsey value, it will not be emitted as a tag. - */ - languageMap?: Record; - /** - * A function which determines which entities should be processed by the LinguistTagProcessor. - * - * The default is to process all entities of kind=Component - */ - shouldProcessEntity?: ShouldProcessEntity; - /** - * Determines how long to cache language breakdowns for entities in the processor. Considering - * how often this processor runs, caching can help move some read traffic off of the linguist DB. - * - * If this caching is using up too much memory, you can disable it by setting cacheTTL to 0. - */ - cacheTTL?: HumanDuration; - /** - * How many bytes must exist of a language in a repo before we consider it for adding a tag to - * the entity. This can be used if some repos have short utility scripts that may not be the primary - * language for the repo. - */ - bytesThreshold?: number; - /** - * Which linguist file types to process tags for. - */ - languageTypes?: LanguageType[]; -} - -/** - * This processor will fetch the language breakdown from the linguist API and - * add the languages to the entity as searchable tags. - * - * @public - * */ -export class LinguistTagsProcessor implements CatalogProcessor { - private logger: LoggerService; - private discovery: DiscoveryService; - private loggerMeta = { plugin: 'LinguistTagsProcessor' }; - private languageMap: Record = {}; - private shouldProcessEntity: ShouldProcessEntity = (entity: Entity) => { - return entity.kind === 'Component'; - }; - private cacheTTLMilliseconds: number; - private bytesThreshold = 0; - private languageTypes: LanguageType[] = ['programming']; - - getProcessorName(): string { - return 'LinguistTagsProcessor'; - } - - constructor(options: LinguistTagsProcessorOptions) { - this.logger = options.logger; - this.discovery = options.discovery; - if (options.shouldProcessEntity) { - this.shouldProcessEntity = options.shouldProcessEntity; - } - this.cacheTTLMilliseconds = durationToMilliseconds( - options.cacheTTL || { minutes: 30 }, - ); - if (options.bytesThreshold) { - this.bytesThreshold = options.bytesThreshold; - } - if (options.languageTypes) { - this.languageTypes = options.languageTypes; - } - if (options.languageMap) { - this.languageMap = options.languageMap; - } - } - - static fromConfig( - config: Config, - options: LinguistTagsProcessorOptions, - ): LinguistTagsProcessor { - const c = config.getOptionalConfig('linguist.tagsProcessor'); - if (c) { - options.bytesThreshold ??= c.getOptionalNumber('bytesThreshold'); - options.languageTypes ??= c.getOptionalStringArray( - 'languageTypes', - ) as LanguageType[]; - options.languageMap ??= c.getOptional('languageMap'); - options.cacheTTL ??= c.getOptional('cacheTTL'); - } - - return new LinguistTagsProcessor(options); - } - - /** - * Given an entity ref, fetches the language breakdown from the Linguist backend HTTP API. - * @param entityRef - stringified entity ref - * @returns The language breakdown - */ - private async getLanguagesFromLinguistAPI( - entityRef: string, - ): Promise { - this.logger.debug(`Fetching languages from linguist API`, { - ...this.loggerMeta, - entityRef, - }); - - const baseUrl = await this.discovery.getBaseUrl('linguist'); - const linguistApi = new URL(`${baseUrl}/entity-languages`); - linguistApi.searchParams.append('entityRef', entityRef); - const linguistData = await fetch(linguistApi).then( - res => res.json() as Promise, - ); - if (!linguistData || !linguistData.processedDate) { - return []; - } - - return linguistData.breakdown - .filter( - b => - this.languageTypes.includes(b.type) && b.bytes > this.bytesThreshold, - ) - .map(b => b.name); - } - - /** - * Cached wrapper around getLanguagesFromLinguistAPI - * @param cache - The CatalogProcessorCache - * @param entityRef - Stringified entity references - * - * @returns List of languages - */ - private async getCachedLanguages( - cache: CatalogProcessorCache, - entityRef: string, - ): Promise { - let cachedData = (await cache.get(entityRef)) as CachedData | undefined; - if (!cachedData || this.isExpired(cachedData)) { - const languages = await this.getLanguagesFromLinguistAPI(entityRef); - cachedData = { languages, cachedTime: Date.now() }; - await cache.set(entityRef, cachedData); - } - this.logger.debug(`Fetched cached languages ${cachedData.languages}`, { - ...this.loggerMeta, - entityRef, - }); - return cachedData.languages; - } - - /** - * Determines if cached data is expired based on TTL - * - * @param cachedData - The cached data for this entity - * @returns True if data is expired - */ - private isExpired(cachedData: CachedData): boolean { - const elapsed = Date.now() - (cachedData.cachedTime || 0); - return elapsed > this.cacheTTLMilliseconds; - } - - /** - * This pre-processor will fetch linguist data for a Component and convert the language breakdown - * into entity tags which will be appended to the entity. - * - * @public - */ - async preProcessEntity( - entity: Entity, - _: any, - __: any, - ___: any, - cache: CatalogProcessorCache, - ): Promise { - if (!this.shouldProcessEntity(entity)) { - return entity; - } - const entityRef = stringifyEntityRef(entity); - this.logger.debug(`Processing ${entityRef}`, { - ...this.loggerMeta, - entityRef, - }); - - const languages = - this.cacheTTLMilliseconds > 0 - ? await this.getCachedLanguages(cache, entityRef) - : await this.getLanguagesFromLinguistAPI(entityRef); - - const tags = (entity.metadata.tags ||= []); - const originalTagCount = tags.length; - - languages.forEach(lang => { - const cleanedUpLangTag = - lang in this.languageMap ? this.languageMap[lang] : sanitizeTag(lang); - if (cleanedUpLangTag && !tags.includes(cleanedUpLangTag)) { - tags.push(cleanedUpLangTag); - } - }); - - const addedCount = tags.length - originalTagCount; - - this.logger.debug(`Added ${addedCount} language tags from linguist`, { - ...this.loggerMeta, - entityRef, - }); - - return entity; - } -} - -/** - * Converts language tags from linguist to something acceptable by - * the tag requirements for backstage - * - * @param tag - A language tag from linguist - * @returns Cleaned up language tag - * @internal - */ -export function sanitizeTag(tag: string): string { - return tag - .toLowerCase() - .replace(/\.net/g, '-dot-net') - .replace(/[^a-z0-9:+#-]+/g, '-') - .replace(/-{2,}/g, '-') - .replace(/^-+|-+$/g, ''); -} diff --git a/plugins/linguist-backend/src/processor/__snapshots__/LinguistTagsProcessor.test.ts.snap b/plugins/linguist-backend/src/processor/__snapshots__/LinguistTagsProcessor.test.ts.snap deleted file mode 100644 index 4eb428f61a..0000000000 --- a/plugins/linguist-backend/src/processor/__snapshots__/LinguistTagsProcessor.test.ts.snap +++ /dev/null @@ -1,707 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`sanitizeTag Should clean up all linguist languages 1`] = ` -[ - "1c-enterprise", - "2-dimensional-array", - "4d", - "abap", - "abap-cds", - "abnf", - "ags-script", - "aidl", - "al", - "ampl", - "antlr", - "api-blueprint", - "apl", - "asl", - "asn-1", - "asp-dot-net", - "ats", - "actionscript", - "ada", - "adblock-filter-list", - "adobe-font-metrics", - "agda", - "alloy", - "alpine-abuild", - "altium-designer", - "angelscript", - "ant-build-system", - "antlers", - "apacheconf", - "apex", - "apollo-guidance-computer", - "applescript", - "arc", - "asciidoc", - "aspectj", - "assembly", - "astro", - "asymptote", - "augeas", - "autohotkey", - "autoit", - "avro-idl", - "awk", - "basic", - "ballerina", - "batchfile", - "beef", - "befunge", - "berry", - "bibtex", - "bicep", - "bikeshed", - "bison", - "bitbake", - "blade", - "blitzbasic", - "blitzmax", - "bluespec", - "boo", - "boogie", - "brainfuck", - "brighterscript", - "brightscript", - "browserslist", - "c", - "c#", - "c++", - "c-objdump", - "c2hs-haskell", - "cap-cds", - "cil", - "clips", - "cmake", - "cobol", - "codeowners", - "collada", - "cson", - "css", - "csv", - "cue", - "cweb", - "cabal-config", - "cadence", - "cairo", - "cameligo", - "cap-n-proto", - "cartocss", - "ceylon", - "chapel", - "charity", - "checksums", - "chuck", - "circom", - "cirru", - "clarion", - "clarity", - "classic-asp", - "clean", - "click", - "clojure", - "closure-templates", - "cloud-firestore-security-rules", - "conll-u", - "codeql", - "coffeescript", - "coldfusion", - "coldfusion-cfc", - "common-lisp", - "common-workflow-language", - "component-pascal", - "cool", - "coq", - "cpp-objdump", - "creole", - "crystal", - "csound", - "csound-document", - "csound-score", - "cuda", - "cue-sheet", - "curry", - "cycript", - "cypher", - "cython", - "d", - "d-objdump", - "d2", - "digital-command-language", - "dm", - "dns-zone", - "dtrace", - "dafny", - "darcs-patch", - "dart", - "dataweave", - "debian-package-control-file", - "denizenscript", - "dhall", - "diff", - "directx-3d-file", - "dockerfile", - "dogescript", - "dotenv", - "dylan", - "e", - "e-mail", - "ebnf", - "ecl", - "eclipse", - "ejs", - "eq", - "eagle", - "earthly", - "easybuild", - "ecere-projects", - "ecmarkup", - "editorconfig", - "edje-data-collection", - "eiffel", - "elixir", - "elm", - "elvish", - "elvish-transcript", - "emacs-lisp", - "emberscript", - "erlang", - "euphoria", - "f#", - "f", - "figlet-font", - "flux", - "factor", - "fancy", - "fantom", - "faust", - "fennel", - "filebench-wml", - "filterscript", - "fluent", - "formatted", - "forth", - "fortran", - "fortran-free-form", - "freebasic", - "freemarker", - "frege", - "futhark", - "g-code", - "gaml", - "gams", - "gap", - "gcc-machine-description", - "gdb", - "gdscript", - "gedcom", - "glsl", - "gn", - "gsc", - "game-maker-language", - "gemfile-lock", - "gemini", - "genero", - "genero-forms", - "genie", - "genshi", - "gentoo-ebuild", - "gentoo-eclass", - "gerber-image", - "gettext-catalog", - "gherkin", - "git-attributes", - "git-config", - "git-revision-list", - "gleam", - "glyph", - "glyph-bitmap-distribution-format", - "gnuplot", - "go", - "go-checksums", - "go-module", - "go-workspace", - "godot-resource", - "golo", - "gosu", - "grace", - "gradle", - "grammatical-framework", - "graph-modeling-language", - "graphql", - "graphviz-dot", - "groovy", - "groovy-server-pages", - "haproxy", - "hcl", - "hlsl", - "hocon", - "html", - "html+ecr", - "html+eex", - "html+erb", - "html+php", - "html+razor", - "http", - "hxml", - "hack", - "haml", - "handlebars", - "harbour", - "haskell", - "haxe", - "hiveql", - "holyc", - "hosts-file", - "hy", - "hyphy", - "idl", - "igor-pro", - "ini", - "irc-log", - "idris", - "ignore-list", - "imagej-macro", - "imba", - "inform-7", - "ink", - "inno-setup", - "io", - "ioke", - "isabelle", - "isabelle-root", - "j", - "jar-manifest", - "jcl", - "jflex", - "json", - "json-with-comments", - "json5", - "jsonld", - "jsoniq", - "janet", - "jasmin", - "java", - "java-properties", - "java-server-pages", - "javascript", - "javascript+erb", - "jest-snapshot", - "jetbrains-mps", - "jinja", - "jison", - "jison-lex", - "jolie", - "jsonnet", - "julia", - "jupyter-notebook", - "just", - "krl", - "kaitai-struct", - "kakounescript", - "kerboscript", - "kicad-layout", - "kicad-legacy-layout", - "kicad-schematic", - "kickstart", - "kit", - "kotlin", - "kusto", - "lfe", - "llvm", - "lolcode", - "lsl", - "ltspice-symbol", - "labview", - "lark", - "lasso", - "latte", - "lean", - "less", - "lex", - "ligolang", - "lilypond", - "limbo", - "linker-script", - "linux-kernel-module", - "liquid", - "literate-agda", - "literate-coffeescript", - "literate-haskell", - "livescript", - "logos", - "logtalk", - "lookml", - "loomscript", - "lua", - "m", - "m4", - "m4sugar", - "matlab", - "maxscript", - "mdx", - "mlir", - "mql4", - "mql5", - "mtml", - "muf", - "macaulay2", - "makefile", - "mako", - "markdown", - "marko", - "mask", - "mathematica", - "maven-pom", - "max", - "mercury", - "mermaid", - "meson", - "metal", - "microsoft-developer-studio-project", - "microsoft-visual-studio-solution", - "minid", - "miniyaml", - "mint", - "mirah", - "modelica", - "modula-2", - "modula-3", - "module-management-system", - "monkey", - "monkey-c", - "moocode", - "moonscript", - "motoko", - "motorola-68k-assembly", - "move", - "muse", - "mustache", - "myghty", - "nasl", - "ncl", - "neon", - "nl", - "npm-config", - "nsis", - "nwscript", - "nasal", - "nearley", - "nemerle", - "netlinx", - "netlinx+erb", - "netlogo", - "newlisp", - "nextflow", - "nginx", - "nim", - "ninja", - "nit", - "nix", - "nu", - "numpy", - "nunjucks", - "nushell", - "oasv2-json", - "oasv2-yaml", - "oasv3-json", - "oasv3-yaml", - "ocaml", - "objdump", - "object-data-instance-notation", - "objectscript", - "objective-c", - "objective-c++", - "objective-j", - "odin", - "omgrofl", - "opa", - "opal", - "open-policy-agent", - "openapi-specification-v2", - "openapi-specification-v3", - "opencl", - "openedge-abl", - "openqasm", - "openrc-runscript", - "openscad", - "openstep-property-list", - "opentype-feature-file", - "option-list", - "org", - "ox", - "oxygene", - "oz", - "p4", - "pddl", - "peg-js", - "php", - "plsql", - "plpgsql", - "pov-ray-sdl", - "pact", - "pan", - "papyrus", - "parrot", - "parrot-assembly", - "parrot-internal-representation", - "pascal", - "pawn", - "pep8", - "perl", - "pic", - "pickle", - "picolisp", - "piglatin", - "pike", - "plantuml", - "pod", - "pod-6", - "pogoscript", - "polar", - "pony", - "portugol", - "postcss", - "postscript", - "powerbuilder", - "powershell", - "prisma", - "processing", - "procfile", - "proguard", - "prolog", - "promela", - "propeller-spin", - "protocol-buffer", - "protocol-buffer-text-format", - "public-key", - "pug", - "puppet", - "pure-data", - "purebasic", - "purescript", - "pyret", - "python", - "python-console", - "python-traceback", - "q#", - "qml", - "qmake", - "qt-script", - "quake", - "r", - "raml", - "rbs", - "rdoc", - "realbasic", - "rexx", - "rmarkdown", - "rpc", - "rpgle", - "rpm-spec", - "runoff", - "racket", - "ragel", - "raku", - "rascal", - "raw-token-data", - "rescript", - "readline-config", - "reason", - "reasonligo", - "rebol", - "record-jar", - "red", - "redcode", - "redirect-rules", - "regular-expression", - "ren-py", - "renderscript", - "rich-text-format", - "ring", - "riot", - "robotframework", - "roff", - "roff-manpage", - "rouge", - "routeros-script", - "ruby", - "rust", - "sas", - "scss", - "selinux-policy", - "smt", - "sparql", - "sqf", - "sql", - "sqlpl", - "srecode-template", - "ssh-config", - "star", - "stl", - "ston", - "svg", - "swig", - "sage", - "saltstack", - "sass", - "scala", - "scaml", - "scenic", - "scheme", - "scilab", - "self", - "shaderlab", - "shell", - "shellcheck-config", - "shellsession", - "shen", - "sieve", - "simple-file-verification", - "singularity", - "slash", - "slice", - "slim", - "smpl", - "smali", - "smalltalk", - "smarty", - "smithy", - "snakemake", - "solidity", - "soong", - "sourcepawn", - "spline-font-database", - "squirrel", - "stan", - "standard-ml", - "starlark", - "stata", - "stringtemplate", - "stylus", - "subrip-text", - "sugarss", - "supercollider", - "svelte", - "sway", - "swift", - "systemverilog", - "ti-program", - "tl-verilog", - "tla", - "toml", - "tsql", - "tsv", - "tsx", - "txl", - "talon", - "tcl", - "tcsh", - "tex", - "tea", - "terra", - "texinfo", - "text", - "textmate-properties", - "textile", - "thrift", - "turing", - "turtle", - "twig", - "type-language", - "typescript", - "unified-parallel-c", - "unity3d-asset", - "unix-assembly", - "uno", - "unrealscript", - "urweb", - "v", - "vba", - "vbscript", - "vcl", - "vhdl", - "vala", - "valve-data-format", - "velocity-template-language", - "verilog", - "vim-help-file", - "vim-script", - "vim-snippet", - "visual-basic-dot-net", - "visual-basic-6-0", - "volt", - "vue", - "vyper", - "wdl", - "wgsl", - "wavefront-material", - "wavefront-object", - "web-ontology-language", - "webassembly", - "webassembly-interface-type", - "webidl", - "webvtt", - "wget-config", - "whiley", - "wikitext", - "win32-message-file", - "windows-registry-entries", - "witcher-script", - "wollok", - "world-of-warcraft-addon-data", - "wren", - "x-bitmap", - "x-font-directory-index", - "x-pixmap", - "x10", - "xc", - "xcompose", - "xml", - "xml-property-list", - "xpages", - "xproc", - "xquery", - "xs", - "xslt", - "xojo", - "xonsh", - "xtend", - "yaml", - "yang", - "yara", - "yasnippet", - "yacc", - "yul", - "zap", - "zil", - "zeek", - "zenscript", - "zephir", - "zig", - "zimpl", - "curl-config", - "desktop", - "dircolors", - "ec", - "edn", - "fish", - "hoon", - "jq", - "kvlang", - "mirc-script", - "mcfunction", - "mupad", - "nanorc", - "nesc", - "ooc", - "q", - "restructuredtext", - "robots-txt", - "sed", - "wisp", - "xbase", -] -`; diff --git a/plugins/linguist-backend/src/run.ts b/plugins/linguist-backend/src/run.ts deleted file mode 100644 index d945aa13f0..0000000000 --- a/plugins/linguist-backend/src/run.ts +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 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 { getRootLogger } from '@backstage/backend-common'; -import yn from 'yn'; -import { startStandaloneServer } from './service/standaloneServer'; - -const port = process.env.PLUGIN_PORT ? Number(process.env.PLUGIN_PORT) : 7007; -const enableCors = yn(process.env.PLUGIN_CORS, { default: false }); -const logger = getRootLogger(); - -startStandaloneServer({ port, enableCors, logger }).catch(err => { - logger.error(err); - process.exit(1); -}); - -process.on('SIGINT', () => { - logger.info('CTRL+C pressed; exiting.'); - process.exit(0); -}); diff --git a/plugins/linguist-backend/src/service/router.test.ts b/plugins/linguist-backend/src/service/router.test.ts deleted file mode 100644 index 4048e1213b..0000000000 --- a/plugins/linguist-backend/src/service/router.test.ts +++ /dev/null @@ -1,130 +0,0 @@ -/* - * 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 { - DatabaseManager, - getVoidLogger, - PluginDatabaseManager, - PluginEndpointDiscovery, - TokenManager, - UrlReaders, -} from '@backstage/backend-common'; -import express from 'express'; -import request from 'supertest'; -import { ConfigReader } from '@backstage/config'; -import { createRouter, createRouterFromConfig } from './router'; -import { LinguistBackendApi } from '../api'; -import { TaskScheduleDefinition } from '@backstage/backend-tasks'; - -function createDatabase(): PluginDatabaseManager { - return DatabaseManager.fromConfig( - new ConfigReader({ - backend: { - database: { - client: 'better-sqlite3', - connection: ':memory:', - }, - }, - }), - ).forPlugin('code-coverage'); -} - -const testDiscovery: jest.Mocked = { - getBaseUrl: jest - .fn() - .mockResolvedValue('http://localhost:7007/api/code-coverage'), - getExternalBaseUrl: jest.fn(), -}; - -const mockedTokenManager: jest.Mocked = { - getToken: jest.fn(), - authenticate: jest.fn(), -}; - -const mockUrlReader = UrlReaders.default({ - logger: getVoidLogger(), - config: new ConfigReader({}), -}); - -const schedule: TaskScheduleDefinition = { - frequency: { minutes: 2 }, - timeout: { minutes: 15 }, - initialDelay: { seconds: 15 }, -}; - -describe('createRouter', () => { - let linguistBackendApi: jest.Mocked; - let app: express.Express; - - beforeEach(() => { - jest.resetAllMocks(); - }); - - describe('GET /health', () => { - beforeAll(async () => { - const router = await createRouter( - { schedule: schedule, age: { days: 30 }, useSourceLocation: false }, - { - linguistBackendApi: linguistBackendApi, - discovery: testDiscovery, - database: createDatabase(), - reader: mockUrlReader, - logger: getVoidLogger(), - tokenManager: mockedTokenManager, - }, - ); - app = express().use(router); - }); - it('returns ok', async () => { - const response = await request(app).get('/health'); - - expect(response.status).toEqual(200); - expect(response.body).toEqual({ status: 'ok' }); - }); - }); - - describe('GET /health from config', () => { - beforeAll(async () => { - const config = new ConfigReader({ - linguist: { - schedule: { - frequency: { minutes: 2 }, - timeout: { minutes: 15 }, - initialDelay: { seconds: 15 }, - }, - age: { days: 30 }, - useSourceLocation: false, - }, - }); - const router = await createRouterFromConfig({ - linguistBackendApi: linguistBackendApi, - discovery: testDiscovery, - database: createDatabase(), - reader: mockUrlReader, - logger: getVoidLogger(), - config, - tokenManager: mockedTokenManager, - }); - app = express().use(router); - }); - it('returns ok', async () => { - const response = await request(app).get('/health'); - - expect(response.status).toEqual(200); - expect(response.body).toEqual({ status: 'ok' }); - }); - }); -}); diff --git a/plugins/linguist-backend/src/service/router.ts b/plugins/linguist-backend/src/service/router.ts deleted file mode 100644 index ec2494b166..0000000000 --- a/plugins/linguist-backend/src/service/router.ts +++ /dev/null @@ -1,177 +0,0 @@ -/* - * 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 { - createLegacyAuthAdapters, - errorHandler, - PluginDatabaseManager, - PluginEndpointDiscovery, - TokenManager, - UrlReader, -} from '@backstage/backend-common'; -import express from 'express'; -import Router from 'express-promise-router'; -import { LinguistBackendApi } from '../api'; -import { LinguistBackendDatabase } from '../db'; -import { - PluginTaskScheduler, - readTaskScheduleDefinitionFromConfig, - TaskScheduleDefinition, -} from '@backstage/backend-tasks'; -import { HumanDuration } from '@backstage/types'; -import { CatalogClient } from '@backstage/catalog-client'; -import { LinguistBackendClient } from '../api/LinguistBackendClient'; -import { Config } from '@backstage/config'; -import { - AuthService, - HttpAuthService, - LoggerService, -} from '@backstage/backend-plugin-api'; - -/** @public */ -export interface PluginOptions { - schedule?: TaskScheduleDefinition; - age?: HumanDuration; - batchSize?: number; - useSourceLocation?: boolean; - linguistJsOptions?: Record; - kind?: string[]; -} - -/** @public */ -export interface RouterOptions { - linguistBackendApi?: LinguistBackendApi; - logger: LoggerService; - reader: UrlReader; - tokenManager: TokenManager; - database: PluginDatabaseManager; - discovery: PluginEndpointDiscovery; - scheduler?: PluginTaskScheduler; - config?: Config; - auth?: AuthService; - httpAuth?: HttpAuthService; -} - -/** @public */ -export async function createRouter( - pluginOptions: PluginOptions, - routerOptions: RouterOptions, -): Promise { - const { logger, reader, database, discovery, scheduler, tokenManager, auth } = - routerOptions; - - const { - schedule, - age, - batchSize, - useSourceLocation, - kind, - linguistJsOptions, - } = pluginOptions; - - const linguistBackendStore = await LinguistBackendDatabase.create( - await database.getClient(), - ); - - const catalogClient = new CatalogClient({ discoveryApi: discovery }); - - const { auth: adaptedAuth } = createLegacyAuthAdapters({ - auth, - tokenManager: tokenManager, - discovery: discovery, - }); - - const linguistBackendClient = - routerOptions.linguistBackendApi || - new LinguistBackendClient( - logger, - linguistBackendStore, - reader, - adaptedAuth, - catalogClient, - age, - batchSize, - useSourceLocation, - kind, - linguistJsOptions, - ); - - if (scheduler && schedule) { - logger.info( - `Scheduling processing of entities with: ${JSON.stringify(schedule)}`, - ); - await scheduler.scheduleTask({ - id: 'linguist_process_entities', - frequency: schedule.frequency, - timeout: schedule.timeout, - initialDelay: schedule.initialDelay, - scope: schedule.scope, - fn: async () => { - await linguistBackendClient.processEntities(); - }, - }); - } - - const router = Router(); - router.use(express.json()); - - router.get('/health', (_, response) => { - response.send({ status: 'ok' }); - }); - - /** - * /entity-languages?entity=component:default/my-component - */ - router.get('/entity-languages', async (req, res) => { - const { entityRef: entityRef } = req.query; - - if (!entityRef) { - throw new Error('No entityRef was provided'); - } - - const entityLanguages = await linguistBackendClient.getEntityLanguages( - entityRef as string, - ); - res.status(200).json(entityLanguages); - }); - - router.use(errorHandler()); - return router; -} - -/** @public */ -export async function createRouterFromConfig(routerOptions: RouterOptions) { - const { config } = routerOptions; - const pluginOptions: PluginOptions = {}; - if (config) { - if (config.has('linguist.schedule')) { - pluginOptions.schedule = readTaskScheduleDefinitionFromConfig( - config.getConfig('linguist.schedule'), - ); - } - pluginOptions.batchSize = config.getOptionalNumber('linguist.batchSize'); - pluginOptions.useSourceLocation = - config.getOptionalBoolean('linguist.useSourceLocation') ?? false; - pluginOptions.age = config.getOptionalConfig('linguist.age') as - | HumanDuration - | undefined; - pluginOptions.kind = config.getOptionalStringArray('linguist.kind'); - pluginOptions.linguistJsOptions = config.getOptionalConfig( - 'linguist.linguistJsOptions', - ); - } - return createRouter(pluginOptions, routerOptions); -} diff --git a/plugins/linguist-backend/src/service/standaloneServer.ts b/plugins/linguist-backend/src/service/standaloneServer.ts deleted file mode 100644 index d7e02967a4..0000000000 --- a/plugins/linguist-backend/src/service/standaloneServer.ts +++ /dev/null @@ -1,82 +0,0 @@ -/* - * 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 { - createServiceBuilder, - DatabaseManager, - HostDiscovery, - loadBackendConfig, - ServerTokenManager, - UrlReaders, -} from '@backstage/backend-common'; -import { Server } from 'http'; -import { createRouter } from './router'; -import { TaskScheduleDefinition } from '@backstage/backend-tasks'; -import { ConfigReader } from '@backstage/config'; -import { LoggerService } from '@backstage/backend-plugin-api'; - -export interface ServerOptions { - port: number; - enableCors: boolean; - logger: LoggerService; -} - -export async function startStandaloneServer( - options: ServerOptions, -): Promise { - const logger = options.logger.child({ service: 'linguist-backend' }); - const config = await loadBackendConfig({ logger, argv: process.argv }); - const manager = DatabaseManager.fromConfig( - new ConfigReader({ - backend: { - database: { client: 'better-sqlite3', connection: ':memory:' }, - }, - }), - ); - const database = manager.forPlugin('linguist'); - - const schedule: TaskScheduleDefinition = { - frequency: { minutes: 2 }, - timeout: { minutes: 15 }, - initialDelay: { seconds: 15 }, - }; - - logger.debug('Starting application server...'); - const router = await createRouter( - { schedule: schedule, age: { days: 30 }, useSourceLocation: false }, - { - database, - discovery: HostDiscovery.fromConfig(config), - reader: UrlReaders.default({ logger, config }), - logger, - tokenManager: ServerTokenManager.noop(), - }, - ); - - let service = createServiceBuilder(module) - .setPort(options.port) - .addRouter('/linguist', router); - if (options.enableCors) { - service = service.enableCors({ origin: 'http://localhost:3000' }); - } - - return await service.start().catch(err => { - logger.error(err); - process.exit(1); - }); -} - -module.hot?.accept(); diff --git a/plugins/linguist-backend/src/setupTests.ts b/plugins/linguist-backend/src/setupTests.ts deleted file mode 100644 index 813cdeaae3..0000000000 --- a/plugins/linguist-backend/src/setupTests.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * 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. - */ - -export {}; diff --git a/plugins/linguist-common/.eslintrc.js b/plugins/linguist-common/.eslintrc.js deleted file mode 100644 index e2a53a6ad2..0000000000 --- a/plugins/linguist-common/.eslintrc.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/linguist-common/CHANGELOG.md b/plugins/linguist-common/CHANGELOG.md deleted file mode 100644 index c9eb3c0c28..0000000000 --- a/plugins/linguist-common/CHANGELOG.md +++ /dev/null @@ -1,38 +0,0 @@ -# @backstage/plugin-linguist-common - -## 0.1.2 - -### Patch Changes - -- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. - -## 0.1.2-next.0 - -### Patch Changes - -- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. - -## 0.1.1 - -### Patch Changes - -- 12a8c94eda8d: Add package repository and homepage metadata -- d440f1dd0e72: Exported new LanguageType type alias - -## 0.1.1-next.1 - -### Patch Changes - -- d440f1dd0e72: Exported new LanguageType type alias - -## 0.1.1-next.0 - -### Patch Changes - -- 12a8c94eda8d: Add package repository and homepage metadata - -## 0.1.0 - -### Minor Changes - -- 75cfee5688: Introduced the Linguist plugin, checkout the plugin's `README.md` for more details! diff --git a/plugins/linguist-common/README.md b/plugins/linguist-common/README.md deleted file mode 100644 index 4e31966953..0000000000 --- a/plugins/linguist-common/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Deprecated - -This package has been moved to the [backstage-community/plugins](https://github.com/backstage/community-plugins) repository. Migrate to using `@backstage-community/plugin-linguist-common` instead. diff --git a/plugins/linguist-common/api-report.md b/plugins/linguist-common/api-report.md deleted file mode 100644 index 9ab81fd41d..0000000000 --- a/plugins/linguist-common/api-report.md +++ /dev/null @@ -1,51 +0,0 @@ -## API Report File for "@backstage/plugin-linguist-common" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts -// @public (undocumented) -export type EntitiesOverview = { - entityCount: number; - processedCount: number; - pendingCount: number; - staleCount: number; - filteredEntities: string[]; -}; - -// @public (undocumented) -export type EntityResults = { - entityRef: string; - results: Languages; -}; - -// @public (undocumented) -export type Language = { - name: string; - percentage: number; - bytes: number; - type: LanguageType; - color?: `#${string}`; -}; - -// @public (undocumented) -export type Languages = { - languageCount: number; - totalBytes: number; - processedDate: string; - breakdown: Language[]; -}; - -// @public (undocumented) -export type LanguageType = 'programming' | 'data' | 'markup' | 'prose'; - -// @public (undocumented) -export const LINGUIST_ANNOTATION = 'backstage.io/linguist'; - -// @public (undocumented) -export type ProcessedEntity = { - entityRef: string; - processedDate: Date; -}; - -// (No @packageDocumentation comment for this package) -``` diff --git a/plugins/linguist-common/catalog-info.yaml b/plugins/linguist-common/catalog-info.yaml deleted file mode 100644 index 266daa4a75..0000000000 --- a/plugins/linguist-common/catalog-info.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: backstage.io/v1alpha1 -kind: Component -metadata: - name: backstage-plugin-linguist-common - title: '@backstage/plugin-linguist-common' - description: Common functionalities for the linguist plugin -spec: - lifecycle: experimental - type: backstage-common-library - owner: awanlin diff --git a/plugins/linguist-common/knip-report.md b/plugins/linguist-common/knip-report.md deleted file mode 100644 index 2661c35327..0000000000 --- a/plugins/linguist-common/knip-report.md +++ /dev/null @@ -1,2 +0,0 @@ -# Knip report - diff --git a/plugins/linguist-common/package.json b/plugins/linguist-common/package.json deleted file mode 100644 index 99668a0752..0000000000 --- a/plugins/linguist-common/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "@backstage/plugin-linguist-common", - "version": "0.1.2", - "description": "Common functionalities for the linguist plugin", - "backstage": { - "role": "common-library", - "moved": "@backstage-community/plugin-linguist-common" - }, - "publishConfig": { - "access": "public", - "main": "dist/index.cjs.js", - "module": "dist/index.esm.js", - "types": "dist/index.d.ts" - }, - "homepage": "https://backstage.io", - "repository": { - "type": "git", - "url": "https://github.com/backstage/backstage", - "directory": "plugins/linguist-common" - }, - "license": "Apache-2.0", - "sideEffects": false, - "main": "src/index.ts", - "types": "src/index.ts", - "files": [ - "dist" - ], - "scripts": { - "build": "backstage-cli package build", - "clean": "backstage-cli package clean", - "lint": "backstage-cli package lint", - "prepack": "backstage-cli package prepack", - "postpack": "backstage-cli package postpack", - "test": "backstage-cli package test" - }, - "devDependencies": { - "@backstage/cli": "workspace:^" - }, - "deprecated": "This package has been moved to the backstage/community-plugins repository. You should migrate to using @backstage-community/plugin-linguist-common instead." -} diff --git a/plugins/linguist-common/src/constants.ts b/plugins/linguist-common/src/constants.ts deleted file mode 100644 index 55b3d21d02..0000000000 --- a/plugins/linguist-common/src/constants.ts +++ /dev/null @@ -1,18 +0,0 @@ -/* - * 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. - */ - -/** @public */ -export const LINGUIST_ANNOTATION = 'backstage.io/linguist'; diff --git a/plugins/linguist-common/src/index.ts b/plugins/linguist-common/src/index.ts deleted file mode 100644 index 88fe08c714..0000000000 --- a/plugins/linguist-common/src/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -/* - * 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. - */ - -export * from './types'; -export * from './constants'; diff --git a/plugins/linguist-common/src/setupTests.ts b/plugins/linguist-common/src/setupTests.ts deleted file mode 100644 index 8b9b6bd586..0000000000 --- a/plugins/linguist-common/src/setupTests.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* - * 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. - */ -export {}; diff --git a/plugins/linguist-common/src/types.ts b/plugins/linguist-common/src/types.ts deleted file mode 100644 index 515ca45f9c..0000000000 --- a/plugins/linguist-common/src/types.ts +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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. - */ - -/** @public */ -export type EntityResults = { - entityRef: string; - results: Languages; -}; - -/** @public */ -export type Languages = { - languageCount: number; - totalBytes: number; - processedDate: string; - breakdown: Language[]; -}; - -/** @public */ -export type LanguageType = 'programming' | 'data' | 'markup' | 'prose'; - -/** @public */ -export type Language = { - name: string; - percentage: number; - bytes: number; - type: LanguageType; - color?: `#${string}`; -}; - -/** @public */ -export type ProcessedEntity = { - entityRef: string; - processedDate: Date; -}; - -/** @public */ -export type EntitiesOverview = { - entityCount: number; - processedCount: number; - pendingCount: number; - staleCount: number; - filteredEntities: string[]; -}; diff --git a/plugins/linguist/.eslintrc.js b/plugins/linguist/.eslintrc.js deleted file mode 100644 index e487f765b2..0000000000 --- a/plugins/linguist/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { - rules: { - '@backstage/no-top-level-material-ui-4-imports': 'error', - }, -}); diff --git a/plugins/linguist/CHANGELOG.md b/plugins/linguist/CHANGELOG.md deleted file mode 100644 index c6c03ac26a..0000000000 --- a/plugins/linguist/CHANGELOG.md +++ /dev/null @@ -1,844 +0,0 @@ -# @backstage/plugin-linguist - -## 0.1.19 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.11.3 - - @backstage/core-compat-api@0.2.4 - - @backstage/core-components@0.14.4 - - @backstage/core-plugin-api@1.9.2 - - @backstage/frontend-plugin-api@0.6.4 - - @backstage/catalog-model@1.4.5 - - @backstage/errors@1.2.4 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.19-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/frontend-plugin-api@0.6.4-next.1 - - @backstage/core-compat-api@0.2.4-next.1 - - @backstage/catalog-model@1.4.5 - - @backstage/core-components@0.14.4-next.0 - - @backstage/core-plugin-api@1.9.1 - - @backstage/errors@1.2.4 - - @backstage/plugin-catalog-react@1.11.3-next.1 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.19-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.14.4-next.0 - - @backstage/catalog-model@1.4.5 - - @backstage/core-compat-api@0.2.4-next.0 - - @backstage/core-plugin-api@1.9.1 - - @backstage/errors@1.2.4 - - @backstage/frontend-plugin-api@0.6.4-next.0 - - @backstage/plugin-catalog-react@1.11.3-next.0 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.18 - -### Patch Changes - -- e8f026a: Use ESM exports of react-use library -- Updated dependencies - - @backstage/core-components@0.14.3 - - @backstage/plugin-catalog-react@1.11.2 - - @backstage/frontend-plugin-api@0.6.3 - - @backstage/core-compat-api@0.2.3 - - @backstage/core-plugin-api@1.9.1 - - @backstage/catalog-model@1.4.5 - - @backstage/errors@1.2.4 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.17 - -### Patch Changes - -- e8f026a: Use ESM exports of react-use library -- Updated dependencies - - @backstage/core-components@0.14.2 - - @backstage/plugin-catalog-react@1.11.1 - - @backstage/frontend-plugin-api@0.6.2 - - @backstage/core-compat-api@0.2.2 - - @backstage/core-plugin-api@1.9.1 - - @backstage/catalog-model@1.4.5 - - @backstage/errors@1.2.4 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.16 - -### Patch Changes - -- 4fb9600: Get component's title from translation file. See: https://backstage.io/docs/plugins/internationalization#for-an-application-developer-overwrite-plugin-messages -- a0e3393: Updated to use `fetchApi` as per [ADR013](https://backstage.io/docs/architecture-decisions/adrs-adr013) -- 786c9c4: Updated dependency `luxon` to `^3.0.0`. -- 051fda1: Removed unused `dependencies` and `devDependencies` identified in Knip Report -- Updated dependencies - - @backstage/core-components@0.14.1 - - @backstage/errors@1.2.4 - - @backstage/plugin-catalog-react@1.11.0 - - @backstage/catalog-model@1.4.5 - - @backstage/core-compat-api@0.2.1 - - @backstage/core-plugin-api@1.9.1 - - @backstage/frontend-plugin-api@0.6.1 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.16-next.2 - -### Patch Changes - -- 051fda1: Removed unused `dependencies` and `devDependencies` identified in Knip Report -- Updated dependencies - - @backstage/core-components@0.14.1-next.2 - - @backstage/plugin-catalog-react@1.11.0-next.2 - - @backstage/frontend-plugin-api@0.6.1-next.2 - - @backstage/core-compat-api@0.2.1-next.2 - - @backstage/catalog-model@1.4.5-next.0 - - @backstage/core-plugin-api@1.9.1-next.1 - - @backstage/errors@1.2.4-next.0 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.16-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.14.1-next.1 - - @backstage/plugin-catalog-react@1.10.1-next.1 - - @backstage/core-plugin-api@1.9.1-next.1 - - @backstage/frontend-plugin-api@0.6.1-next.1 - - @backstage/catalog-model@1.4.5-next.0 - - @backstage/core-compat-api@0.2.1-next.1 - - @backstage/errors@1.2.4-next.0 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.16-next.0 - -### Patch Changes - -- 4fb9600: Get component's title from translation file. See: https://backstage.io/docs/plugins/internationalization#for-an-application-developer-overwrite-plugin-messages -- a0e3393: Updated to use `fetchApi` as per [ADR013](https://backstage.io/docs/architecture-decisions/adrs-adr013) -- 786c9c4: Updated dependency `luxon` to `^3.0.0`. -- Updated dependencies - - @backstage/errors@1.2.4-next.0 - - @backstage/core-components@0.14.1-next.0 - - @backstage/plugin-catalog-react@1.10.1-next.0 - - @backstage/catalog-model@1.4.5-next.0 - - @backstage/core-plugin-api@1.9.1-next.0 - - @backstage/frontend-plugin-api@0.6.1-next.0 - - @backstage/core-compat-api@0.2.1-next.0 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.15 - -### Patch Changes - -- 9aac2b0: Use `--cwd` as the first `yarn` argument -- 8fe56a8: Widen `@types/react` dependency range to include version 18. -- 995d280: Updated imports from named to default imports to help with the Material UI v4 to v5 migration -- Updated dependencies - - @backstage/frontend-plugin-api@0.6.0 - - @backstage/core-compat-api@0.2.0 - - @backstage/plugin-catalog-react@1.10.0 - - @backstage/core-components@0.14.0 - - @backstage/catalog-model@1.4.4 - - @backstage/core-plugin-api@1.9.0 - - @backstage/errors@1.2.3 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.15-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.14.0-next.2 - - @backstage/plugin-catalog-react@1.10.0-next.3 - - @backstage/catalog-model@1.4.4-next.0 - - @backstage/core-compat-api@0.2.0-next.3 - - @backstage/core-plugin-api@1.9.0-next.1 - - @backstage/errors@1.2.3 - - @backstage/frontend-plugin-api@0.6.0-next.3 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.15-next.2 - -### Patch Changes - -- 9aac2b0: Use `--cwd` as the first `yarn` argument -- 8fe56a8: Widen `@types/react` dependency range to include version 18. -- Updated dependencies - - @backstage/core-components@0.14.0-next.1 - - @backstage/core-plugin-api@1.9.0-next.1 - - @backstage/frontend-plugin-api@0.6.0-next.2 - - @backstage/plugin-catalog-react@1.10.0-next.2 - - @backstage/core-compat-api@0.2.0-next.2 - - @backstage/catalog-model@1.4.4-next.0 - - @backstage/errors@1.2.3 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.15-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/frontend-plugin-api@0.6.0-next.1 - - @backstage/core-compat-api@0.2.0-next.1 - - @backstage/core-components@0.14.0-next.0 - - @backstage/catalog-model@1.4.4-next.0 - - @backstage/core-plugin-api@1.8.3-next.0 - - @backstage/plugin-catalog-react@1.9.4-next.1 - - @backstage/errors@1.2.3 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.15-next.0 - -### Patch Changes - -- 995d280: Updated imports from named to default imports to help with the Material UI v4 to v5 migration -- Updated dependencies - - @backstage/core-compat-api@0.1.2-next.0 - - @backstage/plugin-catalog-react@1.9.4-next.0 - - @backstage/frontend-plugin-api@0.5.1-next.0 - - @backstage/core-components@0.13.10 - - @backstage/catalog-model@1.4.3 - - @backstage/core-plugin-api@1.8.2 - - @backstage/errors@1.2.3 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.14 - -### Patch Changes - -- 4016f21: Remove some unused dependencies -- 4f42918: Added alpha support for the New Frontend System (Declarative Integration) -- Updated dependencies - - @backstage/core-compat-api@0.1.1 - - @backstage/frontend-plugin-api@0.5.0 - - @backstage/core-components@0.13.10 - - @backstage/core-plugin-api@1.8.2 - - @backstage/plugin-catalog-react@1.9.3 - - @backstage/catalog-model@1.4.3 - - @backstage/errors@1.2.3 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.14-next.2 - -### Patch Changes - -- 4f42918: Added alpha support for the New Frontend System (Declarative Integration) -- Updated dependencies - - @backstage/core-compat-api@0.1.1-next.2 - - @backstage/frontend-plugin-api@0.4.1-next.2 - - @backstage/plugin-catalog-react@1.9.3-next.2 - -## 0.1.14-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/core-plugin-api@1.8.2-next.0 - - @backstage/core-components@0.13.10-next.1 - - @backstage/plugin-catalog-react@1.9.3-next.1 - - @backstage/catalog-model@1.4.3 - - @backstage/errors@1.2.3 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.14-next.0 - -### Patch Changes - -- 4016f21: Remove some unused dependencies -- Updated dependencies - - @backstage/core-components@0.13.10-next.0 - - @backstage/plugin-catalog-react@1.9.3-next.0 - - @backstage/catalog-model@1.4.3 - - @backstage/core-plugin-api@1.8.1 - - @backstage/errors@1.2.3 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.13 - -### Patch Changes - -- Updated dependencies - - @backstage/core-plugin-api@1.8.1 - - @backstage/plugin-catalog-react@1.9.2 - - @backstage/core-components@0.13.9 - - @backstage/theme@0.5.0 - - @backstage/catalog-model@1.4.3 - - @backstage/errors@1.2.3 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.13-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.13.9-next.3 - - @backstage/catalog-model@1.4.3 - - @backstage/core-plugin-api@1.8.1-next.1 - - @backstage/errors@1.2.3 - - @backstage/theme@0.5.0-next.1 - - @backstage/plugin-catalog-react@1.9.2-next.3 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.13-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/theme@0.5.0-next.1 - - @backstage/plugin-catalog-react@1.9.2-next.2 - - @backstage/catalog-model@1.4.3 - - @backstage/core-components@0.13.9-next.2 - - @backstage/core-plugin-api@1.8.1-next.1 - - @backstage/errors@1.2.3 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.13-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.13.9-next.1 - - @backstage/core-plugin-api@1.8.1-next.1 - - @backstage/plugin-catalog-react@1.9.2-next.1 - - @backstage/catalog-model@1.4.3 - - @backstage/errors@1.2.3 - - @backstage/theme@0.5.0-next.0 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.13-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/core-plugin-api@1.8.1-next.0 - - @backstage/plugin-catalog-react@1.9.2-next.0 - - @backstage/core-components@0.13.9-next.0 - - @backstage/theme@0.5.0-next.0 - - @backstage/catalog-model@1.4.3 - - @backstage/errors@1.2.3 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.11 - -### Patch Changes - -- 6c2b872153: Add official support for React 18. -- Updated dependencies - - @backstage/plugin-catalog-react@1.9.0 - - @backstage/core-components@0.13.8 - - @backstage/core-plugin-api@1.8.0 - - @backstage/theme@0.4.4 - - @backstage/catalog-model@1.4.3 - - @backstage/errors@1.2.3 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.11-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.13.8-next.2 - - @backstage/plugin-catalog-react@1.9.0-next.2 - -## 0.1.11-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.9.0-next.1 - - @backstage/core-components@0.13.8-next.1 - - @backstage/catalog-model@1.4.3 - - @backstage/core-plugin-api@1.8.0-next.0 - - @backstage/errors@1.2.3 - - @backstage/theme@0.4.4-next.0 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.11-next.0 - -### Patch Changes - -- 6c2b872153: Add official support for React 18. -- Updated dependencies - - @backstage/core-components@0.13.7-next.0 - - @backstage/plugin-catalog-react@1.9.0-next.0 - - @backstage/core-plugin-api@1.8.0-next.0 - - @backstage/theme@0.4.4-next.0 - - @backstage/catalog-model@1.4.3 - - @backstage/errors@1.2.3 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.10 - -### Patch Changes - -- 9a1fce352e: Updated dependency `@testing-library/jest-dom` to `^6.0.0`. -- f95af4e540: Updated dependency `@testing-library/dom` to `^9.0.0`. -- Updated dependencies - - @backstage/plugin-catalog-react@1.8.5 - - @backstage/core-plugin-api@1.7.0 - - @backstage/core-components@0.13.6 - - @backstage/catalog-model@1.4.3 - - @backstage/errors@1.2.3 - - @backstage/theme@0.4.3 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.10-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.13.6-next.2 - - @backstage/core-plugin-api@1.7.0-next.1 - - @backstage/catalog-model@1.4.3-next.0 - - @backstage/plugin-catalog-react@1.8.5-next.2 - - @backstage/errors@1.2.3-next.0 - - @backstage/theme@0.4.3-next.0 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.10-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.13.6-next.1 - - @backstage/plugin-catalog-react@1.8.5-next.1 - - @backstage/core-plugin-api@1.7.0-next.0 - - @backstage/catalog-model@1.4.2 - - @backstage/errors@1.2.2 - - @backstage/theme@0.4.2 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.10-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.8.5-next.0 - - @backstage/core-plugin-api@1.7.0-next.0 - - @backstage/core-components@0.13.6-next.0 - - @backstage/catalog-model@1.4.2 - - @backstage/errors@1.2.2 - - @backstage/theme@0.4.2 - - @backstage/plugin-linguist-common@0.1.2 - -## 0.1.9 - -### Patch Changes - -- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency -- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. -- 8cec7664e146: Removed `@types/node` dependency -- Updated dependencies - - @backstage/plugin-catalog-react@1.8.4 - - @backstage/core-components@0.13.5 - - @backstage/catalog-model@1.4.2 - - @backstage/core-plugin-api@1.6.0 - - @backstage/errors@1.2.2 - - @backstage/plugin-linguist-common@0.1.2 - - @backstage/theme@0.4.2 - -## 0.1.9-next.3 - -### Patch Changes - -- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. -- Updated dependencies - - @backstage/catalog-model@1.4.2-next.2 - - @backstage/core-components@0.13.5-next.3 - - @backstage/core-plugin-api@1.6.0-next.3 - - @backstage/errors@1.2.2-next.0 - - @backstage/plugin-catalog-react@1.8.4-next.3 - - @backstage/plugin-linguist-common@0.1.2-next.0 - - @backstage/theme@0.4.2-next.0 - -## 0.1.9-next.2 - -### Patch Changes - -- 8cec7664e146: Removed `@types/node` dependency -- Updated dependencies - - @backstage/core-components@0.13.5-next.2 - - @backstage/core-plugin-api@1.6.0-next.2 - - @backstage/plugin-catalog-react@1.8.4-next.2 - - @backstage/catalog-model@1.4.2-next.1 - - @backstage/errors@1.2.1 - - @backstage/theme@0.4.1 - - @backstage/plugin-linguist-common@0.1.1 - -## 0.1.9-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.8.4-next.1 - - @backstage/core-components@0.13.5-next.1 - - @backstage/catalog-model@1.4.2-next.0 - - @backstage/core-plugin-api@1.6.0-next.1 - - @backstage/errors@1.2.1 - - @backstage/theme@0.4.1 - - @backstage/plugin-linguist-common@0.1.1 - -## 0.1.8-next.0 - -### Patch Changes - -- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency -- Updated dependencies - - @backstage/core-plugin-api@1.6.0-next.0 - - @backstage/core-components@0.13.5-next.0 - - @backstage/catalog-model@1.4.1 - - @backstage/errors@1.2.1 - - @backstage/theme@0.4.1 - - @backstage/plugin-catalog-react@1.8.3-next.0 - - @backstage/plugin-linguist-common@0.1.1 - -## 0.1.6 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-linguist-common@0.1.1 - - @backstage/core-components@0.13.4 - - @backstage/plugin-catalog-react@1.8.1 - - @backstage/core-plugin-api@1.5.3 - - @backstage/catalog-model@1.4.1 - - @backstage/errors@1.2.1 - - @backstage/theme@0.4.1 - -## 0.1.6-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-linguist-common@0.1.1-next.1 - - @backstage/plugin-catalog-react@1.8.1-next.1 - -## 0.1.6-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-linguist-common@0.1.1-next.0 - - @backstage/catalog-model@1.4.1 - - @backstage/core-components@0.13.4-next.0 - - @backstage/core-plugin-api@1.5.3 - - @backstage/errors@1.2.1 - - @backstage/theme@0.4.1 - - @backstage/plugin-catalog-react@1.8.1-next.0 - -## 0.1.6-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.13.4-next.0 - - @backstage/core-plugin-api@1.5.3 - - @backstage/plugin-catalog-react@1.8.1-next.0 - - @backstage/catalog-model@1.4.1 - - @backstage/errors@1.2.1 - - @backstage/theme@0.4.1 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.1.5 - -### Patch Changes - -- Updated dependencies - - @backstage/theme@0.4.1 - - @backstage/errors@1.2.1 - - @backstage/plugin-catalog-react@1.8.0 - - @backstage/core-components@0.13.3 - - @backstage/core-plugin-api@1.5.3 - - @backstage/catalog-model@1.4.1 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.1.5-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.8.0-next.2 - - @backstage/theme@0.4.1-next.1 - - @backstage/core-plugin-api@1.5.3-next.1 - - @backstage/core-components@0.13.3-next.2 - - @backstage/catalog-model@1.4.1-next.0 - - @backstage/errors@1.2.1-next.0 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.1.5-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/theme@0.4.1-next.0 - - @backstage/core-components@0.13.3-next.1 - - @backstage/core-plugin-api@1.5.3-next.0 - - @backstage/plugin-catalog-react@1.7.1-next.1 - -## 0.1.5-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/errors@1.2.1-next.0 - - @backstage/core-components@0.13.3-next.0 - - @backstage/catalog-model@1.4.1-next.0 - - @backstage/core-plugin-api@1.5.2 - - @backstage/theme@0.4.0 - - @backstage/plugin-catalog-react@1.7.1-next.0 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.1.4 - -### Patch Changes - -- Updated dependencies - - @backstage/core-plugin-api@1.5.2 - - @backstage/core-components@0.13.2 - - @backstage/theme@0.4.0 - - @backstage/plugin-catalog-react@1.7.0 - - @backstage/catalog-model@1.4.0 - - @backstage/errors@1.2.0 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.1.4-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.13.2-next.3 - - @backstage/catalog-model@1.4.0-next.1 - - @backstage/core-plugin-api@1.5.2-next.0 - - @backstage/errors@1.2.0-next.0 - - @backstage/theme@0.4.0-next.1 - - @backstage/plugin-catalog-react@1.7.0-next.3 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.1.4-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/theme@0.4.0-next.1 - - @backstage/plugin-catalog-react@1.7.0-next.2 - - @backstage/core-components@0.13.2-next.2 - - @backstage/core-plugin-api@1.5.2-next.0 - -## 0.1.4-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/errors@1.2.0-next.0 - - @backstage/core-components@0.13.2-next.1 - - @backstage/plugin-catalog-react@1.7.0-next.1 - - @backstage/catalog-model@1.4.0-next.0 - - @backstage/core-plugin-api@1.5.2-next.0 - - @backstage/theme@0.4.0-next.0 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.1.4-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.7.0-next.0 - - @backstage/theme@0.4.0-next.0 - - @backstage/core-components@0.13.2-next.0 - - @backstage/core-plugin-api@1.5.1 - - @backstage/catalog-model@1.3.0 - - @backstage/errors@1.1.5 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.1.3 - -### Patch Changes - -- Updated dependencies - - @backstage/theme@0.3.0 - - @backstage/plugin-catalog-react@1.6.0 - - @backstage/core-components@0.13.1 - - @backstage/catalog-model@1.3.0 - - @backstage/core-plugin-api@1.5.1 - - @backstage/errors@1.1.5 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.1.3-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/theme@0.3.0-next.0 - - @backstage/core-components@0.13.1-next.1 - - @backstage/plugin-catalog-react@1.6.0-next.2 - - @backstage/core-plugin-api@1.5.1 - -## 0.1.3-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.13.1-next.0 - - @backstage/core-plugin-api@1.5.1 - - @backstage/plugin-catalog-react@1.6.0-next.1 - -## 0.1.3-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.6.0-next.0 - - @backstage/core-components@0.13.0 - - @backstage/core-plugin-api@1.5.1 - - @backstage/catalog-model@1.3.0 - - @backstage/errors@1.1.5 - - @backstage/theme@0.2.19 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.1.2 - -### Patch Changes - -- 29ba8267d69: Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`. -- e0c6e8b9c3c: Update peer dependencies -- Updated dependencies - - @backstage/core-components@0.13.0 - - @backstage/plugin-catalog-react@1.5.0 - - @backstage/theme@0.2.19 - - @backstage/core-plugin-api@1.5.1 - - @backstage/catalog-model@1.3.0 - - @backstage/errors@1.1.5 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.1.2-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.5.0-next.3 - - @backstage/catalog-model@1.3.0-next.0 - - @backstage/core-components@0.13.0-next.3 - - @backstage/core-plugin-api@1.5.1-next.1 - - @backstage/errors@1.1.5 - - @backstage/theme@0.2.19-next.0 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.1.2-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.12.6-next.2 - - @backstage/plugin-catalog-react@1.4.1-next.2 - - @backstage/core-plugin-api@1.5.1-next.1 - - @backstage/catalog-model@1.2.1 - - @backstage/errors@1.1.5 - - @backstage/theme@0.2.19-next.0 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.1.2-next.1 - -### Patch Changes - -- 29ba8267d69: Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`. -- e0c6e8b9c3c: Update peer dependencies -- Updated dependencies - - @backstage/core-components@0.12.6-next.1 - - @backstage/core-plugin-api@1.5.1-next.0 - - @backstage/plugin-catalog-react@1.4.1-next.1 - - @backstage/theme@0.2.19-next.0 - - @backstage/catalog-model@1.2.1 - - @backstage/errors@1.1.5 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.1.2-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.12.6-next.0 - - @backstage/plugin-catalog-react@1.4.1-next.0 - - @backstage/core-plugin-api@1.5.0 - - @backstage/catalog-model@1.2.1 - - @backstage/errors@1.1.5 - - @backstage/theme@0.2.18 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.1.1 - -### Patch Changes - -- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. -- ab997ce243f: Updated `README.md` to removed images with refresh button as this feature was not implemented in the current version -- Updated dependencies - - @backstage/core-components@0.12.5 - - @backstage/plugin-catalog-react@1.4.0 - - @backstage/errors@1.1.5 - - @backstage/core-plugin-api@1.5.0 - - @backstage/catalog-model@1.2.1 - - @backstage/theme@0.2.18 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.1.1-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.12.5-next.2 - - @backstage/plugin-catalog-react@1.4.0-next.2 - - @backstage/core-plugin-api@1.5.0-next.2 - -## 0.1.1-next.1 - -### Patch Changes - -- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. -- ab997ce243f: Updated `README.md` to removed images with refresh button as this feature was not implemented in the current version -- Updated dependencies - - @backstage/core-components@0.12.5-next.1 - - @backstage/errors@1.1.5-next.0 - - @backstage/core-plugin-api@1.4.1-next.1 - - @backstage/theme@0.2.18-next.0 - - @backstage/plugin-catalog-react@1.4.0-next.1 - - @backstage/catalog-model@1.2.1-next.1 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.1.1-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.4.0-next.0 - - @backstage/core-plugin-api@1.4.1-next.0 - - @backstage/catalog-model@1.2.1-next.0 - - @backstage/core-components@0.12.5-next.0 - - @backstage/errors@1.1.4 - - @backstage/theme@0.2.17 - - @backstage/plugin-linguist-common@0.1.0 - -## 0.1.0 - -### Minor Changes - -- 75cfee5688: Introduced the Linguist plugin, checkout the plugin's `README.md` for more details! - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.12.4 - - @backstage/catalog-model@1.2.0 - - @backstage/theme@0.2.17 - - @backstage/core-plugin-api@1.4.0 - - @backstage/plugin-catalog-react@1.3.0 - - @backstage/plugin-linguist-common@0.1.0 - - @backstage/errors@1.1.4 diff --git a/plugins/linguist/README.md b/plugins/linguist/README.md deleted file mode 100644 index 86ef14e988..0000000000 --- a/plugins/linguist/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Deprecated - -This package has been moved to the [backstage-community/plugins](https://github.com/backstage/community-plugins) repository. Migrate to using `@backstage-community/plugin-linguist` instead. diff --git a/plugins/linguist/api-report-alpha.md b/plugins/linguist/api-report-alpha.md deleted file mode 100644 index 07d2244e30..0000000000 --- a/plugins/linguist/api-report-alpha.md +++ /dev/null @@ -1,23 +0,0 @@ -## API Report File for "@backstage/plugin-linguist" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts -import { BackstagePlugin } from '@backstage/frontend-plugin-api'; -import { TranslationRef } from '@backstage/core-plugin-api/alpha'; - -// @alpha (undocumented) -const _default: BackstagePlugin<{}, {}>; -export default _default; - -// @alpha (undocumented) -export const linguistTranslationRef: TranslationRef< - 'linguist', - { - readonly 'entityCard.title': 'Languages'; - readonly 'entityCard.noData': 'There is currently no language data for this entity.'; - } ->; - -// (No @packageDocumentation comment for this package) -``` diff --git a/plugins/linguist/api-report.md b/plugins/linguist/api-report.md deleted file mode 100644 index 71e2460088..0000000000 --- a/plugins/linguist/api-report.md +++ /dev/null @@ -1,22 +0,0 @@ -## API Report File for "@backstage/plugin-linguist" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts -/// - -import { BackstagePlugin } from '@backstage/core-plugin-api'; -import { Entity } from '@backstage/catalog-model'; -import { JSX as JSX_2 } from 'react'; - -// @public (undocumented) -export const EntityLinguistCard: () => JSX_2.Element; - -// @public (undocumented) -export const isLinguistAvailable: (entity: Entity) => boolean; - -// @public (undocumented) -export const linguistPlugin: BackstagePlugin<{}, {}>; - -// (No @packageDocumentation comment for this package) -``` diff --git a/plugins/linguist/catalog-info.yaml b/plugins/linguist/catalog-info.yaml deleted file mode 100644 index aca70b7570..0000000000 --- a/plugins/linguist/catalog-info.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: backstage.io/v1alpha1 -kind: Component -metadata: - name: backstage-plugin-linguist - title: '@backstage/plugin-linguist' -spec: - lifecycle: experimental - type: backstage-frontend-plugin - owner: awanlin diff --git a/plugins/linguist/dev/index.tsx b/plugins/linguist/dev/index.tsx deleted file mode 100644 index bb6fb64b52..0000000000 --- a/plugins/linguist/dev/index.tsx +++ /dev/null @@ -1,27 +0,0 @@ -/* - * 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 React from 'react'; -import { createDevApp } from '@backstage/dev-utils'; -import { linguistPlugin, EntityLinguistCard } from '../src/plugin'; - -createDevApp() - .registerPlugin(linguistPlugin) - .addPage({ - element: , - title: 'Root Page', - path: '/linguist', - }) - .render(); diff --git a/plugins/linguist/docs/linguist-no-data.png b/plugins/linguist/docs/linguist-no-data.png deleted file mode 100644 index 07661fe02d0d31cf193ff10e51b4535fd1da0651..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12455 zcmeHtby$?$w>GJi(j8&|5<{bi#2_FN0@B^x1A~;L0s;aCHMB@bhm>>;NSB19goKoU zbbWhXU*C5;=luTp{yW!o^m68Lp1t>4d+)W@UiZCrsEU&8B?3AE3=E7*au1|cF)*+t z!E-6z1@QTdymbcy1Jl?>N=ijeN{U&<#mUmf-U0*T<|~JnVmwkXiZ;Jdh3}d8q4$Y` zFPn1M6kTqW#wU|{8Wy**SD`EC?d_^Znuxc^%5}?R3%8i&88P%4-}C1|Jj`5zqaPvT zbLV{>J6&&Fm6Vv?!|bvUx!8mEdlTsB_j-GHJPi5-=ik1Pq!SdgyByT=X0W+Zv!POt zLe|ME$)G(h+(G`}-j``k`)+YuQNQCnLp83HVHt@G^{FzKw1c3QygNg)ZYEJIviO@K zNjJA%wG5D@QhHlv-D@6gF7Q$f$Cn^DPN(!u4;;#&JYBu8t!HvK9=9}$0 zX%&1jV}Dr3@;Sm7#wvZ`jSyF?+{+tmLsE0`8P5rojnjt0m9>#PnIbypy~S%5m($KE zZFekqsxM~i^~1FGs`uVnkSi4`_6+*I)|mcYs^DWAI@O|bZal#=^>sYp-gLzbv3-s6 z&Ew74$paiFs2L)4yG#!(xv7P=oaMuZ7#!dk4+9I63LHAvPE|e?4Phu!3)} zQ?G+DE`o0|@J}TT>-Sr1$u#WW&lshshLUPha&q8X&CJEZ!qL^*37#q0(}{tBC1#_p z4cC6CC}QU1z-?mgWNN|f;oywwf+6Z50v;VK;3mu-4)%_&A|7Jb{%Roto>4#ZTx0&L z3EWQXn)X8#W+^8Z3+7wgyxhFk#0i+0nMGa9Ek#tN@BiH${7>wfH5~3N!o%b4?#}Hl z!0qH>#lv^!&K(|Jeja{)2xtLu^>l=rct9Loum2k4_c+oPu4XPa&TtziM`qNxCZt3=A#>IcZ6C56tx`+$x6QDgUiEFLB)6@sL7Qqklk=Z(l!;wc5y*p80 z?ZtlwqfjwUBICuQ%MP0e*Z3^~_4+CECVDRlnrs}Rz_y&ZJyS|FA&tzRywQ8%wy|SA zO@rlD)oG(?j8csWt=E52?dY?DN{;&Xsn6@^3PJ<8NtcK7v|5&OIPtDwaGW_)JxvcT zn36=-Z=C&QAd_KuR|Lc37m_4Rz3(5ro8vp)Tcwl){wKmu@9z#FnI0@_?4l zRC;+RTUqLrMz&E2+n*CO^xtr9E!Cs{sv-imZ;%o}tBJO&0eg5f zIOVc^KIl822FJP}naRm7kpHg@`eUt=^5WS>r5tmhTjmN7B(G&|sf|9R@$1GUpP9t= z(Ty%(5T6DortnjD@jqq_1}~FsWPUH^wULJ|D3hEQkHg>roL7!(o6PV}T^2Z`{LD5P;5M0JG_>XytfqAYExEi4gx|s}3-RRsxZRqi4 zLu#sTdMGQwkfOlDvuRxPb}DHCIMoomqq%UN=EeZ*9Xnm`_3{>kRSKfP{SWh{SSG@( zX>kkAZC6KMcqUG;NM_+}FWAx7(+X_I|IoDG!7NbZ-U5=^h^TVvv7X0f-F|bNkuNQ4 zipLx;P%bD&Qi_=u5J|4Ge@yEn&zCdqJ@~M5NPvXk{>`7i> zwXHsP$_J;JdXt@=+fJ~_KJjC&N#Eo3!)mt?9X7=~-=Yt_spvkom6>I#;_pv;J9%t( zu(i-T)sikI*cC1ZbTGP4l8OVJs#Z+HAyicQ&P`={XPxDuTdm{)t1Pf&1@4dL@qTBA zI}TxlEy0%v_a|MI%Vx(~LWqeEoKJQ~jU-|fVBT?P`?stVU?>%Gx!`jr2IUIr_507( zc6g`YL&M`42CMJ6cs_LVAM(*5XlB7S64$I(=v8gjA8()LQO9bVhC1(ku?oq_P7(2i zPkSx}y^9hT;pVAcPB)1X+k4)Au+@G=Z%t&v{zDKUPc3gZUpoV2#5JE>N%-muI-y*o z7Z&y2tScGjm<+W6MO^rj`Cbi$dMohYY{P!8E2SK#L2x@yVJWhR_C?bsnxL4 zd)Fkdpdu{5y1uj+3iUiYTnYirs*6Wt&FXP1aeSbgi9HVch=$%>DfXI{_4?xt zPYl6nkNKd?SX~Z#U^OP+VzhdT-h`dmWGBZq@Ng5+3En(8+ixJofvy=Ts()7odpMU% zL&4xa34>sz(OM<(Z78U`3QVE8TfXz~!>C6i=EX8Rf9p$$Cc(6(j*+6?__Id9sj4WFW>9~1%}Wa5)y~1+29hHNVgf^V+XFpK8f?BN>()W zs}0iNk|b(&Gk)i%cP6L3HyI0Sw>zPn7a_uB-5JuO<+>}0PW7P%t;_PVD$stZ+ZEB) zuV%epJdil~Atem#X-L+j{%|pTs-DSf`Ry3QaX#X9WP!!u1;*n3HKD9RS9U`9@VmU3 z7Gep8Pn%eTT>Z9&MOAZQV?L2S*{Qxq&QorqNN!k^#F>Zi&wi<)t1acDhV;vevgvnc z@`~yc{DS96Wf@47L{>7K!O)9SU#(55k2h*|*7eciblP3qGrxXC_r>%8*C8+0gV~TJ zZ{Ed>c-GV>+b0fs1;iJxJaLY9pZ1)uV0aql^L_CCZRlPmJ#!Owj~zRsYd4=~qcrvH z=^;o_forDEs*l4SofB9$X!zyO5}5^uKz!Ecn>HWQ?;7zvcyZ9qn&ksbL-rgAYBt9duPH_{SrL z>lD-{vj2wB07t5u1|-rJzFm;Y7xwB07m1k|+DB?n_a;idr3(*0^(w-7>OI1vsCCR= zQEeiu1DKZ!DyKU~$+gv;WZea-XAS&LcMl)08(8nrg?k!2{$jC%ar0YzL+$I6@fd+u#9KT= z7$4(-_^tIm+kRZ6C>1Rx_miR|iywS_Dm)BNSVU|XcJVYkiMLAeoa?q#^!90^wJNhw z6QjMSM^F9qdRt@vk-7mw+0$lK*yhC}7=0W4uzZi98H}pI6sj&NTTrX1jNhy1GrSts zZj4xMdS!!D)B1Rk$%DB+>?hEvtwi0v-QF!b#mhD+=V=F%BHGCYuY|4yrr8yKWIa!z zug>P%FkeJi^)lvJJ?@gQb}<>zvFh2+7!KvT2j7xksoAU#pXqorO>Gn|kjK{>GLrno zDphPIqgsa52RH`RPNzBELL8qM`#?m&*gB+O$@>|ewQ5?$?ucH69T?r z(zlyFBVUG+Y=FSjXb;aBe%`@K6sVi|6Z;=04&bI(=KIjX7sEeQI)3z)lC?)MnAGT} z4w1ihyZa{G+_YACi%=19ErG{?1%vth7Z87%wTyf;cA}q{So3A_*gagu`)ZqMS@bF= zN9`KPthZ16c4F=Jw`{mvUJTv{m7&M%$vfTo#P|zOdW1$_NVGF~+fT+ix;_cukm#0< zBXcd=@qHI@OFnNKpMIP2536~IC6>kVd?kNW*RJ3eZG7ZMnxFmaVU2-Qcx@ZJ8joQ| zYoFx@7A4z%T%|k$2Nd5AG07Xcs<*%?GFHdQm|AFt0~-$I_CmtH23%}gDW}%6FLCY@ z+b{cM2de@4@&vG0D_n>Y-F`qL>};H(RlUV`KZM(MIP}Xlh=?C(^83kTc&j(6SKBtv zO!n?#y%SUlL(D#S!e=k9nBhDZ%GQ?lawK~x)vq48Pq}5FgdP~Z0-;g(f!~qFVOF{< z)>F(sn3-25DxGM=pLmGkm^~ZRrsp`eAN@p=rhE96P!iwc{Yf_ado_&KxTmTs607+i z?oY%xT5{$W-&?!a9pEj2D;abtbTfDAdb zNRqX2u;)U!$qKht z(nB7f5S32s54EH>1_Cw24zV#AB|oQlZy;_(6_q*i?S;G(!z$ z2MMZ)sMti)c5}Zc4Ka;Mba8!XP5s_@lks+4JxG&E^sYhRiu6if)so_`IxOX( z<*bbCjoqIF@Bd&-G0XknGCg=fk}-5-q=e>TOPnvi*sahK2uSlhm#2>XBCMmtkF3W) zUbQWy@3T8>63P<$X~z8<*1SiU$M@cY! zkggQ2S9uK1UqWC_kHZTCYBs9#FjY8&(S`@GQ7`a2mt$K?5;y=4_va|wudA4DKl9n2 zs+@YmOA$5E%|HK!rm|(twVZ5fC{pD6`{J{s)zPCdH?-gvt&}zp%ltI$LRdUE4D66A zji9v(4Zrz=c>B_hW(L=8Qftfv*WNqy!m3M7ogPfO0ne2R1B@Knhv&JUTd=L}2lLLUFk=Ft<=qmL`13_x`8yV=jTTlX^W!HglLRZNeFbnV5 zZ@Hrr69J_J0KAnibXTIQB*+2~3`OEyw8JtDs)I`u*s1HXsP}JJz{E`eG=yzfPxAjQ z=U=Pxzh^n2sb2iz9zVW%-EyTzHxiY!E?m|m=jPyE9W4^U{?0qYZ$8ud!I4{h`uTASk$M@(&)PlN)%_9+}`dx=Q^o zfgmY;$3M6c3u@p=-uMZA=qg!10D`V^|FJFsrG&tf>Tr4*&{Yz=0X&H$j{Xnbzo0zH zFmTZb-IM50p7g(JIYm^zhFtN*1NhEImTA!JpI~7|u^h{64Uz-G)8l=oou$_b-1t_> zZkpOAL6mJCqz2_pE?p4n-aAW4g(3z~clwgur)dFHPZpKX(uc`t8wcQS?~B=(=tJIF zb{W5tp~8u}g2=p93T4<$=xb8wxXC`No&)%2WP_`6ntqmscwG!=thPBeJX3?GQ zp+d9aam2-&Txy${xokCr)rUn@c2l7$q z$OHiC2!mqZt#G4f-kWum$gA}y+g(3GBu=jOQ-+Ns001sZ#3&-@DB!a2=|`8*8NcZH z$r{TROdN=un7i?XzWSZM`;^<^cfdh$oSZC4 z5Ca0rNOT{C%7clor1%-y1&BH;VKohF>OoK$MnIut27nhri@PAjv@Kb^8p1%PB)0px zDzZ?)?`$Wvg)Q|7+1|KaQ8DNdWLdNY_$mCd?b;vBge5UnfC#%RGXnrV&*DXel(Ttl zF<)%EwY(vt^P^GcF_RFDqR7p5_;lG20Fg9$L~(#i;&uMo_#<25l>G_NY-PUM@MG}9 zTVHN?nJL+g0PX^@slar8*yk6#TGSwJU)*#dV8g^-YV^HnbFw#Ex%TVZqJZ_NtDAghQo6iNU*l?z=|LO}Hj?yCZ~vz4H@%tDxa#+hrGL@HiBezG~ERPd?by z*V+;VVOzO2wJMGmHTC)S$#%c<;~6tMqHjO)j7~WWy~isHjzt}I0O{CjCVqA>AJ9P0 zkgAy-jY_Pn<=mB+s{7Ml4+7_=sYLnAJclo_`;5>2m_?Mg6<`}Kp_0<^+C@&!1@W|# zSY6v3D5v|DA>Ghv+bLAxPN=Jy3?NnBVEGx@8vI4i`0gamv~EYxpa1MbQT%n?n~A>@ z8(o5*2h7jUwk|R_L$!f0Gu%=X6$w}^LLBiM9LqSA>h?J=)O2dsD<(|c$pQ&EuyCOH z?_BNxj|tYXM6mQ<3c>IvU|-Enu+1$7#9F0Jhv(t9IH}xzRh^9RF^;@^GHi;#n{Ay* z9&@3PAi~XFvHi&(?Gk5vTvcBKw~~^M$IPO7QpME}H;UAsg|DC(5Y7qp&v>!#_3MB! znQS4cosQ@}QgOI3*k#6O65!~`80jvd7MvG26jJ_fm(S5pc1wun`;`h5y|}d6aSpbY zX%WP=Ck8MR#U%^9HdmFE8_QP@4%eOh=$~p~CD^9Um4tUik1E|=r^rfj>7=1i!^|Yp zCmJu#eEmtAhvPK}6|%K)s^8wslVY5G@Dzj|q>1C;{Y zvGZ)Gh{5A)z`Nuds|l(dZC}+(<>k+GG-+R~mNtEX8SE{Ty~ZV{+)h-bVo)y)(_rz& z((mBth8?eUxCHHH0K8N28kaa`4Ie(vQg7J=wFrk)SeFzYu;xXBk#zNA#1IAM5Vn}L z4ySs#kzBP74#~sgxqF(3B6EmR4A)nV!b0cXd>7hL5SrBZik@C1b}V_Q`8L-)rm~7V zuTitKX(EP;_fy~0n$XC6m)wW!uQB;7H~Q45fTEqcPogaL)a!yQZaHSW#)ZZJVsGJ? zg8KU%o^LP9OEpSk%b$$qzcxewvPd_H^ZZA4kSQ(9iRlm)8?%VSsrD0Fb#0d-M zb}f|0cHDFbWw|cy&4;*T)rPa@F}FLEYCf$>m{*VUx#h^}_(tQ|yw4|CX>7=xiRqb= z#Oco}Zo9hY6IRN5I}Qg^-K-ZwCrU~Y-nYGtRXVUXU0;NBGSi_^2$_jrTL8N>Cy zb2MY7VC}6`y<_Wh(ydLXO9xhTdyXv?!qX!fT4#o4|brC|Ymx)KPZ%K>gy=rgc5=iaE6wz?f+D>ANA3>-Mw+C?%H>KHcQmTh!ay$@ zt{_jeVO8vl3Ia)SBbRhX!a`$H74uJEjr<#suKmNM>7Drh0 z%KYIQ{WAHQ%#YU6HIf22-1KZ6iuvXp#&a88P20!;B*8BUl>Q+V6t=;s6Rt^=l{-5P zDhpM%fGTy|B8@4KV@obWR`b=py-PKB@q{94ORkaU_wbmom*Gx6^ zXGZwdc+_%O`&oZn9pi`}KWooenu2e+e@?5O$ZW&Vy$Z?|-N zJV#nR&E$i+2RY@U84WfzHTMl+*HyA7cnt2Wh<9v~PCbA4H)P?hhDH$w-tTki68d?{ z#>^hM^FZ%MvuRep@)sr4`)NicGeghLMTfHjbrf?-74onk zS99@DUZ?I#gY zQK59jW2QDA^Qk;jnb;D>p5de9T z%8YNJ-u2TnF_GON?Y}sVG$Jg>v0BX4b`8%38xaAwtqh@4k}=*-4dpyy848TbE*CG+ zMQ^s$i@vp@Tl?;4sgeD{38BH!GuB4_n4^j)A)C_xwpUW-L~uE`#)a=evQDwE6+vVe zrG4Oy>d%4+B6D=BVpd)R549L{7vejLys(12qL7bqUY22~`?0fCD2pGOCuygr%#+5y zjzbkwFF@Dc=&FAIlIozk-}Sv#y;4;5anA5f#+n0*WO&~7n{)NuZ4s^8ma2iK{w*&o z7NS<(sin)j_%f?%o29Q;6AbE|5|1w_wmY`vrL4-gJFUia+_Nq*bqO||lf)$_%jh5v zOLbf1C%zSb>Gk&4lkU&5T~42SZy2ANt*GvfILdZfc$GsFzSo=AU< ztQ{M_rr9mH^j8_1Mh{2+3eEs!L>Rf6kQ&V77AqEQo1_XXC&s!wt&3oYm^@nL<6_L0 z5AhBKDcKe3FP3d(EaE#M1ynCq(stQ#MUk#*TiaHA4h|o$7xFPCQjuWETlS`_8ggz?h|tq8SxKxu@1zz8GEvaFksq%S z?)U(HeFD^@?JP{n+{$Qv;G}j6LAY*D!PSypCtb?JjvaV>W`jGmiI=f_8QJal;^EbU zg3Fe)dd=$H3kWJ|j<<>-DXO-0%xP~eqM#wGCWtR>&fijQq*;o6@S5!rTt?DPCa`No zb_kI;58Z1#RWd~E=6e*4&Le49EZ61(FbhFS&2POLzW}u%j&0-CcM@KST(YyTLz0&?g)*@<5-)YHdmQIDWSl? zwom~QIf;$*ud0ICjka%Ig*=MBR1nE-K_1bHARF@jn_#6G#YJsH!7_k+VVHPBq5{mR zvE&?2a5xHBu$U^Wa?R?GgGxk+pjN!TVm1@@9FEn^kL14L^OCdh4s%1Kb7ZoQgcSoD ztFG>S3x%jHt8P6U;`=aT@in&#gce-q2PULj;v0u(Ig1^c#I)~;*_aU9_=m3fieB+K}4Wk&KD&tdwY zB5u;xlu*K|kUN$l#O-!j`n2zm?xW5PE)C=l$ejCScr(3fm%TcxII4Xt1(3sT1}g^+ zb%QPsz9ri&y~Xe}*L7jN|8+lO;F*w_=>a2)v7O+6YIh5suG>dTU*bctGzNSZTb8{J z%ewF@uvF(6m-Fr7%vUf)S99`;AB?J#=h2S}K9BFh40WRpCz{~n?4;4FLc(+u5&I4X@_-^BrpzY>^F5+}cjb z9*4imW3tldkdA&AX&yFr$9kruv1%))M>+)&X-habYr2A z@ML6dWqJ2nBu?$*dBn!V2rTjRMXieEiErhe|GT5HlPUAmxeTh|33!{gE+zgEew%J0 zvQVIRmG2jyw(N-cedlL1Gu8X-GhR(x$*Bkl?i7h0YZ)zQmY-!3e$&+0YdmY~lG%>C zpnRQqt^aLMAT)R+Fj5{zr0o7+LVT8sC9A0JGi!+Xi!iwWU98D$oO1ZgJDG%y_}!C> zDy!OsYJZV|X)mxMz%`{*#=;jtg15dQws_#wb2+yS3fi(Tp1Y)*c6g+%g{zn$Uyoo^ z>+x@dr@g;UZjfbdV5&$mC2E5^rwI7|dj%wb?(&N-IE>?&fdv-u}O)|NkrCa6uB>vkA+-B4n%1X4TSyPQLnM zMG$6avmm*58Q%6VKgV`1E~-DuO)>izflk}r?9aq%<%qz6niqmbPa|$md&~mLh4{K` z*QTeJg2y>aDByuWH%|;(Zr_FZavaeFSu7fcRt7B`g5@m z^x1tTW2U)Aa_wLRbqx}eqseG#;HIr&yK;Tz=u_J$-b^{p-MyrVMc`(FzHmNTCWS zdd_mOIP{6bQKf`R>Hu1_3qH_*LU7adySzhRCVI_c3RDO_uge%;_@lD*A5=ZLGL#;O VH!Cm=N8Lh~lTnf`yk{Kv{{SBRgns}4 diff --git a/plugins/linguist/docs/linguist-with-data.png b/plugins/linguist/docs/linguist-with-data.png deleted file mode 100644 index a3b4e4fde7fa9a38fb1f4e810a14e800c31b0837..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15731 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 diff --git a/plugins/linguist/knip-report.md b/plugins/linguist/knip-report.md deleted file mode 100644 index 2661c35327..0000000000 --- a/plugins/linguist/knip-report.md +++ /dev/null @@ -1,2 +0,0 @@ -# Knip report - diff --git a/plugins/linguist/package.json b/plugins/linguist/package.json deleted file mode 100644 index 50bd185aff..0000000000 --- a/plugins/linguist/package.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "name": "@backstage/plugin-linguist", - "version": "0.1.19", - "backstage": { - "role": "frontend-plugin", - "moved": "@backstage-community/plugin-linguist" - }, - "publishConfig": { - "access": "public" - }, - "homepage": "https://backstage.io", - "repository": { - "type": "git", - "url": "https://github.com/backstage/backstage", - "directory": "plugins/linguist" - }, - "license": "Apache-2.0", - "sideEffects": false, - "exports": { - ".": "./src/index.ts", - "./alpha": "./src/alpha.ts", - "./package.json": "./package.json" - }, - "main": "src/index.ts", - "types": "src/index.ts", - "typesVersions": { - "*": { - "alpha": [ - "src/alpha.ts" - ], - "package.json": [ - "package.json" - ] - } - }, - "files": [ - "dist" - ], - "scripts": { - "build": "backstage-cli package build", - "clean": "backstage-cli package clean", - "lint": "backstage-cli package lint", - "prepack": "backstage-cli package prepack", - "postpack": "backstage-cli package postpack", - "start": "backstage-cli package start", - "test": "backstage-cli package test" - }, - "dependencies": { - "@backstage/catalog-model": "workspace:^", - "@backstage/core-compat-api": "workspace:^", - "@backstage/core-components": "workspace:^", - "@backstage/core-plugin-api": "workspace:^", - "@backstage/errors": "workspace:^", - "@backstage/frontend-plugin-api": "workspace:^", - "@backstage/plugin-catalog-react": "workspace:^", - "@backstage/plugin-linguist-common": "workspace:^", - "@material-ui/core": "^4.9.13", - "@material-ui/lab": "4.0.0-alpha.61", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", - "luxon": "^3.0.0", - "react-use": "^17.2.4", - "slugify": "^1.6.4" - }, - "devDependencies": { - "@backstage/cli": "workspace:^", - "@backstage/dev-utils": "workspace:^", - "@testing-library/jest-dom": "^6.0.0" - }, - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0", - "react-router-dom": "6.0.0-beta.0 || ^6.3.0" - }, - "deprecated": "This package has been moved to the backstage/community-plugins repository. You should migrate to using @backstage-community/plugin-linguist instead." -} diff --git a/plugins/linguist/src/alpha.ts b/plugins/linguist/src/alpha.ts deleted file mode 100644 index 287775ade0..0000000000 --- a/plugins/linguist/src/alpha.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* - * 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 * from './alpha/index'; -export { default } from './alpha/index'; -export * from './translation'; diff --git a/plugins/linguist/src/alpha/index.ts b/plugins/linguist/src/alpha/index.ts deleted file mode 100644 index 2f137f09ee..0000000000 --- a/plugins/linguist/src/alpha/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * 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 { default } from './plugin'; diff --git a/plugins/linguist/src/alpha/plugin.tsx b/plugins/linguist/src/alpha/plugin.tsx deleted file mode 100644 index 2c47346538..0000000000 --- a/plugins/linguist/src/alpha/plugin.tsx +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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 { - createApiExtension, - createApiFactory, - createPlugin, - discoveryApiRef, - fetchApiRef, -} from '@backstage/frontend-plugin-api'; - -import { LinguistClient, linguistApiRef } from '../api'; -import { compatWrapper } from '@backstage/core-compat-api'; -import { createEntityCardExtension } from '@backstage/plugin-catalog-react/alpha'; - -/** @alpha */ -export const entityLinguistCard = createEntityCardExtension({ - name: 'languages', - loader: async () => - import('../components/LinguistCard').then(m => - compatWrapper(), - ), -}); - -/** @alpha */ -export const linguistApi = createApiExtension({ - factory: createApiFactory({ - api: linguistApiRef, - deps: { - discoveryApi: discoveryApiRef, - fetchApi: fetchApiRef, - }, - factory: ({ discoveryApi, fetchApi }) => - new LinguistClient({ discoveryApi, fetchApi }), - }), -}); - -/** @alpha */ -export default createPlugin({ - id: 'linguist', - extensions: [linguistApi, entityLinguistCard], -}); diff --git a/plugins/linguist/src/api/LinguistApi.ts b/plugins/linguist/src/api/LinguistApi.ts deleted file mode 100644 index 6593453f31..0000000000 --- a/plugins/linguist/src/api/LinguistApi.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * 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 { createApiRef } from '@backstage/core-plugin-api'; -import { Languages } from '@backstage/plugin-linguist-common'; - -export const linguistApiRef = createApiRef({ - id: 'plugin.linguist.service', -}); - -export interface LinguistApi { - getLanguages(entityRef: string): Promise; -} diff --git a/plugins/linguist/src/api/LinguistClient.ts b/plugins/linguist/src/api/LinguistClient.ts deleted file mode 100644 index 5e687a039b..0000000000 --- a/plugins/linguist/src/api/LinguistClient.ts +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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 { DiscoveryApi, FetchApi } from '@backstage/core-plugin-api'; -import { ResponseError } from '@backstage/errors'; -import { Languages } from '@backstage/plugin-linguist-common'; -import { LinguistApi } from './LinguistApi'; - -export class LinguistClient implements LinguistApi { - private readonly discoveryApi: DiscoveryApi; - private readonly fetchApi: FetchApi; - - public constructor(options: { - discoveryApi: DiscoveryApi; - fetchApi: FetchApi; - }) { - this.discoveryApi = options.discoveryApi; - this.fetchApi = options.fetchApi; - } - - public async getLanguages(entityRef: string): Promise { - const queryString = new URLSearchParams(); - queryString.append('entityRef', entityRef); - - const urlSegment = `entity-languages?${queryString}`; - - const items = await this.get(urlSegment); - return items; - } - - private async get(path: string): Promise { - const baseUrl = `${await this.discoveryApi.getBaseUrl('linguist')}/`; - const url = new URL(path, baseUrl); - - const response = await this.fetchApi.fetch(url.toString()); - - if (!response.ok) { - throw await ResponseError.fromResponse(response); - } - - return response.json() as Promise; - } -} diff --git a/plugins/linguist/src/api/index.ts b/plugins/linguist/src/api/index.ts deleted file mode 100644 index ca60b60d53..0000000000 --- a/plugins/linguist/src/api/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -/* - * 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. - */ - -export * from './LinguistApi'; -export * from './LinguistClient'; diff --git a/plugins/linguist/src/components/LinguistCard/LinguistCard.tsx b/plugins/linguist/src/components/LinguistCard/LinguistCard.tsx deleted file mode 100644 index 213ca316ca..0000000000 --- a/plugins/linguist/src/components/LinguistCard/LinguistCard.tsx +++ /dev/null @@ -1,151 +0,0 @@ -/* - * 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 Box from '@material-ui/core/Box'; -import Chip from '@material-ui/core/Chip'; -import Tooltip from '@material-ui/core/Tooltip'; -import Typography from '@material-ui/core/Typography'; -import Grid from '@material-ui/core/Grid'; -import { makeStyles, useTheme } from '@material-ui/core/styles'; -import { InfoCard, Progress } from '@backstage/core-components'; -import Alert from '@material-ui/lab/Alert'; -import { DateTime } from 'luxon'; -import React from 'react'; -import slugify from 'slugify'; -import { useEntity } from '@backstage/plugin-catalog-react'; -import { useLanguages } from '../../hooks'; -import { useTranslationRef } from '@backstage/core-plugin-api/alpha'; -import { linguistTranslationRef } from '../../translation'; - -const useStyles = makeStyles(theme => ({ - infoCard: { - marginBottom: theme.spacing(3), - }, - barContainer: { - height: theme.spacing(2), - marginBottom: theme.spacing(3), - borderRadius: '4px', - backgroundColor: 'transparent', - overflow: 'hidden', - }, - bar: { - height: '100%', - position: 'relative', - }, - languageDot: { - width: '10px', - height: '10px', - borderRadius: '50%', - marginRight: theme.spacing(1), - display: 'inline-block', - }, - label: { - color: 'inherit', - }, -})); - -export const LinguistCard = () => { - const { t } = useTranslationRef(linguistTranslationRef); - const classes = useStyles(); - const theme = useTheme(); - const { entity } = useEntity(); - const { items, loading, error } = useLanguages(entity); - let barWidth = 0; - - if (loading) { - return ; - } else if (error) { - return {error.message}; - } - - if (items && items.languageCount === 0 && items.totalBytes === 0) { - return ( - - - - {t('entityCard.noData')} - - - - ); - } - - const breakdown = items?.breakdown.sort((a, b) => - a.percentage < b.percentage ? 1 : -1, - ); - const processedDate = items?.processedDate; - - return breakdown && processedDate ? ( - - - {breakdown.map((language, index: number) => { - barWidth = barWidth + language.percentage; - return ( - - - - ); - })} - - - - {breakdown.map(languages => ( - - - {languages.name} - {languages.percentage}% - - } - variant="outlined" - key={slugify(languages.name, { lower: true })} - /> - ))} - - - - ) : ( - <> - ); -}; diff --git a/plugins/linguist/src/components/LinguistCard/index.ts b/plugins/linguist/src/components/LinguistCard/index.ts deleted file mode 100644 index aefae143fd..0000000000 --- a/plugins/linguist/src/components/LinguistCard/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * 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. - */ - -export { LinguistCard } from './LinguistCard'; diff --git a/plugins/linguist/src/hooks/index.ts b/plugins/linguist/src/hooks/index.ts deleted file mode 100644 index 6f8913cf35..0000000000 --- a/plugins/linguist/src/hooks/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * 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. - */ - -export * from './useLanguages'; diff --git a/plugins/linguist/src/hooks/useLanguages.ts b/plugins/linguist/src/hooks/useLanguages.ts deleted file mode 100644 index f233d183bb..0000000000 --- a/plugins/linguist/src/hooks/useLanguages.ts +++ /dev/null @@ -1,41 +0,0 @@ -/* - * 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 { Entity, stringifyEntityRef } from '@backstage/catalog-model'; -import { linguistApiRef } from '../api'; -import { useApi } from '@backstage/core-plugin-api'; -import useAsync from 'react-use/esm/useAsync'; - -import { Languages } from '@backstage/plugin-linguist-common'; - -export function useLanguages(entity: Entity): { - items?: Languages; - loading: boolean; - error?: Error; -} { - const entityRef = stringifyEntityRef(entity); - - const api = useApi(linguistApiRef); - const { value, loading, error } = useAsync(() => { - return api.getLanguages(entityRef); - }, [api, entityRef]); - - return { - items: value, - loading, - error, - }; -} diff --git a/plugins/linguist/src/index.ts b/plugins/linguist/src/index.ts deleted file mode 100644 index ce9cd98cbd..0000000000 --- a/plugins/linguist/src/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * 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. - */ -export { - linguistPlugin, - isLinguistAvailable, - EntityLinguistCard, -} from './plugin'; diff --git a/plugins/linguist/src/plugin.test.ts b/plugins/linguist/src/plugin.test.ts deleted file mode 100644 index d2a1016a22..0000000000 --- a/plugins/linguist/src/plugin.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* - * 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 { linguistPlugin } from './plugin'; - -describe('linguist', () => { - it('should export plugin', () => { - expect(linguistPlugin).toBeDefined(); - }); -}); diff --git a/plugins/linguist/src/plugin.ts b/plugins/linguist/src/plugin.ts deleted file mode 100644 index 11f74a381c..0000000000 --- a/plugins/linguist/src/plugin.ts +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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 { - createApiFactory, - createComponentExtension, - createPlugin, - discoveryApiRef, - fetchApiRef, -} from '@backstage/core-plugin-api'; -import { linguistApiRef, LinguistClient } from './api'; -import { LINGUIST_ANNOTATION } from '@backstage/plugin-linguist-common'; -import { Entity } from '@backstage/catalog-model'; - -/** @public */ -export const isLinguistAvailable = (entity: Entity) => - Boolean(entity.metadata.annotations?.[LINGUIST_ANNOTATION]); - -/** @public */ -export const linguistPlugin = createPlugin({ - id: 'linguist', - apis: [ - createApiFactory({ - api: linguistApiRef, - deps: { - discoveryApi: discoveryApiRef, - fetchApi: fetchApiRef, - }, - factory: ({ discoveryApi, fetchApi }) => - new LinguistClient({ discoveryApi, fetchApi }), - }), - ], -}); - -/** @public */ -export const EntityLinguistCard = linguistPlugin.provide( - createComponentExtension({ - name: 'EntityLinguistCard', - component: { - lazy: () => import('./components/LinguistCard').then(m => m.LinguistCard), - }, - }), -); diff --git a/plugins/linguist/src/setupTests.ts b/plugins/linguist/src/setupTests.ts deleted file mode 100644 index 7a459ed24e..0000000000 --- a/plugins/linguist/src/setupTests.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * 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 '@testing-library/jest-dom'; diff --git a/plugins/linguist/src/translation.ts b/plugins/linguist/src/translation.ts deleted file mode 100644 index 7055d3dfe8..0000000000 --- a/plugins/linguist/src/translation.ts +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2024 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { createTranslationRef } from '@backstage/core-plugin-api/alpha'; - -/** @alpha */ -export const linguistTranslationRef = createTranslationRef({ - id: 'linguist', - messages: { - entityCard: { - title: 'Languages', - noData: 'There is currently no language data for this entity.', - }, - }, -}); diff --git a/plugins/nomad-backend/.eslintrc.js b/plugins/nomad-backend/.eslintrc.js deleted file mode 100644 index e2a53a6ad2..0000000000 --- a/plugins/nomad-backend/.eslintrc.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/nomad-backend/CHANGELOG.md b/plugins/nomad-backend/CHANGELOG.md deleted file mode 100644 index 2581a26504..0000000000 --- a/plugins/nomad-backend/CHANGELOG.md +++ /dev/null @@ -1,425 +0,0 @@ -# @backstage/plugin-nomad-backend - -## 0.1.19 - -### Patch Changes - -- d5a1fe1: Replaced winston logger with `LoggerService` -- Updated dependencies - - @backstage/backend-common@0.21.7 - - @backstage/backend-plugin-api@0.6.17 - - @backstage/config@1.2.0 - - @backstage/errors@1.2.4 - -## 0.1.19-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.21.7-next.1 - - @backstage/backend-plugin-api@0.6.17-next.1 - - @backstage/config@1.2.0 - - @backstage/errors@1.2.4 - -## 0.1.19-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.21.7-next.0 - - @backstage/backend-plugin-api@0.6.17-next.0 - - @backstage/config@1.2.0 - - @backstage/errors@1.2.4 - -## 0.1.18 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.21.6 - - @backstage/backend-plugin-api@0.6.16 - - @backstage/config@1.2.0 - - @backstage/errors@1.2.4 - -## 0.1.17 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.21.5 - - @backstage/backend-plugin-api@0.6.15 - - @backstage/config@1.2.0 - - @backstage/errors@1.2.4 - -## 0.1.16 - -### Patch Changes - -- 4467036: Allow unauthenticated access to health check endpoint. -- Updated dependencies - - @backstage/backend-common@0.21.4 - - @backstage/config@1.2.0 - - @backstage/errors@1.2.4 - - @backstage/backend-plugin-api@0.6.14 - -## 0.1.16-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.21.4-next.2 - - @backstage/backend-plugin-api@0.6.14-next.2 - - @backstage/config@1.2.0-next.1 - - @backstage/errors@1.2.4-next.0 - -## 0.1.16-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/config@1.2.0-next.1 - - @backstage/backend-common@0.21.4-next.1 - - @backstage/backend-plugin-api@0.6.14-next.1 - - @backstage/errors@1.2.4-next.0 - -## 0.1.15-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.21.3-next.0 - - @backstage/errors@1.2.4-next.0 - - @backstage/backend-plugin-api@0.6.13-next.0 - - @backstage/config@1.1.2-next.0 - -## 0.1.12 - -### Patch Changes - -- 9aac2b0: Use `--cwd` as the first `yarn` argument -- Updated dependencies - - @backstage/backend-common@0.21.0 - - @backstage/backend-plugin-api@0.6.10 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - -## 0.1.12-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.21.0-next.3 - - @backstage/backend-plugin-api@0.6.10-next.3 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - -## 0.1.12-next.2 - -### Patch Changes - -- 9aac2b0: Use `--cwd` as the first `yarn` argument -- Updated dependencies - - @backstage/backend-common@0.21.0-next.2 - - @backstage/backend-plugin-api@0.6.10-next.2 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - -## 0.1.12-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-plugin-api@0.6.10-next.1 - - @backstage/backend-common@0.21.0-next.1 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - -## 0.1.12-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.21.0-next.0 - - @backstage/backend-plugin-api@0.6.10-next.0 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - -## 0.1.11 - -### Patch Changes - -- 4016f21: Remove some unused dependencies -- Updated dependencies - - @backstage/backend-common@0.20.1 - - @backstage/backend-plugin-api@0.6.9 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - -## 0.1.11-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-plugin-api@0.6.9-next.2 - - @backstage/backend-common@0.20.1-next.2 - -## 0.1.11-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.20.1-next.1 - - @backstage/config@1.1.1 - - @backstage/backend-plugin-api@0.6.9-next.1 - - @backstage/errors@1.2.3 - -## 0.1.11-next.0 - -### Patch Changes - -- 4016f21: Remove some unused dependencies -- Updated dependencies - - @backstage/backend-common@0.20.1-next.0 - - @backstage/backend-plugin-api@0.6.9-next.0 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - -## 0.1.10 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.20.0 - - @backstage/backend-plugin-api@0.6.8 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - -## 0.1.10-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.20.0-next.3 - - @backstage/backend-plugin-api@0.6.8-next.3 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - -## 0.1.10-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.20.0-next.2 - - @backstage/backend-plugin-api@0.6.8-next.2 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - -## 0.1.10-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.20.0-next.1 - - @backstage/backend-plugin-api@0.6.8-next.1 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - -## 0.1.10-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.20.0-next.0 - - @backstage/backend-plugin-api@0.6.8-next.0 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - -## 0.1.9 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.19.9 - - @backstage/backend-plugin-api@0.6.7 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - -## 0.1.9-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-plugin-api@0.6.7-next.2 - - @backstage/backend-common@0.19.9-next.2 - -## 0.1.9-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.19.9-next.1 - - @backstage/backend-plugin-api@0.6.7-next.1 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - -## 0.1.9-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.19.9-next.0 - - @backstage/backend-plugin-api@0.6.7-next.0 - - @backstage/config@1.1.1 - - @backstage/errors@1.2.3 - -## 0.1.8 - -### Patch Changes - -- 6822918c50: Added support for the [new backend system](https://backstage.io/docs/backend-system/) -- Updated dependencies - - @backstage/backend-common@0.19.8 - - @backstage/errors@1.2.3 - - @backstage/backend-plugin-api@0.6.6 - - @backstage/config@1.1.1 - -## 0.1.8-next.2 - -### Patch Changes - -- 6822918c50: Added support for the [new backend system](https://backstage.io/docs/backend-system/) -- Updated dependencies - - @backstage/backend-common@0.19.8-next.2 - - @backstage/errors@1.2.3-next.0 - - @backstage/backend-plugin-api@0.6.6-next.2 - - @backstage/config@1.1.1-next.0 - -## 0.1.7-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.19.7-next.1 - - @backstage/config@1.1.0 - - @backstage/errors@1.2.2 - -## 0.1.7-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.19.7-next.0 - - @backstage/config@1.1.0 - - @backstage/errors@1.2.2 - -## 0.1.5 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.19.5 - - @backstage/config@1.1.0 - - @backstage/errors@1.2.2 - -## 0.1.5-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/config@1.1.0-next.2 - - @backstage/errors@1.2.2-next.0 - - @backstage/backend-common@0.19.5-next.3 - -## 0.1.5-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/config@1.1.0-next.1 - - @backstage/backend-common@0.19.5-next.2 - - @backstage/errors@1.2.1 - -## 0.1.5-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/config@1.1.0-next.0 - - @backstage/backend-common@0.19.5-next.1 - - @backstage/errors@1.2.1 - -## 0.1.4-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.19.4-next.0 - - @backstage/config@1.0.8 - - @backstage/errors@1.2.1 - -## 0.1.2 - -### Patch Changes - -- 12a8c94eda8d: Add package repository and homepage metadata -- Updated dependencies - - @backstage/backend-common@0.19.2 - - @backstage/config@1.0.8 - - @backstage/errors@1.2.1 - -## 0.1.2-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.19.2-next.2 - -## 0.1.2-next.1 - -### Patch Changes - -- 12a8c94eda8d: Add package repository and homepage metadata -- Updated dependencies - - @backstage/backend-common@0.19.2-next.1 - - @backstage/config@1.0.8 - - @backstage/errors@1.2.1 - -## 0.1.2-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.19.2-next.0 - - @backstage/config@1.0.8 - - @backstage/errors@1.2.1 - -## 0.1.1 - -### Patch Changes - -- Updated dependencies - - @backstage/errors@1.2.1 - - @backstage/backend-common@0.19.1 - - @backstage/config@1.0.8 - -## 0.1.1-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/errors@1.2.1-next.0 - - @backstage/backend-common@0.19.1-next.0 - - @backstage/config@1.0.8 - -## 0.1.0 - -### Minor Changes - -- 05bf04ca6863: Initialize Nomad plugin with frontend and backend. List jobs/allocations - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.19.0 - - @backstage/errors@1.2.0 - - @backstage/config@1.0.8 diff --git a/plugins/nomad-backend/README.md b/plugins/nomad-backend/README.md deleted file mode 100644 index b51608591a..0000000000 --- a/plugins/nomad-backend/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Deprecated - -This package has been moved to the [backstage-community/plugins](https://github.com/backstage/community-plugins) repository. Migrate to using `@backstage-community/plugin-nomad-backend` instead. diff --git a/plugins/nomad-backend/api-report.md b/plugins/nomad-backend/api-report.md deleted file mode 100644 index 7476fde961..0000000000 --- a/plugins/nomad-backend/api-report.md +++ /dev/null @@ -1,27 +0,0 @@ -## API Report File for "@backstage/plugin-nomad-backend" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts -import { BackendFeature } from '@backstage/backend-plugin-api'; -import { Config } from '@backstage/config'; -import express from 'express'; -import { LoggerService } from '@backstage/backend-plugin-api'; - -// @public (undocumented) -export function createRouter(options: RouterOptions): Promise; - -// @public -const nomadPlugin: () => BackendFeature; -export default nomadPlugin; - -// @public (undocumented) -export interface RouterOptions { - // (undocumented) - config: Config; - // (undocumented) - logger: LoggerService; -} - -// (No @packageDocumentation comment for this package) -``` diff --git a/plugins/nomad-backend/catalog-info.yaml b/plugins/nomad-backend/catalog-info.yaml deleted file mode 100644 index 7364d1920e..0000000000 --- a/plugins/nomad-backend/catalog-info.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: backstage.io/v1alpha1 -kind: Component -metadata: - name: backstage-plugin-nomad-backend - title: '@backstage/plugin-nomad-backend' -spec: - lifecycle: experimental - type: backstage-backend-plugin - owner: maintainers diff --git a/plugins/nomad-backend/knip-report.md b/plugins/nomad-backend/knip-report.md deleted file mode 100644 index 2661c35327..0000000000 --- a/plugins/nomad-backend/knip-report.md +++ /dev/null @@ -1,2 +0,0 @@ -# Knip report - diff --git a/plugins/nomad-backend/package.json b/plugins/nomad-backend/package.json deleted file mode 100644 index 833fd51909..0000000000 --- a/plugins/nomad-backend/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "@backstage/plugin-nomad-backend", - "version": "0.1.19", - "backstage": { - "role": "backend-plugin", - "moved": "@backstage-community/plugin-nomad-backend" - }, - "publishConfig": { - "access": "public", - "main": "dist/index.cjs.js", - "types": "dist/index.d.ts" - }, - "homepage": "https://backstage.io", - "repository": { - "type": "git", - "url": "https://github.com/backstage/backstage", - "directory": "plugins/nomad-backend" - }, - "license": "Apache-2.0", - "main": "src/index.ts", - "types": "src/index.ts", - "files": [ - "dist" - ], - "scripts": { - "build": "backstage-cli package build", - "clean": "backstage-cli package clean", - "lint": "backstage-cli package lint", - "prepack": "backstage-cli package prepack", - "postpack": "backstage-cli package postpack", - "start": "backstage-cli package start", - "test": "backstage-cli package test" - }, - "dependencies": { - "@backstage/backend-common": "workspace:^", - "@backstage/backend-plugin-api": "workspace:^", - "@backstage/config": "workspace:^", - "@backstage/errors": "workspace:^", - "@types/express": "*", - "express": "^4.17.1", - "express-promise-router": "^4.1.0", - "node-fetch": "^2.6.7", - "yn": "^4.0.0" - }, - "devDependencies": { - "@backstage/cli": "workspace:^", - "@types/supertest": "^2.0.8", - "supertest": "^6.2.4" - }, - "deprecated": "This package has been moved to the backstage/community-plugins repository. You should migrate to using @backstage-community/plugin-nomad-backend instead." -} diff --git a/plugins/nomad-backend/src/index.ts b/plugins/nomad-backend/src/index.ts deleted file mode 100644 index 21aa299d6d..0000000000 --- a/plugins/nomad-backend/src/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * 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 * from './service/router'; -export { nomadPlugin as default } from './plugin'; diff --git a/plugins/nomad-backend/src/plugin.test.ts b/plugins/nomad-backend/src/plugin.test.ts deleted file mode 100644 index 6ed8d2b194..0000000000 --- a/plugins/nomad-backend/src/plugin.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* - * 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 { nomadPlugin } from './plugin'; - -describe('nomad', () => { - it('should export the nomad plugin', () => { - expect(nomadPlugin).toBeDefined(); - }); -}); diff --git a/plugins/nomad-backend/src/plugin.ts b/plugins/nomad-backend/src/plugin.ts deleted file mode 100644 index 551f42cdc7..0000000000 --- a/plugins/nomad-backend/src/plugin.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* - * 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 { createRouter } from './service/router'; - -/** - * Nomad backend plugin - * - * @public - */ -export const nomadPlugin = createBackendPlugin({ - pluginId: 'nomad', - register(env) { - env.registerInit({ - deps: { - logger: coreServices.logger, - config: coreServices.rootConfig, - httpRouter: coreServices.httpRouter, - }, - async init({ logger, config, httpRouter }) { - httpRouter.use( - await createRouter({ - /** - * Logger for logging purposes - */ - logger, - config, - }), - ); - httpRouter.addAuthPolicy({ - path: '/health', - allow: 'unauthenticated', - }); - }, - }); - }, -}); diff --git a/plugins/nomad-backend/src/run.ts b/plugins/nomad-backend/src/run.ts deleted file mode 100644 index 711bdcc46c..0000000000 --- a/plugins/nomad-backend/src/run.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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 { getRootLogger } from '@backstage/backend-common'; -import yn from 'yn'; -import { startStandaloneServer } from './service/standaloneServer'; -import { ConfigReader } from '@backstage/config'; - -const config = new ConfigReader({}); -const port = process.env.PLUGIN_PORT ? Number(process.env.PLUGIN_PORT) : 7007; -const enableCors = yn(process.env.PLUGIN_CORS, { default: false }); -const logger = getRootLogger(); - -startStandaloneServer({ config, port, enableCors, logger }).catch(err => { - logger.error(err); - process.exit(1); -}); - -process.on('SIGINT', () => { - logger.info('CTRL+C pressed; exiting.'); - process.exit(0); -}); diff --git a/plugins/nomad-backend/src/service/router.test.ts b/plugins/nomad-backend/src/service/router.test.ts deleted file mode 100644 index 11c3834ed6..0000000000 --- a/plugins/nomad-backend/src/service/router.test.ts +++ /dev/null @@ -1,51 +0,0 @@ -/* - * 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 { getVoidLogger } from '@backstage/backend-common'; -import express from 'express'; -import request from 'supertest'; - -import { createRouter } from './router'; -import { ConfigReader } from '@backstage/config'; - -describe('createRouter', () => { - let app: express.Express; - - beforeAll(async () => { - const router = await createRouter({ - config: new ConfigReader({ - nomad: { - addr: 'http://localhost.com', - token: 'asdf', - }, - }), - logger: getVoidLogger(), - }); - app = express().use(router); - }); - - beforeEach(() => { - jest.resetAllMocks(); - }); - - describe('GET /health', () => { - it('returns ok', async () => { - const response = await request(app).get('/health'); - - expect(response.status).toEqual(200); - expect(response.body).toEqual({ status: 'ok' }); - }); - }); -}); diff --git a/plugins/nomad-backend/src/service/router.ts b/plugins/nomad-backend/src/service/router.ts deleted file mode 100644 index 10dd4a4128..0000000000 --- a/plugins/nomad-backend/src/service/router.ts +++ /dev/null @@ -1,126 +0,0 @@ -/* - * 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 fetch from 'node-fetch'; -import { errorHandler, requestLoggingHandler } from '@backstage/backend-common'; -import { Config } from '@backstage/config'; -import { InputError } from '@backstage/errors'; -import express from 'express'; -import Router from 'express-promise-router'; -import { LoggerService } from '@backstage/backend-plugin-api'; - -/** @public */ -export interface RouterOptions { - logger: LoggerService; - config: Config; -} - -/** @public */ -export async function createRouter( - options: RouterOptions, -): Promise { - const { config, logger } = options; - - // Get Nomad addr and token from config - const addr = config.getString('nomad.addr'); - const token = config.getOptionalString('nomad.token'); - - const router = Router(); - router.use(express.json()); - - router.get('/health', (_, resp) => { - resp.json({ status: 'ok' }); - }); - - router.get('/v1/allocations', async (req, res) => { - // Check namespace argument - const namespace = (req.query.namespace as string) ?? ''; - if (!namespace || namespace === '') { - throw new InputError(`Missing "namespace" query parameter`); - } - - // Check filter argument - const filter = (req.query.filter as string) ?? ''; - logger.debug(`request headers: namespace=${namespace} filter=${filter}`); - - // Issue the request - const endpoint = `${addr}/v1/allocations?namespace=${encodeURIComponent( - namespace, - )}&filter=${encodeURIComponent(filter)}`; - const allocationsResp = await fetch(endpoint, { - method: 'GET', - headers: { - Accept: 'application/json', - 'X-Nomad-Token': token || '', - }, - }); - - // Check response - if (allocationsResp.status !== 200) { - const body = await allocationsResp.text(); - logger.error(`failed to call /v1/allocations endpoint: ${body}`); - res.status(allocationsResp.status).json({ message: body }); - return; - } - - // Deserialize and return - const allocationsBody = await allocationsResp.json(); - logger.debug(`/v1/allocations response: ${allocationsBody}`); - res.json(allocationsBody); - }); - - router.get('/v1/job/:job_id/versions', async (req, resp) => { - // Check namespace argument - const namespace = (req.query.namespace as string) ?? ''; - if (!namespace || namespace === '') { - throw new InputError(`Missing "namespace" query parameter`); - } - - // Get job ID - const jobID = (req.params.job_id as string) ?? ''; - - // Issue the request - const apiResp = await fetch( - `${addr}/v1/job/${jobID}/versions?namespace=${encodeURIComponent( - namespace, - )}`, - { - method: 'GET', - headers: { - Accept: 'application/json', - 'X-Nomad-Token': token || '', - }, - }, - ); - - // Check response - if (apiResp.status !== 200) { - const body = await apiResp.text(); - logger.error(`failed to call /v1/job/:job_id/versions endpoint: ${body}`); - resp.status(apiResp.status).json({ message: body }); - return; - } - - // Deserialize and return - const versionsBody = await apiResp.json(); - logger.debug(`/v1/job/:job_id/versions response: ${versionsBody}`); - resp.json(versionsBody); - }); - - router.use(requestLoggingHandler()); - router.use(errorHandler()); - return router; -} diff --git a/plugins/nomad-backend/src/service/standaloneServer.ts b/plugins/nomad-backend/src/service/standaloneServer.ts deleted file mode 100644 index 3d952ec294..0000000000 --- a/plugins/nomad-backend/src/service/standaloneServer.ts +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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 { createServiceBuilder } from '@backstage/backend-common'; -import { Server } from 'http'; -import { createRouter } from './router'; -import { Config } from '@backstage/config'; -import { LoggerService } from '@backstage/backend-plugin-api'; - -export interface ServerOptions { - config: Config; - enableCors: boolean; - logger: LoggerService; - port: number; -} - -export async function startStandaloneServer( - options: ServerOptions, -): Promise { - const logger = options.logger.child({ service: 'nomad' }); - logger.debug('Starting application server...'); - const router = await createRouter({ - logger, - config: options.config, - }); - - let service = createServiceBuilder(module) - .setPort(options.port) - .addRouter('/nomad', router); - if (options.enableCors) { - service = service.enableCors({ origin: 'http://localhost:3000' }); - } - - return await service.start().catch(err => { - logger.error(err); - process.exit(1); - }); -} - -module.hot?.accept(); diff --git a/plugins/nomad-backend/src/setupTests.ts b/plugins/nomad-backend/src/setupTests.ts deleted file mode 100644 index 4b9026cde5..0000000000 --- a/plugins/nomad-backend/src/setupTests.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* - * 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 {}; diff --git a/plugins/nomad/.eslintrc.js b/plugins/nomad/.eslintrc.js deleted file mode 100644 index c69a8f6aff..0000000000 --- a/plugins/nomad/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { - rules: { - '@backstage/no-top-level-material-ui-4-imports': 'error', - }, - }); diff --git a/plugins/nomad/CHANGELOG.md b/plugins/nomad/CHANGELOG.md deleted file mode 100644 index 74859bba34..0000000000 --- a/plugins/nomad/CHANGELOG.md +++ /dev/null @@ -1,525 +0,0 @@ -# @backstage/plugin-nomad - -## 0.1.15 - -### Patch Changes - -- abfbcfc: Updated dependency `@testing-library/react` to `^15.0.0`. -- Updated dependencies - - @backstage/plugin-catalog-react@1.11.3 - - @backstage/core-components@0.14.4 - - @backstage/core-plugin-api@1.9.2 - - @backstage/catalog-model@1.4.5 - -## 0.1.15-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/catalog-model@1.4.5 - - @backstage/core-components@0.14.4-next.0 - - @backstage/core-plugin-api@1.9.1 - - @backstage/plugin-catalog-react@1.11.3-next.1 - -## 0.1.15-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.14.4-next.0 - - @backstage/catalog-model@1.4.5 - - @backstage/core-plugin-api@1.9.1 - - @backstage/plugin-catalog-react@1.11.3-next.0 - -## 0.1.14 - -### Patch Changes - -- c116096: Added an optional ESLint rule - no-top-level-material-ui-4-imports -in nomad plugin which has an auto fix function to migrate the imports and used it to migrate the Material UI imports for plugins/nomad. -- e8f026a: Use ESM exports of react-use library -- Updated dependencies - - @backstage/core-components@0.14.3 - - @backstage/plugin-catalog-react@1.11.2 - - @backstage/core-plugin-api@1.9.1 - - @backstage/catalog-model@1.4.5 - -## 0.1.13 - -### Patch Changes - -- c116096: Added an optional ESLint rule - no-top-level-material-ui-4-imports -in nomad plugin which has an auto fix function to migrate the imports and used it to migrate the Material UI imports for plugins/nomad. -- e8f026a: Use ESM exports of react-use library -- Updated dependencies - - @backstage/core-components@0.14.2 - - @backstage/plugin-catalog-react@1.11.1 - - @backstage/core-plugin-api@1.9.1 - - @backstage/catalog-model@1.4.5 - -## 0.1.12 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.14.1 - - @backstage/plugin-catalog-react@1.11.0 - - @backstage/catalog-model@1.4.5 - - @backstage/core-plugin-api@1.9.1 - -## 0.1.12-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.14.1-next.2 - - @backstage/plugin-catalog-react@1.11.0-next.2 - - @backstage/catalog-model@1.4.5-next.0 - - @backstage/core-plugin-api@1.9.1-next.1 - -## 0.1.12-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.14.1-next.1 - - @backstage/plugin-catalog-react@1.10.1-next.1 - - @backstage/core-plugin-api@1.9.1-next.1 - - @backstage/catalog-model@1.4.5-next.0 - -## 0.1.12-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.14.1-next.0 - - @backstage/plugin-catalog-react@1.10.1-next.0 - - @backstage/catalog-model@1.4.5-next.0 - - @backstage/core-plugin-api@1.9.1-next.0 - -## 0.1.11 - -### Patch Changes - -- 9aac2b0: Use `--cwd` as the first `yarn` argument -- 8fe56a8: Widen `@types/react` dependency range to include version 18. -- Updated dependencies - - @backstage/plugin-catalog-react@1.10.0 - - @backstage/core-components@0.14.0 - - @backstage/catalog-model@1.4.4 - - @backstage/core-plugin-api@1.9.0 - -## 0.1.11-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.14.0-next.2 - - @backstage/plugin-catalog-react@1.10.0-next.3 - - @backstage/catalog-model@1.4.4-next.0 - - @backstage/core-plugin-api@1.9.0-next.1 - -## 0.1.11-next.2 - -### Patch Changes - -- 9aac2b0: Use `--cwd` as the first `yarn` argument -- 8fe56a8: Widen `@types/react` dependency range to include version 18. -- Updated dependencies - - @backstage/core-components@0.14.0-next.1 - - @backstage/core-plugin-api@1.9.0-next.1 - - @backstage/plugin-catalog-react@1.10.0-next.2 - - @backstage/catalog-model@1.4.4-next.0 - -## 0.1.11-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.14.0-next.0 - - @backstage/catalog-model@1.4.4-next.0 - - @backstage/core-plugin-api@1.8.3-next.0 - - @backstage/plugin-catalog-react@1.9.4-next.1 - -## 0.1.11-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.9.4-next.0 - - @backstage/core-components@0.13.10 - - @backstage/catalog-model@1.4.3 - - @backstage/core-plugin-api@1.8.2 - -## 0.1.10 - -### Patch Changes - -- 4016f21: Remove some unused dependencies -- Updated dependencies - - @backstage/core-components@0.13.10 - - @backstage/core-plugin-api@1.8.2 - - @backstage/plugin-catalog-react@1.9.3 - - @backstage/catalog-model@1.4.3 - -## 0.1.10-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.9.3-next.2 - -## 0.1.10-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/core-plugin-api@1.8.2-next.0 - - @backstage/core-components@0.13.10-next.1 - - @backstage/plugin-catalog-react@1.9.3-next.1 - - @backstage/catalog-model@1.4.3 - -## 0.1.10-next.0 - -### Patch Changes - -- 4016f21: Remove some unused dependencies -- Updated dependencies - - @backstage/core-components@0.13.10-next.0 - - @backstage/plugin-catalog-react@1.9.3-next.0 - - @backstage/catalog-model@1.4.3 - - @backstage/core-plugin-api@1.8.1 - -## 0.1.9 - -### Patch Changes - -- Updated dependencies - - @backstage/core-plugin-api@1.8.1 - - @backstage/plugin-catalog-react@1.9.2 - - @backstage/core-components@0.13.9 - - @backstage/theme@0.5.0 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 - -## 0.1.9-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.13.9-next.3 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 - - @backstage/core-plugin-api@1.8.1-next.1 - - @backstage/theme@0.5.0-next.1 - - @backstage/plugin-catalog-react@1.9.2-next.3 - -## 0.1.9-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/theme@0.5.0-next.1 - - @backstage/plugin-catalog-react@1.9.2-next.2 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 - - @backstage/core-components@0.13.9-next.2 - - @backstage/core-plugin-api@1.8.1-next.1 - -## 0.1.9-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.13.9-next.1 - - @backstage/core-plugin-api@1.8.1-next.1 - - @backstage/plugin-catalog-react@1.9.2-next.1 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 - - @backstage/theme@0.5.0-next.0 - -## 0.1.9-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/core-plugin-api@1.8.1-next.0 - - @backstage/plugin-catalog-react@1.9.2-next.0 - - @backstage/core-components@0.13.9-next.0 - - @backstage/theme@0.5.0-next.0 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 - -## 0.1.7 - -### Patch Changes - -- 6c2b872153: Add official support for React 18. -- 4aa43f62aa: Updated dependency `cross-fetch` to `^4.0.0`. -- fdb5e23602: Import `MissingAnnotationEmptyState` from `@backstage/plugin-catalog-react` to remove the cyclical dependency -- Updated dependencies - - @backstage/plugin-catalog-react@1.9.0 - - @backstage/core-components@0.13.8 - - @backstage/core-plugin-api@1.8.0 - - @backstage/theme@0.4.4 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 - -## 0.1.7-next.2 - -### Patch Changes - -- [#20842](https://github.com/backstage/backstage/pull/20842) [`fdb5e23602`](https://github.com/backstage/backstage/commit/fdb5e2360299c5faa30f4d4236fc548b94d37446) Thanks [@benjdlambert](https://github.com/benjdlambert)! - Import `MissingAnnotationEmptyState` from `@backstage/plugin-catalog-react` to remove the cyclical dependency - -- Updated dependencies - - @backstage/core-components@0.13.8-next.2 - - @backstage/plugin-catalog-react@1.9.0-next.2 - -## 0.1.7-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.9.0-next.1 - - @backstage/core-components@0.13.8-next.1 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 - - @backstage/core-plugin-api@1.8.0-next.0 - - @backstage/theme@0.4.4-next.0 - -## 0.1.7-next.0 - -### Patch Changes - -- 6c2b872153: Add official support for React 18. -- Updated dependencies - - @backstage/core-components@0.13.7-next.0 - - @backstage/plugin-catalog-react@1.9.0-next.0 - - @backstage/core-plugin-api@1.8.0-next.0 - - @backstage/theme@0.4.4-next.0 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 - -## 0.1.6 - -### Patch Changes - -- 9a1fce352e: Updated dependency `@testing-library/jest-dom` to `^6.0.0`. -- Updated dependencies - - @backstage/plugin-catalog-react@1.8.5 - - @backstage/core-plugin-api@1.7.0 - - @backstage/core-components@0.13.6 - - @backstage/catalog-model@1.4.3 - - @backstage/theme@0.4.3 - - @backstage/config@1.1.1 - -## 0.1.6-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.13.6-next.2 - - @backstage/core-plugin-api@1.7.0-next.1 - - @backstage/catalog-model@1.4.3-next.0 - - @backstage/plugin-catalog-react@1.8.5-next.2 - - @backstage/theme@0.4.3-next.0 - - @backstage/config@1.1.1-next.0 - -## 0.1.6-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.13.6-next.1 - - @backstage/plugin-catalog-react@1.8.5-next.1 - - @backstage/core-plugin-api@1.7.0-next.0 - - @backstage/config@1.1.0 - - @backstage/catalog-model@1.4.2 - - @backstage/theme@0.4.2 - -## 0.1.6-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.8.5-next.0 - - @backstage/core-plugin-api@1.7.0-next.0 - - @backstage/core-components@0.13.6-next.0 - - @backstage/config@1.1.0 - - @backstage/catalog-model@1.4.2 - - @backstage/theme@0.4.2 - -## 0.1.5 - -### Patch Changes - -- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency -- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. -- 8cec7664e146: Removed `@types/node` dependency -- Updated dependencies - - @backstage/plugin-catalog-react@1.8.4 - - @backstage/core-components@0.13.5 - - @backstage/config@1.1.0 - - @backstage/catalog-model@1.4.2 - - @backstage/core-plugin-api@1.6.0 - - @backstage/theme@0.4.2 - -## 0.1.5-next.3 - -### Patch Changes - -- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. -- Updated dependencies - - @backstage/catalog-model@1.4.2-next.2 - - @backstage/config@1.1.0-next.2 - - @backstage/core-components@0.13.5-next.3 - - @backstage/core-plugin-api@1.6.0-next.3 - - @backstage/plugin-catalog-react@1.8.4-next.3 - - @backstage/theme@0.4.2-next.0 - -## 0.1.5-next.2 - -### Patch Changes - -- 8cec7664e146: Removed `@types/node` dependency -- Updated dependencies - - @backstage/core-components@0.13.5-next.2 - - @backstage/core-plugin-api@1.6.0-next.2 - - @backstage/config@1.1.0-next.1 - - @backstage/plugin-catalog-react@1.8.4-next.2 - - @backstage/catalog-model@1.4.2-next.1 - - @backstage/theme@0.4.1 - -## 0.1.5-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.8.4-next.1 - - @backstage/core-components@0.13.5-next.1 - - @backstage/config@1.1.0-next.0 - - @backstage/catalog-model@1.4.2-next.0 - - @backstage/core-plugin-api@1.6.0-next.1 - - @backstage/theme@0.4.1 - -## 0.1.4-next.0 - -### Patch Changes - -- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency -- Updated dependencies - - @backstage/core-plugin-api@1.6.0-next.0 - - @backstage/core-components@0.13.5-next.0 - - @backstage/catalog-model@1.4.1 - - @backstage/config@1.0.8 - - @backstage/theme@0.4.1 - - @backstage/plugin-catalog-react@1.8.3-next.0 - -## 0.1.2 - -### Patch Changes - -- 12a8c94eda8d: Add package repository and homepage metadata -- Updated dependencies - - @backstage/core-components@0.13.4 - - @backstage/plugin-catalog-react@1.8.1 - - @backstage/core-plugin-api@1.5.3 - - @backstage/catalog-model@1.4.1 - - @backstage/config@1.0.8 - - @backstage/theme@0.4.1 - -## 0.1.2-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.8.1-next.1 - -## 0.1.2-next.1 - -### Patch Changes - -- 12a8c94eda8d: Add package repository and homepage metadata -- Updated dependencies - - @backstage/catalog-model@1.4.1 - - @backstage/config@1.0.8 - - @backstage/core-components@0.13.4-next.0 - - @backstage/core-plugin-api@1.5.3 - - @backstage/theme@0.4.1 - - @backstage/plugin-catalog-react@1.8.1-next.0 - -## 0.1.2-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.13.4-next.0 - - @backstage/core-plugin-api@1.5.3 - - @backstage/plugin-catalog-react@1.8.1-next.0 - - @backstage/catalog-model@1.4.1 - - @backstage/config@1.0.8 - - @backstage/theme@0.4.1 - -## 0.1.1 - -### Patch Changes - -- 68531cc70e1f: Break some internal circular import chains -- e6f50426333b: update some peer dependencies to silence yarn install -- Updated dependencies - - @backstage/theme@0.4.1 - - @backstage/plugin-catalog-react@1.8.0 - - @backstage/core-components@0.13.3 - - @backstage/core-plugin-api@1.5.3 - - @backstage/catalog-model@1.4.1 - - @backstage/config@1.0.8 - -## 0.1.1-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.8.0-next.2 - - @backstage/theme@0.4.1-next.1 - - @backstage/core-plugin-api@1.5.3-next.1 - - @backstage/core-components@0.13.3-next.2 - - @backstage/catalog-model@1.4.1-next.0 - - @backstage/config@1.0.8 - -## 0.1.1-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/theme@0.4.1-next.0 - - @backstage/core-components@0.13.3-next.1 - - @backstage/core-plugin-api@1.5.3-next.0 - - @backstage/plugin-catalog-react@1.7.1-next.1 - - @backstage/config@1.0.8 - -## 0.1.1-next.0 - -### Patch Changes - -- 68531cc70e1f: Break some internal circular import chains -- Updated dependencies - - @backstage/core-components@0.13.3-next.0 - - @backstage/catalog-model@1.4.1-next.0 - - @backstage/config@1.0.8 - - @backstage/core-plugin-api@1.5.2 - - @backstage/theme@0.4.0 - - @backstage/plugin-catalog-react@1.7.1-next.0 - -## 0.1.0 - -### Minor Changes - -- 05bf04ca6863: Initialize Nomad plugin with frontend and backend. List jobs/allocations - -### Patch Changes - -- Updated dependencies - - @backstage/core-plugin-api@1.5.2 - - @backstage/core-components@0.13.2 - - @backstage/theme@0.4.0 - - @backstage/plugin-catalog-react@1.7.0 - - @backstage/catalog-model@1.4.0 - - @backstage/config@1.0.8 diff --git a/plugins/nomad/README.md b/plugins/nomad/README.md deleted file mode 100644 index a5ec802195..0000000000 --- a/plugins/nomad/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Deprecated - -This package has been moved to the [backstage-community/plugins](https://github.com/backstage/community-plugins) repository. Migrate to using `@backstage-community/plugin-nomad` instead. diff --git a/plugins/nomad/api-report.md b/plugins/nomad/api-report.md deleted file mode 100644 index 68cc47c33d..0000000000 --- a/plugins/nomad/api-report.md +++ /dev/null @@ -1,35 +0,0 @@ -## API Report File for "@backstage/plugin-nomad" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts -/// - -import { BackstagePlugin } from '@backstage/core-plugin-api'; -import { Entity } from '@backstage/catalog-model'; -import { JSX as JSX_2 } from 'react'; -import { RouteRef } from '@backstage/core-plugin-api'; - -// @public -export const EntityNomadAllocationListTable: () => JSX_2.Element; - -// @public -export const EntityNomadJobVersionListCard: () => JSX_2.Element | null; - -// @public (undocumented) -export const isNomadAllocationsAvailable: (entity: Entity) => boolean; - -// @public (undocumented) -export const isNomadJobIDAvailable: (entity: Entity) => boolean; - -// @public (undocumented) -export const nomadPlugin: BackstagePlugin< - { - root: RouteRef; - entityContent: RouteRef; - }, - {} ->; - -// (No @packageDocumentation comment for this package) -``` diff --git a/plugins/nomad/catalog-info.yaml b/plugins/nomad/catalog-info.yaml deleted file mode 100644 index d704846059..0000000000 --- a/plugins/nomad/catalog-info.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: backstage.io/v1alpha1 -kind: Component -metadata: - name: backstage-plugin-nomad - title: '@backstage/plugin-nomad' -spec: - lifecycle: experimental - type: backstage-frontend-plugin - owner: maintainers diff --git a/plugins/nomad/dev/index.tsx b/plugins/nomad/dev/index.tsx deleted file mode 100644 index 73eaffb8e0..0000000000 --- a/plugins/nomad/dev/index.tsx +++ /dev/null @@ -1,19 +0,0 @@ -/* - * 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 { createDevApp } from '@backstage/dev-utils'; -import { nomadPlugin } from '../src/plugin'; - -createDevApp().registerPlugin(nomadPlugin).render(); diff --git a/plugins/nomad/img/allocations-component.png b/plugins/nomad/img/allocations-component.png deleted file mode 100644 index fb1e9768affc46a78ae45654858636c2f14b72d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120025 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

-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 MmYSYw6&e%qKWDmH1ONa4 diff --git a/plugins/nomad/img/job-versions-component.png b/plugins/nomad/img/job-versions-component.png deleted file mode 100644 index d6c9746bcb58f4740a40d2bebd81d1c874c95e9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53458 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

M%0!c!hH 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 { - const { entity } = useEntity(); - - if (!isNomadAllocationsAvailable(entity)) { - return ( - - ); - } - - return ( - - } /> - - ); -}; diff --git a/plugins/nomad/src/annotations.ts b/plugins/nomad/src/annotations.ts deleted file mode 100644 index 9854288e5d..0000000000 --- a/plugins/nomad/src/annotations.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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 { Entity } from '@backstage/catalog-model'; - -/** @public */ -export const NOMAD_NAMESPACE_ANNOTATION = 'nomad.io/namespace'; - -/** @public */ -export const NOMAD_JOB_ID_ANNOTATION = 'nomad.io/job-id'; - -/** @public */ -export const NOMAD_GROUP_ANNOTATION = 'nomad.io/group'; - -/** @public */ -export const isNomadJobIDAvailable = (entity: Entity) => - Boolean(entity.metadata.annotations?.[NOMAD_JOB_ID_ANNOTATION]); - -/** @public */ -export const isNomadAllocationsAvailable = (entity: Entity) => - Boolean(entity.metadata.annotations?.[NOMAD_JOB_ID_ANNOTATION]) || - Boolean(entity.metadata.annotations?.[NOMAD_GROUP_ANNOTATION]); diff --git a/plugins/nomad/src/api.ts b/plugins/nomad/src/api.ts deleted file mode 100644 index 44aa5d48d2..0000000000 --- a/plugins/nomad/src/api.ts +++ /dev/null @@ -1,160 +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 { - DiscoveryApi, - FetchApi, - createApiRef, -} from '@backstage/core-plugin-api'; - -/** @public */ -export const nomadApiRef = createApiRef({ - id: 'plugin.nomad.service', -}); - -/** @public */ -export type NomadApi = { - /** - * listAllocations is for listing all allocations matching some part of 'filter'. - * - * See: https://developer.hashicorp.com/nomad/api-docs/allocations#list-allocations - */ - listAllocations: ( - options: ListAllocationsRequest, - ) => Promise; - - /** - * listJobVersions is for listing all deployments matching some part of 'filter'. - * - * See: https://developer.hashicorp.com/nomad/api-docs/deployments#list-deployments - */ - listJobVersions: ( - options: ListJobVersionsRequest, - ) => Promise; -}; - -/** @public */ -export interface ListAllocationsRequest { - namespace: string; - filter: string; -} - -/** @public */ -export interface ListAllocationsResponse { - allocations: Allocation[]; -} - -/** @public */ -export interface Allocation { - ClientStatus: string; - CreateTime: number; - DeploymentStatus: DeploymentStatus; - ID: string; - JobID: string; - JobVersion: string; - ModifyTime: number; - Name: string; - Namespace: string; - NodeID: string; - TaskGroup: string; -} - -/** @public */ -export interface DeploymentStatus { - Healthy: boolean; - Timestamp: string; -} - -/** @public */ -export interface ListJobVersionsRequest { - namespace: string; - jobID: string; -} - -/** @public */ -export interface ListJobVersionsResponse { - versions: Version[]; -} - -/** @public */ -export interface Version { - ID: string; - SubmitTime: number; - Stable: boolean; - Version: number; -} - -/** @public */ -export class FetchError extends Error { - get name(): string { - return this.constructor.name; - } - - static async forResponse(resp: Response): Promise { - return new FetchError( - `Request failed with status code ${ - resp.status - }.\nReason: ${await resp.text()}`, - ); - } -} - -/** @public */ -export class NomadHttpApi implements NomadApi { - static create(discoveryApi: DiscoveryApi, fetchApi: FetchApi) { - return new NomadHttpApi(discoveryApi, fetchApi); - } - - constructor(private discoveryApi: DiscoveryApi, private fetchApi: FetchApi) {} - - // TODO: pagination - async listAllocations( - options: ListAllocationsRequest, - ): Promise { - const apiUrl = await this.discoveryApi.getBaseUrl('nomad'); - - const resp = await this.fetchApi.fetch( - `${apiUrl}/v1/allocations?namespace=${encodeURIComponent( - options.namespace, - )}&filter=${encodeURIComponent(options.filter)}`, - ); - if (!resp.ok) throw await FetchError.forResponse(resp); - - return { - allocations: await resp.json(), - }; - } - - // TODO: pagination - async listJobVersions( - options: ListJobVersionsRequest, - ): Promise { - const apiUrl = await this.discoveryApi.getBaseUrl('nomad'); - - const resp = await this.fetchApi.fetch( - `${apiUrl}/v1/job/${ - options.jobID - }/versions?namespace=${encodeURIComponent(options.namespace)}`, - ); - if (!resp.ok) throw await FetchError.forResponse(resp); - - const respJson = await resp.json(); - - return { - versions: respJson.Versions, - }; - } -} diff --git a/plugins/nomad/src/components/EntityNomadAllocationListTable/EntityNomadAllocationListTable.tsx b/plugins/nomad/src/components/EntityNomadAllocationListTable/EntityNomadAllocationListTable.tsx deleted file mode 100644 index a664d408ab..0000000000 --- a/plugins/nomad/src/components/EntityNomadAllocationListTable/EntityNomadAllocationListTable.tsx +++ /dev/null @@ -1,203 +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 { DateTime } from 'luxon'; -import { - Link, - ResponseErrorPanel, - StatusError, - StatusOK, - StatusPending, - StatusRunning, - Table, - TableColumn, -} from '@backstage/core-components'; -import { - useEntity, - MissingAnnotationEmptyState, -} from '@backstage/plugin-catalog-react'; -import React, { useState } from 'react'; -import { Allocation, nomadApiRef } from '../../api'; -import { configApiRef, useApi } from '@backstage/core-plugin-api'; -import { - NOMAD_GROUP_ANNOTATION, - NOMAD_JOB_ID_ANNOTATION, - NOMAD_NAMESPACE_ANNOTATION, - isNomadAllocationsAvailable, -} from '../../annotations'; -import useAsync from 'react-use/esm/useAsync'; - -type rowType = Allocation & { nomadAddr: string }; - -const columns: TableColumn[] = [ - { - title: 'ID', - field: 'ID', - render: row => ( - - {row.ID.split('-')[0]} - - ), - }, - { - title: 'Task Group', - field: 'TaskGroup', - render: row => ( - - {row.TaskGroup} - - ), - }, - { - title: 'Created', - field: 'CreateTime', - render: row => - DateTime.fromMillis(row.CreateTime / 1000000).toLocaleString( - DateTime.DATETIME_MED_WITH_SECONDS, - ), - }, - { - title: 'Status', - field: 'ClientStatus', - render: row => - ({ - pending: pending, - running: running, - failed: failed, - complete: complete, - }[row.ClientStatus] || {row.ClientStatus}), - }, - { - title: 'Version', - field: 'JobVersion', - render: row => row.JobVersion, - }, - { - title: 'Client', - field: 'NodeID', - render: row => ( - - {row.ID.split('-')[0]} - - ), - }, -]; - -/** - * EntityNomadAllocationListTable is roughly based off Nomad's Allocations tab's view. - */ -export const EntityNomadAllocationListTable = () => { - // Wait on entity - const { entity } = useEntity(); - - // Get ref to the backend API - const [init, setInit] = useState(true); - const configApi = useApi(configApiRef); - const nomadApi = useApi(nomadApiRef); - const nomadAddr = configApi.getString('nomad.addr'); - - // Store results of calling API - const [allocations, setAllocations] = useState([]); - const [err, setErr] = useState(); - - // Check that attributes are available - if (!isNomadAllocationsAvailable(entity)) { - ; - } - - // Get plugin attributes - const namespace = - entity.metadata.annotations?.[NOMAD_NAMESPACE_ANNOTATION] ?? 'default'; - const job = entity.metadata.annotations?.[NOMAD_JOB_ID_ANNOTATION] ?? ''; - const group = entity.metadata.annotations?.[NOMAD_GROUP_ANNOTATION] ?? ''; - - // Make filter from attributes - const filter: string[] = []; - if (job) { - filter.push(`(JobID == "${job}")`); - } - if (group) { - filter.push(`(TaskGroup matches "${group}")`); - } - - // Create a query to update allocations - const query = async () => { - try { - // Make call to nomad-backend - const resp = await nomadApi.listAllocations({ - namespace, - filter: filter.join(' and '), - }); - - // Sort results - const results = resp.allocations - .sort((a, b) => a.CreateTime - b.CreateTime) - .sort(({ ClientStatus: a }, { ClientStatus: b }) => { - if (a === 'running' || b !== 'running') { - return -1; - } - return 0; - }); - - setAllocations(results.map(row => ({ ...row, id: row.ID, nomadAddr }))); - setErr(undefined); - } catch (e) { - setAllocations([]); - setErr(e); - } - }; - - // Start querying for allocations every 5s - useAsync(async () => { - if (init) { - setInit(false); - query(); - } - - const interval = setTimeout(() => { - query(); - }, 5_000); - - return () => clearTimeout(interval); - }, [allocations, entity]); - - // Store a ref to a potential error - if (err) { - return ; - } - - return ( - - title="Allocations" - options={{ - search: true, - padding: 'dense', - sorting: true, - draggable: false, - paging: false, - debounceInterval: 500, - filterCellStyle: { padding: '0 16px 0 20px' }, - }} - columns={columns} - data={allocations} - /> - ); -}; diff --git a/plugins/nomad/src/components/EntityNomadJobVersionListCard/EntityNomadJobVersionListCard.tsx b/plugins/nomad/src/components/EntityNomadJobVersionListCard/EntityNomadJobVersionListCard.tsx deleted file mode 100644 index 73d44acb3b..0000000000 --- a/plugins/nomad/src/components/EntityNomadJobVersionListCard/EntityNomadJobVersionListCard.tsx +++ /dev/null @@ -1,154 +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 { DateTime } from 'luxon'; -import { - InfoCard, - ResponseErrorPanel, - Table, - TableColumn, -} from '@backstage/core-components'; -import { - useEntity, - MissingAnnotationEmptyState, -} from '@backstage/plugin-catalog-react'; -import React, { useEffect, useState } from 'react'; -import { Version, nomadApiRef } from '../../api'; -import { configApiRef, useApi } from '@backstage/core-plugin-api'; -import { - NOMAD_JOB_ID_ANNOTATION, - NOMAD_NAMESPACE_ANNOTATION, - isNomadJobIDAvailable, -} from '../../annotations'; -import OpenInNewIcon from '@material-ui/icons/OpenInNew'; -import Chip from '@material-ui/core/Chip'; - -type rowType = Version & { nomadAddr: string }; - -const columns: TableColumn[] = [ - { - title: 'Version', - field: 'Version', - render: row => row.Version, - }, - { - title: 'Stable', - field: 'Stable', - render: row => , - }, - { - title: 'Submitted', - field: 'SubmitTime', - render: row => - DateTime.fromMillis(row.SubmitTime / 1000000).toLocaleString( - DateTime.DATETIME_MED_WITH_SECONDS, - ), - }, -]; - -/** - * EntityNomadJobVersionListCard is roughly based on the Nomad UI's versions tab. - */ -export const EntityNomadJobVersionListCard = () => { - // Wait on entity - const { entity } = useEntity(); - - // Get ref to the backend API - const configApi = useApi(configApiRef); - const nomadApi = useApi(nomadApiRef); - const nomadAddr = configApi.getString('nomad.addr'); - - // Store results of calling API - const [init, setInit] = useState(true); - const [versions, setVersions] = useState([]); - const [err, setErr] = useState(); - - // Get plugin attributes - const namespace = - entity.metadata.annotations?.[NOMAD_NAMESPACE_ANNOTATION] ?? 'default'; - const jobID = entity.metadata.annotations?.[NOMAD_JOB_ID_ANNOTATION] ?? ''; - - // Start querying for allocations every 10s - useEffect(() => { - // Create a query to update allocations - const query = async () => { - try { - // Make call to nomad-backend - const resp = await nomadApi.listJobVersions({ namespace, jobID }); - - setVersions( - resp.versions.map(row => ({ ...row, id: row.ID, nomadAddr })), - ); - setErr(undefined); - } catch (e) { - setVersions([]); - setErr(e); - } - }; - - if (init) { - setInit(false); - query(); - } - - const interval = setTimeout(() => { - query(); - }, 10_000); - - return () => clearTimeout(interval); - }, [init, jobID, namespace, nomadAddr, nomadApi]); - - // Store a ref to a potential error - if (err) { - return ; - } - - if (!entity) return null; - - // Check that job ID is set - if (!isNomadJobIDAvailable(entity)) { - return ( - - - - ); - } - - return ( - - title="Job versions" - actions={[ - { - icon: () => , - tooltip: 'Open in Nomad UI', - isFreeAction: true, - onClick: () => window.open(`${nomadAddr}/ui/jobs/${jobID}/versions`), - }, - ]} - options={{ - search: false, - padding: 'dense', - sorting: true, - draggable: false, - paging: false, - debounceInterval: 500, - filterCellStyle: { padding: '0 16px 0 20px' }, - }} - columns={columns} - data={versions} - /> - ); -}; diff --git a/plugins/nomad/src/components/index.ts b/plugins/nomad/src/components/index.ts deleted file mode 100644 index dcdae8cc99..0000000000 --- a/plugins/nomad/src/components/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -/* - * 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 { EntityNomadJobVersionListCard } from './EntityNomadJobVersionListCard/EntityNomadJobVersionListCard'; -export { EntityNomadAllocationListTable } from './EntityNomadAllocationListTable/EntityNomadAllocationListTable'; diff --git a/plugins/nomad/src/index.ts b/plugins/nomad/src/index.ts deleted file mode 100644 index d139935f1f..0000000000 --- a/plugins/nomad/src/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * 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 { - nomadPlugin, - EntityNomadJobVersionListCard, - EntityNomadAllocationListTable, -} from './plugin'; -export { - isNomadAllocationsAvailable, - isNomadJobIDAvailable, -} from './annotations'; diff --git a/plugins/nomad/src/plugin.test.ts b/plugins/nomad/src/plugin.test.ts deleted file mode 100644 index def0f8ab89..0000000000 --- a/plugins/nomad/src/plugin.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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 { - nomadPlugin, - entityContentRouteRef, - EntityNomadContent, -} from './plugin'; - -describe('nomad', () => { - it('should export plugin', () => { - expect(nomadPlugin).toBeDefined(); - }); - - it('should export Nomad entity ref', () => { - expect(entityContentRouteRef).toBeDefined(); - }); - - it('should export Nomad entity', () => { - expect(EntityNomadContent).toBeDefined(); - }); -}); diff --git a/plugins/nomad/src/plugin.ts b/plugins/nomad/src/plugin.ts deleted file mode 100644 index df89785941..0000000000 --- a/plugins/nomad/src/plugin.ts +++ /dev/null @@ -1,87 +0,0 @@ -/* - * 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 { - discoveryApiRef, - fetchApiRef, - createApiFactory, - createPlugin, - createRouteRef, - createRoutableExtension, - createComponentExtension, -} from '@backstage/core-plugin-api'; - -import { rootRouteRef } from './routes'; -import { NomadHttpApi, nomadApiRef } from './api'; - -export const entityContentRouteRef = createRouteRef({ - id: 'nomad:entity-content', -}); - -/** @public */ -export const nomadPlugin = createPlugin({ - id: 'nomad', - apis: [ - createApiFactory({ - api: nomadApiRef, - deps: { discoveryApi: discoveryApiRef, fetchApi: fetchApiRef }, - factory: ({ discoveryApi, fetchApi }) => - NomadHttpApi.create(discoveryApi, fetchApi), - }), - ], - routes: { - root: rootRouteRef, - entityContent: entityContentRouteRef, - }, -}); - -/** @public */ -export const EntityNomadContent = nomadPlugin.provide( - createRoutableExtension({ - name: 'EntityNomadContent', - component: () => import('./Router').then(m => m.EmbeddedRouter), - mountPoint: entityContentRouteRef, - }), -); - -/** - * Card used to show the list of Nomad job versions. - * - * @public - */ -export const EntityNomadJobVersionListCard = nomadPlugin.provide( - createComponentExtension({ - name: 'EntityNomadJobVersionListCard', - component: { - lazy: () => - import('./components').then(m => m.EntityNomadJobVersionListCard), - }, - }), -); - -/** - * Table used to show the list of Nomad allocations for a job and/or task-group. - * - * @public - */ -export const EntityNomadAllocationListTable = nomadPlugin.provide( - createComponentExtension({ - name: 'EntityNomadAllocationListTable', - component: { - lazy: () => - import('./components').then(m => m.EntityNomadAllocationListTable), - }, - }), -); diff --git a/plugins/nomad/src/routes.ts b/plugins/nomad/src/routes.ts deleted file mode 100644 index 12e8caf4eb..0000000000 --- a/plugins/nomad/src/routes.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * 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 { createRouteRef } from '@backstage/core-plugin-api'; - -export const rootRouteRef = createRouteRef({ - id: 'nomad', -}); diff --git a/plugins/nomad/src/setupTests.ts b/plugins/nomad/src/setupTests.ts deleted file mode 100644 index 73dd8dce47..0000000000 --- a/plugins/nomad/src/setupTests.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * 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 '@testing-library/jest-dom'; -import 'cross-fetch/polyfill'; diff --git a/plugins/pagerduty/.eslintrc.js b/plugins/pagerduty/.eslintrc.js deleted file mode 100644 index a2d8179106..0000000000 --- a/plugins/pagerduty/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { - rules: { - '@backstage/no-top-level-material-ui-4-imports': 'error', - }, -}); diff --git a/plugins/pagerduty/CHANGELOG.md b/plugins/pagerduty/CHANGELOG.md deleted file mode 100644 index b2e1bd39e5..0000000000 --- a/plugins/pagerduty/CHANGELOG.md +++ /dev/null @@ -1,1861 +0,0 @@ -# @backstage/plugin-pagerduty - -## 0.7.6 - -### Patch Changes - -- abfbcfc: Updated dependency `@testing-library/react` to `^15.0.0`. -- cb1e3b0: Updated dependency `@testing-library/dom` to `^10.0.0`. -- Updated dependencies - - @backstage/plugin-catalog-react@1.11.3 - - @backstage/plugin-home-react@0.1.12 - - @backstage/core-components@0.14.4 - - @backstage/core-plugin-api@1.9.2 - - @backstage/catalog-model@1.4.5 - - @backstage/errors@1.2.4 - -## 0.7.6-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/catalog-model@1.4.5 - - @backstage/core-components@0.14.4-next.0 - - @backstage/core-plugin-api@1.9.1 - - @backstage/errors@1.2.4 - - @backstage/plugin-catalog-react@1.11.3-next.1 - - @backstage/plugin-home-react@0.1.12-next.0 - -## 0.7.6-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.14.4-next.0 - - @backstage/catalog-model@1.4.5 - - @backstage/core-plugin-api@1.9.1 - - @backstage/errors@1.2.4 - - @backstage/plugin-catalog-react@1.11.3-next.0 - - @backstage/plugin-home-react@0.1.12-next.0 - -## 0.7.5 - -### Patch Changes - -- 2b43144: Added ESLint rule `no-top-level-material-ui-4-imports` in the `pagerduty` plugin to migrate the Material UI imports. -- e8f026a: Use ESM exports of react-use library -- Updated dependencies - - @backstage/core-components@0.14.3 - - @backstage/plugin-catalog-react@1.11.2 - - @backstage/plugin-home-react@0.1.11 - - @backstage/core-plugin-api@1.9.1 - - @backstage/catalog-model@1.4.5 - - @backstage/errors@1.2.4 - -## 0.7.4 - -### Patch Changes - -- 2b43144: Added ESLint rule `no-top-level-material-ui-4-imports` in the `pagerduty` plugin to migrate the Material UI imports. -- e8f026a: Use ESM exports of react-use library -- Updated dependencies - - @backstage/core-components@0.14.2 - - @backstage/plugin-catalog-react@1.11.1 - - @backstage/plugin-home-react@0.1.10 - - @backstage/core-plugin-api@1.9.1 - - @backstage/catalog-model@1.4.5 - - @backstage/errors@1.2.4 - -## 0.7.3 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.14.1 - - @backstage/errors@1.2.4 - - @backstage/plugin-catalog-react@1.11.0 - - @backstage/plugin-home-react@0.1.9 - - @backstage/catalog-model@1.4.5 - - @backstage/core-plugin-api@1.9.1 - -## 0.7.3-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.14.1-next.2 - - @backstage/plugin-catalog-react@1.11.0-next.2 - - @backstage/plugin-home-react@0.1.9-next.2 - - @backstage/catalog-model@1.4.5-next.0 - - @backstage/core-plugin-api@1.9.1-next.1 - - @backstage/errors@1.2.4-next.0 - -## 0.7.3-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.14.1-next.1 - - @backstage/plugin-catalog-react@1.10.1-next.1 - - @backstage/core-plugin-api@1.9.1-next.1 - - @backstage/plugin-home-react@0.1.9-next.1 - - @backstage/catalog-model@1.4.5-next.0 - - @backstage/errors@1.2.4-next.0 - -## 0.7.3-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/errors@1.2.4-next.0 - - @backstage/core-components@0.14.1-next.0 - - @backstage/plugin-catalog-react@1.10.1-next.0 - - @backstage/plugin-home-react@0.1.9-next.0 - - @backstage/catalog-model@1.4.5-next.0 - - @backstage/core-plugin-api@1.9.1-next.0 - -## 0.7.2 - -### Patch Changes - -- 8fe56a8: Widen `@types/react` dependency range to include version 18. -- Updated dependencies - - @backstage/plugin-catalog-react@1.10.0 - - @backstage/core-components@0.14.0 - - @backstage/catalog-model@1.4.4 - - @backstage/core-plugin-api@1.9.0 - - @backstage/plugin-home-react@0.1.8 - - @backstage/errors@1.2.3 - -## 0.7.2-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.14.0-next.2 - - @backstage/plugin-catalog-react@1.10.0-next.3 - - @backstage/plugin-home-react@0.1.8-next.3 - - @backstage/catalog-model@1.4.4-next.0 - - @backstage/core-plugin-api@1.9.0-next.1 - - @backstage/errors@1.2.3 - -## 0.7.2-next.2 - -### Patch Changes - -- 8fe56a8: Widen `@types/react` dependency range to include version 18. -- Updated dependencies - - @backstage/core-components@0.14.0-next.1 - - @backstage/core-plugin-api@1.9.0-next.1 - - @backstage/plugin-catalog-react@1.10.0-next.2 - - @backstage/plugin-home-react@0.1.8-next.2 - - @backstage/catalog-model@1.4.4-next.0 - - @backstage/errors@1.2.3 - -## 0.7.2-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.14.0-next.0 - - @backstage/catalog-model@1.4.4-next.0 - - @backstage/core-plugin-api@1.8.3-next.0 - - @backstage/plugin-catalog-react@1.9.4-next.1 - - @backstage/plugin-home-react@0.1.8-next.1 - - @backstage/errors@1.2.3 - -## 0.7.2-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.9.4-next.0 - - @backstage/plugin-home-react@0.1.8-next.0 - - @backstage/core-components@0.13.10 - - @backstage/catalog-model@1.4.3 - - @backstage/core-plugin-api@1.8.2 - - @backstage/errors@1.2.3 - -## 0.7.1 - -### Patch Changes - -- 4016f21: Remove some unused dependencies -- Updated dependencies - - @backstage/core-components@0.13.10 - - @backstage/core-plugin-api@1.8.2 - - @backstage/plugin-home-react@0.1.7 - - @backstage/plugin-catalog-react@1.9.3 - - @backstage/catalog-model@1.4.3 - - @backstage/errors@1.2.3 - -## 0.7.1-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-home-react@0.1.7-next.2 - - @backstage/plugin-catalog-react@1.9.3-next.2 - -## 0.7.1-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/core-plugin-api@1.8.2-next.0 - - @backstage/core-components@0.13.10-next.1 - - @backstage/plugin-catalog-react@1.9.3-next.1 - - @backstage/plugin-home-react@0.1.7-next.1 - - @backstage/catalog-model@1.4.3 - - @backstage/errors@1.2.3 - -## 0.7.1-next.0 - -### Patch Changes - -- 4016f21: Remove some unused dependencies -- Updated dependencies - - @backstage/core-components@0.13.10-next.0 - - @backstage/plugin-catalog-react@1.9.3-next.0 - - @backstage/plugin-home-react@0.1.7-next.0 - - @backstage/catalog-model@1.4.3 - - @backstage/core-plugin-api@1.8.1 - - @backstage/errors@1.2.3 - -## 0.7.0 - -### Minor Changes - -- 5fca16f: This package has been deprecated, consider using [@pagerduty/backstage-plugin](https://github.com/pagerduty/backstage-plugin) instead. - -### Patch Changes - -- Updated dependencies - - @backstage/core-plugin-api@1.8.1 - - @backstage/plugin-catalog-react@1.9.2 - - @backstage/core-components@0.13.9 - - @backstage/theme@0.5.0 - - @backstage/plugin-home-react@0.1.6 - - @backstage/catalog-model@1.4.3 - - @backstage/errors@1.2.3 - -## 0.7.0-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-home-react@0.1.6-next.3 - - @backstage/core-components@0.13.9-next.3 - - @backstage/catalog-model@1.4.3 - - @backstage/core-plugin-api@1.8.1-next.1 - - @backstage/errors@1.2.3 - - @backstage/theme@0.5.0-next.1 - - @backstage/plugin-catalog-react@1.9.2-next.3 - -## 0.7.0-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/theme@0.5.0-next.1 - - @backstage/plugin-catalog-react@1.9.2-next.2 - - @backstage/catalog-model@1.4.3 - - @backstage/core-components@0.13.9-next.2 - - @backstage/core-plugin-api@1.8.1-next.1 - - @backstage/errors@1.2.3 - - @backstage/plugin-home-react@0.1.6-next.2 - -## 0.7.0-next.1 - -### Minor Changes - -- 5fca16fdf6: This package has been deprecated, consider using [@pagerduty/backstage-plugin](https://github.com/pagerduty/backstage-plugin) instead. - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.13.9-next.1 - - @backstage/core-plugin-api@1.8.1-next.1 - - @backstage/plugin-catalog-react@1.9.2-next.1 - - @backstage/plugin-home-react@0.1.6-next.1 - - @backstage/catalog-model@1.4.3 - - @backstage/errors@1.2.3 - - @backstage/theme@0.5.0-next.0 - -## 0.6.9-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/core-plugin-api@1.8.1-next.0 - - @backstage/plugin-catalog-react@1.9.2-next.0 - - @backstage/core-components@0.13.9-next.0 - - @backstage/plugin-home-react@0.1.6-next.0 - - @backstage/theme@0.5.0-next.0 - - @backstage/catalog-model@1.4.3 - - @backstage/errors@1.2.3 - -## 0.6.7 - -### Patch Changes - -- 6c2b872153: Add official support for React 18. -- Updated dependencies - - @backstage/plugin-catalog-react@1.9.0 - - @backstage/core-components@0.13.8 - - @backstage/core-plugin-api@1.8.0 - - @backstage/plugin-home-react@0.1.5 - - @backstage/theme@0.4.4 - - @backstage/catalog-model@1.4.3 - - @backstage/errors@1.2.3 - -## 0.6.7-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.13.8-next.2 - - @backstage/plugin-catalog-react@1.9.0-next.2 - - @backstage/plugin-home-react@0.1.5-next.2 - -## 0.6.7-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.9.0-next.1 - - @backstage/core-components@0.13.8-next.1 - - @backstage/catalog-model@1.4.3 - - @backstage/core-plugin-api@1.8.0-next.0 - - @backstage/errors@1.2.3 - - @backstage/theme@0.4.4-next.0 - - @backstage/plugin-home-react@0.1.5-next.1 - -## 0.6.7-next.0 - -### Patch Changes - -- 6c2b872153: Add official support for React 18. -- Updated dependencies - - @backstage/core-components@0.13.7-next.0 - - @backstage/plugin-catalog-react@1.9.0-next.0 - - @backstage/core-plugin-api@1.8.0-next.0 - - @backstage/plugin-home-react@0.1.5-next.0 - - @backstage/theme@0.4.4-next.0 - - @backstage/catalog-model@1.4.3 - - @backstage/errors@1.2.3 - -## 0.6.6 - -### Patch Changes - -- b9ce306814: Minor fix to avoid usage of deprecated prop -- 9a1fce352e: Updated dependency `@testing-library/jest-dom` to `^6.0.0`. -- f95af4e540: Updated dependency `@testing-library/dom` to `^9.0.0`. -- Updated dependencies - - @backstage/plugin-catalog-react@1.8.5 - - @backstage/core-plugin-api@1.7.0 - - @backstage/core-components@0.13.6 - - @backstage/catalog-model@1.4.3 - - @backstage/errors@1.2.3 - - @backstage/plugin-home-react@0.1.4 - - @backstage/theme@0.4.3 - -## 0.6.6-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.13.6-next.2 - - @backstage/core-plugin-api@1.7.0-next.1 - - @backstage/catalog-model@1.4.3-next.0 - - @backstage/plugin-catalog-react@1.8.5-next.2 - - @backstage/errors@1.2.3-next.0 - - @backstage/theme@0.4.3-next.0 - - @backstage/plugin-home-react@0.1.4-next.2 - -## 0.6.6-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.13.6-next.1 - - @backstage/plugin-catalog-react@1.8.5-next.1 - - @backstage/plugin-home-react@0.1.4-next.1 - - @backstage/core-plugin-api@1.7.0-next.0 - - @backstage/catalog-model@1.4.2 - - @backstage/errors@1.2.2 - - @backstage/theme@0.4.2 - -## 0.6.6-next.0 - -### Patch Changes - -- b9ce306814: Minor fix to avoid usage of deprecated prop -- Updated dependencies - - @backstage/plugin-catalog-react@1.8.5-next.0 - - @backstage/core-plugin-api@1.7.0-next.0 - - @backstage/core-components@0.13.6-next.0 - - @backstage/plugin-home-react@0.1.4-next.0 - - @backstage/catalog-model@1.4.2 - - @backstage/errors@1.2.2 - - @backstage/theme@0.4.2 - -## 0.6.5 - -### Patch Changes - -- 3b41afed4d0c: Minor internal tweaks to improve tests -- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. -- 8cec7664e146: Removed `@types/node` dependency -- Updated dependencies - - @backstage/plugin-home-react@0.1.3 - - @backstage/plugin-catalog-react@1.8.4 - - @backstage/core-components@0.13.5 - - @backstage/catalog-model@1.4.2 - - @backstage/core-plugin-api@1.6.0 - - @backstage/errors@1.2.2 - - @backstage/theme@0.4.2 - -## 0.6.5-next.3 - -### Patch Changes - -- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. -- Updated dependencies - - @backstage/catalog-model@1.4.2-next.2 - - @backstage/core-components@0.13.5-next.3 - - @backstage/core-plugin-api@1.6.0-next.3 - - @backstage/errors@1.2.2-next.0 - - @backstage/plugin-catalog-react@1.8.4-next.3 - - @backstage/plugin-home-react@0.1.3-next.3 - - @backstage/theme@0.4.2-next.0 - -## 0.6.5-next.2 - -### Patch Changes - -- 8cec7664e146: Removed `@types/node` dependency -- Updated dependencies - - @backstage/core-components@0.13.5-next.2 - - @backstage/core-plugin-api@1.6.0-next.2 - - @backstage/plugin-home-react@0.1.3-next.2 - - @backstage/plugin-catalog-react@1.8.4-next.2 - - @backstage/catalog-model@1.4.2-next.1 - - @backstage/errors@1.2.1 - - @backstage/theme@0.4.1 - -## 0.6.5-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.8.4-next.1 - - @backstage/core-components@0.13.5-next.1 - - @backstage/plugin-home-react@0.1.3-next.1 - - @backstage/catalog-model@1.4.2-next.0 - - @backstage/core-plugin-api@1.6.0-next.1 - - @backstage/errors@1.2.1 - - @backstage/theme@0.4.1 - -## 0.6.4-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-home-react@0.1.3-next.0 - - @backstage/core-plugin-api@1.6.0-next.0 - - @backstage/core-components@0.13.5-next.0 - - @backstage/catalog-model@1.4.1 - - @backstage/errors@1.2.1 - - @backstage/theme@0.4.1 - - @backstage/plugin-catalog-react@1.8.3-next.0 - -## 0.6.2 - -### Patch Changes - -- 5003fc966741: Add new `disableChangeEvents` prop to `EntityPagerDutyCard` to hide the Change Events tab and disable fetching of change events for the PagerDuty service. -- Updated dependencies - - @backstage/plugin-home-react@0.1.2 - - @backstage/core-components@0.13.4 - - @backstage/plugin-catalog-react@1.8.1 - - @backstage/core-plugin-api@1.5.3 - - @backstage/catalog-model@1.4.1 - - @backstage/errors@1.2.1 - - @backstage/theme@0.4.1 - -## 0.6.2-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.8.1-next.1 - - @backstage/plugin-home-react@0.1.2-next.0 - -## 0.6.2-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-home-react@0.1.2-next.0 - - @backstage/core-components@0.13.4-next.0 - - @backstage/core-plugin-api@1.5.3 - - @backstage/plugin-catalog-react@1.8.1-next.0 - - @backstage/catalog-model@1.4.1 - - @backstage/errors@1.2.1 - - @backstage/theme@0.4.1 - -## 0.6.1 - -### Patch Changes - -- Updated dependencies - - @backstage/theme@0.4.1 - - @backstage/errors@1.2.1 - - @backstage/plugin-catalog-react@1.8.0 - - @backstage/core-components@0.13.3 - - @backstage/plugin-home-react@0.1.1 - - @backstage/core-plugin-api@1.5.3 - - @backstage/catalog-model@1.4.1 - -## 0.6.1-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.8.0-next.2 - - @backstage/plugin-home-react@0.1.1-next.2 - - @backstage/theme@0.4.1-next.1 - - @backstage/core-plugin-api@1.5.3-next.1 - - @backstage/core-components@0.13.3-next.2 - - @backstage/catalog-model@1.4.1-next.0 - - @backstage/errors@1.2.1-next.0 - -## 0.6.1-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/theme@0.4.1-next.0 - - @backstage/core-components@0.13.3-next.1 - - @backstage/core-plugin-api@1.5.3-next.0 - - @backstage/plugin-catalog-react@1.7.1-next.1 - - @backstage/plugin-home-react@0.1.1-next.1 - -## 0.6.1-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/errors@1.2.1-next.0 - - @backstage/core-components@0.13.3-next.0 - - @backstage/catalog-model@1.4.1-next.0 - - @backstage/core-plugin-api@1.5.2 - - @backstage/theme@0.4.0 - - @backstage/plugin-catalog-react@1.7.1-next.0 - - @backstage/plugin-home-react@0.1.1-next.0 - -## 0.6.0 - -### Minor Changes - -- 64bc274a1ee6: Adds a config schema definition so the plugin will validate with the new Backstage CLI "--strict" flag - -### Patch Changes - -- 9512f13eb3af: Add a homepage widget for the `Pagerduty` component. -- 3d11596a72b5: Update plugin installation docs to be more consistent across documentations -- Updated dependencies - - @backstage/core-plugin-api@1.5.2 - - @backstage/core-components@0.13.2 - - @backstage/theme@0.4.0 - - @backstage/plugin-catalog-react@1.7.0 - - @backstage/catalog-model@1.4.0 - - @backstage/errors@1.2.0 - - @backstage/plugin-home-react@0.1.0 - -## 0.5.12-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.13.2-next.3 - - @backstage/catalog-model@1.4.0-next.1 - - @backstage/core-plugin-api@1.5.2-next.0 - - @backstage/errors@1.2.0-next.0 - - @backstage/theme@0.4.0-next.1 - - @backstage/plugin-catalog-react@1.7.0-next.3 - - @backstage/plugin-home-react@0.1.0-next.3 - -## 0.5.12-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/theme@0.4.0-next.1 - - @backstage/plugin-catalog-react@1.7.0-next.2 - - @backstage/core-components@0.13.2-next.2 - - @backstage/plugin-home-react@0.1.0-next.2 - - @backstage/core-plugin-api@1.5.2-next.0 - -## 0.5.12-next.1 - -### Patch Changes - -- 9512f13eb3af: Add a homepage widget for the `Pagerduty` component. -- Updated dependencies - - @backstage/errors@1.2.0-next.0 - - @backstage/core-components@0.13.2-next.1 - - @backstage/plugin-catalog-react@1.7.0-next.1 - - @backstage/catalog-model@1.4.0-next.0 - - @backstage/core-plugin-api@1.5.2-next.0 - - @backstage/plugin-home-react@0.1.0-next.1 - - @backstage/theme@0.4.0-next.0 - -## 0.5.12-next.0 - -### Patch Changes - -- 3d11596a72b5: Update plugin installation docs to be more consistent across documentations -- Updated dependencies - - @backstage/plugin-catalog-react@1.7.0-next.0 - - @backstage/theme@0.4.0-next.0 - - @backstage/core-components@0.13.2-next.0 - - @backstage/core-plugin-api@1.5.1 - - @backstage/catalog-model@1.3.0 - - @backstage/errors@1.1.5 - -## 0.5.11 - -### Patch Changes - -- Updated dependencies - - @backstage/theme@0.3.0 - - @backstage/plugin-catalog-react@1.6.0 - - @backstage/core-components@0.13.1 - - @backstage/catalog-model@1.3.0 - - @backstage/core-plugin-api@1.5.1 - - @backstage/errors@1.1.5 - -## 0.5.11-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/theme@0.3.0-next.0 - - @backstage/core-components@0.13.1-next.1 - - @backstage/plugin-catalog-react@1.6.0-next.2 - - @backstage/core-plugin-api@1.5.1 - -## 0.5.11-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.13.1-next.0 - - @backstage/core-plugin-api@1.5.1 - - @backstage/plugin-catalog-react@1.6.0-next.1 - -## 0.5.11-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.6.0-next.0 - - @backstage/core-components@0.13.0 - - @backstage/core-plugin-api@1.5.1 - - @backstage/catalog-model@1.3.0 - - @backstage/errors@1.1.5 - - @backstage/theme@0.2.19 - -## 0.5.10 - -### Patch Changes - -- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) -- e0c6e8b9c3c: Update peer dependencies -- Updated dependencies - - @backstage/core-components@0.13.0 - - @backstage/plugin-catalog-react@1.5.0 - - @backstage/theme@0.2.19 - - @backstage/core-plugin-api@1.5.1 - - @backstage/catalog-model@1.3.0 - - @backstage/errors@1.1.5 - -## 0.5.10-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.5.0-next.3 - - @backstage/catalog-model@1.3.0-next.0 - - @backstage/core-components@0.13.0-next.3 - - @backstage/core-plugin-api@1.5.1-next.1 - - @backstage/errors@1.1.5 - - @backstage/theme@0.2.19-next.0 - -## 0.5.10-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.12.6-next.2 - - @backstage/plugin-catalog-react@1.4.1-next.2 - - @backstage/core-plugin-api@1.5.1-next.1 - - @backstage/catalog-model@1.2.1 - - @backstage/errors@1.1.5 - - @backstage/theme@0.2.19-next.0 - -## 0.5.10-next.1 - -### Patch Changes - -- e0c6e8b9c3c: Update peer dependencies -- Updated dependencies - - @backstage/core-components@0.12.6-next.1 - - @backstage/core-plugin-api@1.5.1-next.0 - - @backstage/plugin-catalog-react@1.4.1-next.1 - - @backstage/theme@0.2.19-next.0 - - @backstage/catalog-model@1.2.1 - - @backstage/errors@1.1.5 - -## 0.5.10-next.0 - -### Patch Changes - -- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) -- Updated dependencies - - @backstage/core-components@0.12.6-next.0 - - @backstage/plugin-catalog-react@1.4.1-next.0 - - @backstage/core-plugin-api@1.5.0 - - @backstage/catalog-model@1.2.1 - - @backstage/errors@1.1.5 - - @backstage/theme@0.2.18 - -## 0.5.9 - -### Patch Changes - -- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. -- 9c08ecbaa4b: Update readme link for discord channel -- Updated dependencies - - @backstage/core-components@0.12.5 - - @backstage/plugin-catalog-react@1.4.0 - - @backstage/errors@1.1.5 - - @backstage/core-plugin-api@1.5.0 - - @backstage/catalog-model@1.2.1 - - @backstage/theme@0.2.18 - -## 0.5.9-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.12.5-next.2 - - @backstage/plugin-catalog-react@1.4.0-next.2 - - @backstage/core-plugin-api@1.5.0-next.2 - -## 0.5.9-next.1 - -### Patch Changes - -- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. -- 9c08ecbaa4b: Update readme link for discord channel -- Updated dependencies - - @backstage/core-components@0.12.5-next.1 - - @backstage/errors@1.1.5-next.0 - - @backstage/core-plugin-api@1.4.1-next.1 - - @backstage/theme@0.2.18-next.0 - - @backstage/plugin-catalog-react@1.4.0-next.1 - - @backstage/catalog-model@1.2.1-next.1 - -## 0.5.9-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.4.0-next.0 - - @backstage/core-plugin-api@1.4.1-next.0 - - @backstage/catalog-model@1.2.1-next.0 - - @backstage/core-components@0.12.5-next.0 - - @backstage/errors@1.1.4 - - @backstage/theme@0.2.17 - -## 0.5.8 - -### Patch Changes - -- 804746dd58: The PagerDutyCard now supports an optional `readOnly` property (``) for suppressing the rendering of the "Create Incident" button from the Backstage UI. -- Updated dependencies - - @backstage/core-components@0.12.4 - - @backstage/catalog-model@1.2.0 - - @backstage/theme@0.2.17 - - @backstage/core-plugin-api@1.4.0 - - @backstage/plugin-catalog-react@1.3.0 - - @backstage/errors@1.1.4 - -## 0.5.8-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/catalog-model@1.2.0-next.1 - - @backstage/core-components@0.12.4-next.1 - - @backstage/core-plugin-api@1.3.0 - - @backstage/errors@1.1.4 - - @backstage/theme@0.2.16 - - @backstage/plugin-catalog-react@1.3.0-next.2 - -## 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 - -- Updated dependencies - - @backstage/plugin-catalog-react@1.3.0-next.0 - - @backstage/catalog-model@1.1.6-next.0 - -## 0.5.7 - -### Patch Changes - -- Updated dependencies - - @backstage/catalog-model@1.1.5 - - @backstage/plugin-catalog-react@1.2.4 - - @backstage/core-components@0.12.3 - - @backstage/core-plugin-api@1.3.0 - - @backstage/errors@1.1.4 - - @backstage/theme@0.2.16 - -## 0.5.7-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/core-plugin-api@1.3.0-next.1 - - @backstage/plugin-catalog-react@1.2.4-next.2 - - @backstage/catalog-model@1.1.5-next.1 - - @backstage/core-components@0.12.3-next.2 - - @backstage/errors@1.1.4 - - @backstage/theme@0.2.16 - -## 0.5.7-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/catalog-model@1.1.5-next.1 - - @backstage/core-components@0.12.3-next.1 - - @backstage/core-plugin-api@1.2.1-next.0 - - @backstage/errors@1.1.4 - - @backstage/theme@0.2.16 - - @backstage/plugin-catalog-react@1.2.4-next.1 - -## 0.5.7-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/catalog-model@1.1.5-next.0 - - @backstage/plugin-catalog-react@1.2.4-next.0 - - @backstage/core-components@0.12.3-next.0 - - @backstage/core-plugin-api@1.2.0 - - @backstage/errors@1.1.4 - - @backstage/theme@0.2.16 - -## 0.5.6 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.12.2 - - @backstage/plugin-catalog-react@1.2.3 - -## 0.5.5 - -### Patch Changes - -- cb716004ef: Internal refactor to improve tests -- 3280711113: Updated dependency `msw` to `^0.49.0`. -- Updated dependencies - - @backstage/core-plugin-api@1.2.0 - - @backstage/core-components@0.12.1 - - @backstage/errors@1.1.4 - - @backstage/plugin-catalog-react@1.2.2 - - @backstage/catalog-model@1.1.4 - - @backstage/theme@0.2.16 - -## 0.5.5-next.4 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.12.1-next.4 - - @backstage/plugin-catalog-react@1.2.2-next.4 - - @backstage/catalog-model@1.1.4-next.1 - - @backstage/core-plugin-api@1.2.0-next.2 - - @backstage/errors@1.1.4-next.1 - - @backstage/theme@0.2.16 - -## 0.5.5-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.12.1-next.3 - - @backstage/catalog-model@1.1.4-next.1 - - @backstage/core-plugin-api@1.2.0-next.2 - - @backstage/errors@1.1.4-next.1 - - @backstage/theme@0.2.16 - - @backstage/plugin-catalog-react@1.2.2-next.3 - -## 0.5.5-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/core-plugin-api@1.2.0-next.2 - - @backstage/core-components@0.12.1-next.2 - - @backstage/plugin-catalog-react@1.2.2-next.2 - - @backstage/catalog-model@1.1.4-next.1 - - @backstage/errors@1.1.4-next.1 - - @backstage/theme@0.2.16 - -## 0.5.5-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.12.1-next.1 - - @backstage/core-plugin-api@1.1.1-next.1 - - @backstage/plugin-catalog-react@1.2.2-next.1 - - @backstage/catalog-model@1.1.4-next.1 - - @backstage/errors@1.1.4-next.1 - - @backstage/theme@0.2.16 - -## 0.5.5-next.0 - -### Patch Changes - -- cb716004ef: Internal refactor to improve tests -- 3280711113: Updated dependency `msw` to `^0.49.0`. -- Updated dependencies - - @backstage/core-components@0.12.1-next.0 - - @backstage/core-plugin-api@1.1.1-next.0 - - @backstage/plugin-catalog-react@1.2.2-next.0 - - @backstage/catalog-model@1.1.4-next.0 - - @backstage/errors@1.1.4-next.0 - - @backstage/theme@0.2.16 - -## 0.5.4 - -### Patch Changes - -- f905853ad6: Prefer using `Link` from `@backstage/core-components` rather than material-UI. -- Updated dependencies - - @backstage/plugin-catalog-react@1.2.1 - - @backstage/core-components@0.12.0 - - @backstage/core-plugin-api@1.1.0 - - @backstage/catalog-model@1.1.3 - - @backstage/errors@1.1.3 - - @backstage/theme@0.2.16 - -## 0.5.4-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.12.0-next.1 - - @backstage/catalog-model@1.1.3-next.0 - - @backstage/core-plugin-api@1.1.0-next.0 - - @backstage/errors@1.1.3-next.0 - - @backstage/theme@0.2.16 - - @backstage/plugin-catalog-react@1.2.1-next.1 - -## 0.5.4-next.0 - -### Patch Changes - -- f905853ad6: Prefer using `Link` from `@backstage/core-components` rather than material-UI. -- Updated dependencies - - @backstage/plugin-catalog-react@1.2.1-next.0 - - @backstage/core-components@0.12.0-next.0 - - @backstage/core-plugin-api@1.1.0-next.0 - - @backstage/catalog-model@1.1.3-next.0 - - @backstage/errors@1.1.3-next.0 - - @backstage/theme@0.2.16 - -## 0.5.3 - -### Patch Changes - -- Updated dependencies - - @backstage/catalog-model@1.1.2 - - @backstage/plugin-catalog-react@1.2.0 - - @backstage/core-components@0.11.2 - - @backstage/core-plugin-api@1.0.7 - - @backstage/errors@1.1.2 - - @backstage/theme@0.2.16 - -## 0.5.3-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.2.0-next.2 - - @backstage/catalog-model@1.1.2-next.2 - - @backstage/core-components@0.11.2-next.2 - - @backstage/core-plugin-api@1.0.7-next.2 - - @backstage/errors@1.1.2-next.2 - - @backstage/theme@0.2.16 - -## 0.5.3-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.2.0-next.1 - - @backstage/core-components@0.11.2-next.1 - - @backstage/core-plugin-api@1.0.7-next.1 - - @backstage/catalog-model@1.1.2-next.1 - - @backstage/errors@1.1.2-next.1 - - @backstage/theme@0.2.16 - -## 0.5.3-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/catalog-model@1.1.2-next.0 - - @backstage/core-components@0.11.2-next.0 - - @backstage/plugin-catalog-react@1.1.5-next.0 - - @backstage/core-plugin-api@1.0.7-next.0 - - @backstage/errors@1.1.2-next.0 - - @backstage/theme@0.2.16 - -## 0.5.2 - -### Patch Changes - -- 817f3196f6: Updated React Router dependencies to be peer dependencies. -- 3f739be9d9: Minor API signatures cleanup -- 7d47def9c4: Removed dependency on `@types/jest`. -- d669d89206: Minor API signatures cleanup -- 667d917488: Updated dependency `msw` to `^0.47.0`. -- 87ec2ba4d6: Updated dependency `msw` to `^0.46.0`. -- bf5e9030eb: Updated dependency `msw` to `^0.45.0`. -- Updated dependencies - - @backstage/core-components@0.11.1 - - @backstage/core-plugin-api@1.0.6 - - @backstage/plugin-catalog-react@1.1.4 - - @backstage/catalog-model@1.1.1 - - @backstage/errors@1.1.1 - -## 0.5.2-next.3 - -### Patch Changes - -- 7d47def9c4: Removed dependency on `@types/jest`. -- Updated dependencies - - @backstage/plugin-catalog-react@1.1.4-next.2 - - @backstage/catalog-model@1.1.1-next.0 - - @backstage/core-components@0.11.1-next.3 - - @backstage/core-plugin-api@1.0.6-next.3 - - @backstage/errors@1.1.1-next.0 - -## 0.5.2-next.2 - -### Patch Changes - -- 667d917488: Updated dependency `msw` to `^0.47.0`. -- 87ec2ba4d6: Updated dependency `msw` to `^0.46.0`. -- Updated dependencies - - @backstage/core-components@0.11.1-next.2 - - @backstage/core-plugin-api@1.0.6-next.2 - -## 0.5.2-next.1 - -### Patch Changes - -- 817f3196f6: Updated React Router dependencies to be peer dependencies. -- d669d89206: Minor API signatures cleanup -- Updated dependencies - - @backstage/core-components@0.11.1-next.1 - - @backstage/core-plugin-api@1.0.6-next.1 - - @backstage/plugin-catalog-react@1.1.4-next.1 - -## 0.5.2-next.0 - -### Patch Changes - -- 3f739be9d9: Minor API signatures cleanup -- bf5e9030eb: Updated dependency `msw` to `^0.45.0`. -- Updated dependencies - - @backstage/core-plugin-api@1.0.6-next.0 - - @backstage/core-components@0.11.1-next.0 - - @backstage/plugin-catalog-react@1.1.4-next.0 - -## 0.5.1 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.11.0 - - @backstage/core-plugin-api@1.0.5 - - @backstage/plugin-catalog-react@1.1.3 - -## 0.5.1-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.1.3-next.2 - - @backstage/core-components@0.11.0-next.2 - -## 0.5.1-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/core-plugin-api@1.0.5-next.0 - - @backstage/plugin-catalog-react@1.1.3-next.0 - - @backstage/core-components@0.10.1-next.0 - -## 0.5.0 - -### Minor Changes - -- 8798f8d93f: Introduces a new annotation `pagerduty.com/service-id` that can be used instead of the `pagerduty.com/integration-key` annotation. - _Note: If both annotations are specified on a given Entity, then the `pagerduty.com/integration-key` annotation will be prefered_ - - **BREAKING** The `PagerDutyClient.fromConfig` static method now expects a `FetchApi` compatible object and has been refactored to - accept 2 arguments: config and ClientApiDependencies - The `PagerDutyClient` now relies on a `fetchApi` being available to execute `fetch` requests. - - **BREAKING** A new query method `getServiceByEntity` that is used to query for Services by either the `integrationKey` or `serviceId` - annotation values if they are defined. The `integrationKey` value is preferred currently over `serviceId`. As such, the previous - `getServiceByIntegrationKey` method has been removed. - - **BREAKING** The return values for each Client query method has been changed to return an object instead of raw values. - For example, the `getIncidentsByServiceId` query method now returns an object in the shape of `{ incidents: Incident[] }` - instead of just `Incident[]`. - This same pattern goes for `getChangeEventsByServiceId` and `getOnCallByPolicyId` functions. - - **BREAKING** All public exported types that relate to entities within PagerDuty have been prefixed with `PagerDuty` (e.g. `ServicesResponse` is now `PagerDutyServicesResponse` and `User` is now `PagerDutyUser`) - - In addition, various enhancements/bug fixes were introduced: - - - The `PagerDutyCard` component now wraps error and loading messages with an `InfoCard` to contain errors/messages. This enforces a consistent experience on the EntityPage - - If no service can be found for the provided integration key, a new Error Message Empty State component will be shown instead of an error alert - - Introduces the `fetchApi` to replace standard `window.fetch` - - ensures that Identity Authorization is respected and provided in API requests - -### Patch Changes - -- a70869e775: Updated dependency `msw` to `^0.43.0`. -- 4e9a90e307: Updated dependency `luxon` to `^3.0.0`. -- 8006d0f9bf: Updated dependency `msw` to `^0.44.0`. -- Updated dependencies - - @backstage/core-components@0.10.0 - - @backstage/catalog-model@1.1.0 - - @backstage/core-plugin-api@1.0.4 - - @backstage/plugin-catalog-react@1.1.2 - - @backstage/theme@0.2.16 - - @backstage/errors@1.1.0 - -## 0.5.0-next.3 - -### Patch Changes - -- a70869e775: Updated dependency `msw` to `^0.43.0`. -- 4e9a90e307: Updated dependency `luxon` to `^3.0.0`. -- Updated dependencies - - @backstage/core-plugin-api@1.0.4-next.0 - - @backstage/core-components@0.10.0-next.3 - - @backstage/catalog-model@1.1.0-next.3 - - @backstage/plugin-catalog-react@1.1.2-next.3 - -## 0.5.0-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.10.0-next.2 - - @backstage/catalog-model@1.1.0-next.2 - - @backstage/theme@0.2.16-next.1 - - @backstage/plugin-catalog-react@1.1.2-next.2 - -## 0.5.0-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.9.6-next.1 - - @backstage/catalog-model@1.1.0-next.1 - - @backstage/errors@1.1.0-next.0 - - @backstage/theme@0.2.16-next.0 - - @backstage/plugin-catalog-react@1.1.2-next.1 - -## 0.5.0-next.0 - -### Minor Changes - -- 8798f8d93f: Introduces a new annotation `pagerduty.com/service-id` that can be used instead of the `pagerduty.com/integration-key` annotation. - _Note: If both annotations are specified on a given Entity, then the `pagerduty.com/integration-key` annotation will be prefered_ - - **BREAKING** The `PagerDutyClient.fromConfig` static method now expects a `FetchApi` compatible object and has been refactored to - accept 2 arguments: config and ClientApiDependencies - The `PagerDutyClient` now relies on a `fetchApi` being available to execute `fetch` requests. - - **BREAKING** A new query method `getServiceByEntity` that is used to query for Services by either the `integrationKey` or `serviceId` - annotation values if they are defined. The `integrationKey` value is preferred currently over `serviceId`. As such, the previous - `getServiceByIntegrationKey` method has been removed. - - **BREAKING** The return values for each Client query method has been changed to return an object instead of raw values. - For example, the `getIncidentsByServiceId` query method now returns an object in the shape of `{ incidents: Incident[] }` - instead of just `Incident[]`. - This same pattern goes for `getChangeEventsByServiceId` and `getOnCallByPolicyId` functions. - - **BREAKING** All public exported types that relate to entities within PagerDuty have been prefixed with `PagerDuty` (e.g. `ServicesResponse` is now `PagerDutyServicesResponse` and `User` is now `PagerDutyUser`) - - In addition, various enhancements/bug fixes were introduced: - - - The `PagerDutyCard` component now wraps error and loading messages with an `InfoCard` to contain errors/messages. This enforces a consistent experience on the EntityPage - - If no service can be found for the provided integration key, a new Error Message Empty State component will be shown instead of an error alert - - Introduces the `fetchApi` to replace standard `window.fetch` - - ensures that Identity Authorization is respected and provided in API requests - -### Patch Changes - -- Updated dependencies - - @backstage/catalog-model@1.1.0-next.0 - - @backstage/core-components@0.9.6-next.0 - - @backstage/plugin-catalog-react@1.1.2-next.0 - -## 0.4.0 - -### Minor Changes - -- b157c2eb1c: **Breaking**: Use identityApi to provide auth token for pagerduty API calls. - -### Patch Changes - -- 76bf6400fe: Fix alert that was not showing after creating an incident. -- 8f7b1835df: Updated dependency `msw` to `^0.41.0`. -- Updated dependencies - - @backstage/plugin-catalog-react@1.1.1 - - @backstage/core-components@0.9.5 - - @backstage/core-plugin-api@1.0.3 - - @backstage/catalog-model@1.0.3 - -## 0.4.0-next.2 - -### Minor Changes - -- b157c2eb1c: **Breaking**: Use identityApi to provide auth token for pagerduty API calls. - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.9.5-next.2 - -## 0.3.33-next.1 - -### Patch Changes - -- 8f7b1835df: Updated dependency `msw` to `^0.41.0`. -- Updated dependencies - - @backstage/core-components@0.9.5-next.1 - - @backstage/core-plugin-api@1.0.3-next.0 - - @backstage/catalog-model@1.0.3-next.0 - - @backstage/plugin-catalog-react@1.1.1-next.1 - -## 0.3.33-next.0 - -### Patch Changes - -- 76bf6400fe: Fix alert that was not showing after creating an incident. -- Updated dependencies - - @backstage/plugin-catalog-react@1.1.1-next.0 - - @backstage/core-components@0.9.5-next.0 - -## 0.3.32 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.9.4 - - @backstage/core-plugin-api@1.0.2 - - @backstage/plugin-catalog-react@1.1.0 - - @backstage/catalog-model@1.0.2 - -## 0.3.32-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.9.4-next.1 - - @backstage/plugin-catalog-react@1.1.0-next.2 - - @backstage/catalog-model@1.0.2-next.0 - - @backstage/core-plugin-api@1.0.2-next.1 - -## 0.3.32-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.9.4-next.0 - - @backstage/core-plugin-api@1.0.2-next.0 - - @backstage/plugin-catalog-react@1.1.0-next.1 - -## 0.3.32-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.1.0-next.0 - -## 0.3.31 - -### Patch Changes - -- 24254fd433: build(deps): bump `@testing-library/user-event` from 13.5.0 to 14.0.0 -- 230ad0826f: Bump to using `@types/node` v16 -- Updated dependencies - - @backstage/plugin-catalog-react@1.0.1 - - @backstage/catalog-model@1.0.1 - - @backstage/core-components@0.9.3 - - @backstage/core-plugin-api@1.0.1 - -## 0.3.31-next.1 - -### Patch Changes - -- 24254fd433: build(deps): bump `@testing-library/user-event` from 13.5.0 to 14.0.0 -- 230ad0826f: Bump to using `@types/node` v16 -- Updated dependencies - - @backstage/core-components@0.9.3-next.2 - - @backstage/core-plugin-api@1.0.1-next.0 - - @backstage/plugin-catalog-react@1.0.1-next.3 - -## 0.3.31-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/catalog-model@1.0.1-next.0 - - @backstage/plugin-catalog-react@1.0.1-next.0 - - @backstage/core-components@0.9.3-next.0 - -## 0.3.30 - -### Patch Changes - -- a422d7ce5e: chore(deps): bump `@testing-library/react` from 11.2.6 to 12.1.3 -- Updated dependencies - - @backstage/core-components@0.9.2 - - @backstage/core-plugin-api@1.0.0 - - @backstage/plugin-catalog-react@1.0.0 - - @backstage/catalog-model@1.0.0 - -## 0.3.29 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@0.9.0 - - @backstage/core-components@0.9.1 - - @backstage/catalog-model@0.13.0 - -## 0.3.29-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@0.9.0-next.0 - - @backstage/core-components@0.9.1-next.0 - - @backstage/catalog-model@0.13.0-next.0 - -## 0.3.28 - -### Patch Changes - -- Updated dependencies - - @backstage/catalog-model@0.12.0 - - @backstage/core-components@0.9.0 - - @backstage/plugin-catalog-react@0.8.0 - - @backstage/core-plugin-api@0.8.0 - -## 0.3.27 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.8.10 - - @backstage/plugin-catalog-react@0.7.0 - - @backstage/catalog-model@0.11.0 - - @backstage/core-plugin-api@0.7.0 - -## 0.3.26 - -### Patch Changes - -- 1ed305728b: Bump `node-fetch` to version 2.6.7 and `cross-fetch` to version 3.1.5 -- c77c5c7eb6: Added `backstage.role` to `package.json` -- edeeac7e9d: Switch `luxon` dependency range to be `^2.0.2` rather than `2.0.2`. -- 7aeb491394: Replace use of deprecated `ENTITY_DEFAULT_NAMESPACE` constant with `DEFAULT_NAMESPACE`. -- Updated dependencies - - @backstage/core-components@0.8.9 - - @backstage/core-plugin-api@0.6.1 - - @backstage/plugin-catalog-react@0.6.15 - - @backstage/catalog-model@0.10.0 - - @backstage/theme@0.2.15 - -## 0.3.25 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.8.8 - - @backstage/plugin-catalog-react@0.6.14 - -## 0.3.25-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.8.8-next.0 - - @backstage/plugin-catalog-react@0.6.14-next.0 - -## 0.3.24 - -### Patch Changes - -- 5a459626bc: Fix change events tab error when change events exist -- Updated dependencies - - @backstage/core-components@0.8.7 - - @backstage/plugin-catalog-react@0.6.13 - -## 0.3.24-next.0 - -### Patch Changes - -- 5a459626bc: Fix change events tab error when change events exist -- Updated dependencies - - @backstage/core-components@0.8.7-next.0 - - @backstage/plugin-catalog-react@0.6.13-next.0 - -## 0.3.23 - -### Patch Changes - -- 51fbedc445: Migrated usage of deprecated `IdentityApi` methods. -- 013301e07b: Remove redundant `node-fetch` dependency -- Updated dependencies - - @backstage/core-components@0.8.5 - - @backstage/core-plugin-api@0.6.0 - - @backstage/plugin-catalog-react@0.6.12 - - @backstage/catalog-model@0.9.10 - -## 0.3.23-next.0 - -### Patch Changes - -- 51fbedc445: Migrated usage of deprecated `IdentityApi` methods. -- 013301e07b: Remove redundant `node-fetch` dependency -- Updated dependencies - - @backstage/core-components@0.8.5-next.0 - - @backstage/core-plugin-api@0.6.0-next.0 - - @backstage/plugin-catalog-react@0.6.12-next.0 - - @backstage/catalog-model@0.9.10-next.0 - -## 0.3.22 - -### Patch Changes - -- 7612e2856b: Clean up emptystate.svg image, removing wrong white artifact from the background -- Updated dependencies - - @backstage/core-components@0.8.4 - - @backstage/core-plugin-api@0.5.0 - - @backstage/plugin-catalog-react@0.6.11 - - @backstage/catalog-model@0.9.9 - -## 0.3.21 - -### Patch Changes - -- 4ce51ab0f1: Internal refactor of the `react-use` imports to use `react-use/lib/*` instead. -- Updated dependencies - - @backstage/core-plugin-api@0.4.1 - - @backstage/plugin-catalog-react@0.6.10 - - @backstage/core-components@0.8.3 - -## 0.3.20 - -### Patch Changes - -- Updated dependencies - - @backstage/core-plugin-api@0.4.0 - - @backstage/plugin-catalog-react@0.6.8 - - @backstage/core-components@0.8.2 - -## 0.3.19 - -### Patch Changes - -- cd450844f6: Moved React dependencies to `peerDependencies` and allow both React v16 and v17 to be used. -- dcd1a0c3f4: Minor improvement to the API reports, by not unpacking arguments directly -- Updated dependencies - - @backstage/core-components@0.8.0 - - @backstage/core-plugin-api@0.3.0 - - @backstage/plugin-catalog-react@0.6.5 - -## 0.3.18 - -### Patch Changes - -- a125278b81: Refactor out the deprecated path and icon from RouteRefs -- Updated dependencies - - @backstage/catalog-model@0.9.7 - - @backstage/plugin-catalog-react@0.6.4 - - @backstage/core-components@0.7.4 - - @backstage/core-plugin-api@0.2.0 - -## 0.3.17 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@0.6.0 - - @backstage/core-components@0.7.0 - - @backstage/theme@0.2.11 - -## 0.3.16 - -### Patch Changes - -- 81a41ec249: Added a `name` key to all extensions in order to improve Analytics API metadata. -- Updated dependencies - - @backstage/core-components@0.6.1 - - @backstage/core-plugin-api@0.1.10 - - @backstage/plugin-catalog-react@0.5.2 - - @backstage/catalog-model@0.9.4 - -## 0.3.15 - -### Patch Changes - -- Updated dependencies - - @backstage/core-plugin-api@0.1.9 - - @backstage/core-components@0.6.0 - - @backstage/plugin-catalog-react@0.5.1 - -## 0.3.14 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.5.0 - - @backstage/plugin-catalog-react@0.5.0 - - @backstage/catalog-model@0.9.3 - -## 0.3.13 - -### Patch Changes - -- 9f1362dcc1: Upgrade `@material-ui/lab` to `4.0.0-alpha.57`. -- Updated dependencies - - @backstage/core-components@0.4.2 - - @backstage/plugin-catalog-react@0.4.6 - - @backstage/core-plugin-api@0.1.8 - -## 0.3.12 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@0.4.5 - - @backstage/core-components@0.4.0 - - @backstage/catalog-model@0.9.1 - -## 0.3.11 - -### Patch Changes - -- 8bedb75ae: Update Luxon dependency to 2.x -- 56c773909: Switched `@types/react` dependency to request `*` rather than a specific version. -- Updated dependencies - - @backstage/core-components@0.3.1 - - @backstage/core-plugin-api@0.1.6 - - @backstage/plugin-catalog-react@0.4.2 - -## 0.3.10 - -### Patch Changes - -- 260c053b9: Fix All Material UI Warnings -- Updated dependencies - - @backstage/core-components@0.3.0 - - @backstage/core-plugin-api@0.1.5 - - @backstage/plugin-catalog-react@0.4.1 - -## 0.3.9 - -### Patch Changes - -- 9d40fcb1e: - Bumping `material-ui/core` version to at least `4.12.2` as they made some breaking changes in later versions which broke `Pagination` of the `Table`. - - Switching out `material-table` to `@material-table/core` for support for the later versions of `material-ui/core` - - This causes a minor API change to `@backstage/core-components` as the interface for `Table` re-exports the `prop` from the underlying `Table` components. - - `onChangeRowsPerPage` has been renamed to `onRowsPerPageChange` - - `onChangePage` has been renamed to `onPageChange` - - Migration guide is here: https://material-table-core.com/docs/breaking-changes -- Updated dependencies - - @backstage/core-components@0.2.0 - - @backstage/plugin-catalog-react@0.4.0 - - @backstage/core-plugin-api@0.1.4 - - @backstage/theme@0.2.9 - -## 0.3.8 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@0.3.0 - -## 0.3.7 - -### Patch Changes - -- d1bd7bb82: Update README -- Updated dependencies - - @backstage/core-components@0.1.5 - - @backstage/catalog-model@0.9.0 - - @backstage/plugin-catalog-react@0.2.6 - -## 0.3.6 - -### Patch Changes - -- 48c9fcd33: Migrated to use the new `@backstage/core-*` packages rather than `@backstage/core`. -- Updated dependencies - - @backstage/core-plugin-api@0.1.3 - - @backstage/catalog-model@0.8.4 - - @backstage/plugin-catalog-react@0.2.4 - -## 0.3.5 - -### Patch Changes - -- Updated dependencies [add62a455] -- Updated dependencies [cc592248b] -- Updated dependencies [17c497b81] -- Updated dependencies [704875e26] - - @backstage/catalog-model@0.8.0 - - @backstage/core@0.7.11 - - @backstage/plugin-catalog-react@0.2.0 - -## 0.3.4 - -### Patch Changes - -- 062bbf90f: chore: bump `@testing-library/user-event` from 12.8.3 to 13.1.8 -- 675a569a9: chore: bump `react-use` dependency in all packages -- Updated dependencies [062bbf90f] -- Updated dependencies [10c008a3a] -- Updated dependencies [889d89b6e] -- Updated dependencies [16be1d093] -- Updated dependencies [3f988cb63] -- Updated dependencies [675a569a9] - - @backstage/core@0.7.9 - - @backstage/plugin-catalog-react@0.1.6 - - @backstage/catalog-model@0.7.9 - -## 0.3.3 - -### Patch Changes - -- c614ede9a: Updated README to have up-to-date install instructions. -- Updated dependencies [9afcac5af] -- Updated dependencies [e0c9ed759] -- Updated dependencies [6eaecbd81] - - @backstage/core@0.7.7 - -## 0.3.2 - -### Patch Changes - -- 4c049a1a1: - Adds onClick and other props to IconLinkVertical; - - - Allows TriggerButton component to render when pager duty key is missing; - - Refactors TriggerButton and PagerDutyCard not to have shared state; - - Removes the `action` prop of the IconLinkVertical component while adding `onClick`. - - Instead of having an action including a button with onClick, now the whole component can be clickable making it easier to implement and having a better UX. - - Before: - - ```ts - const myLink: IconLinkVerticalProps = { - label: 'Click me', - action: - } - /> -); diff --git a/plugins/pagerduty/src/components/Errors/ServiceNotFoundError.tsx b/plugins/pagerduty/src/components/Errors/ServiceNotFoundError.tsx deleted file mode 100644 index ba53e6d219..0000000000 --- a/plugins/pagerduty/src/components/Errors/ServiceNotFoundError.tsx +++ /dev/null @@ -1,35 +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 React from 'react'; -import Button from '@material-ui/core/Button'; -import { EmptyState } from '@backstage/core-components'; - -export const ServiceNotFoundError = () => ( - - Read More - - } - /> -); diff --git a/plugins/pagerduty/src/components/Errors/index.ts b/plugins/pagerduty/src/components/Errors/index.ts deleted file mode 100644 index 6c35e0bfd1..0000000000 --- a/plugins/pagerduty/src/components/Errors/index.ts +++ /dev/null @@ -1,18 +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. - */ - -export { MissingTokenError } from './MissingTokenError'; -export { ServiceNotFoundError } from './ServiceNotFoundError'; diff --git a/plugins/pagerduty/src/components/Escalation/Escalation.test.tsx b/plugins/pagerduty/src/components/Escalation/Escalation.test.tsx deleted file mode 100644 index 5e780f3fa0..0000000000 --- a/plugins/pagerduty/src/components/Escalation/Escalation.test.tsx +++ /dev/null @@ -1,94 +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 React from 'react'; -import { screen, waitFor } from '@testing-library/react'; -import { EscalationPolicy } from './EscalationPolicy'; -import { TestApiRegistry, renderInTestApp } from '@backstage/test-utils'; -import { PagerDutyUser } from '../types'; -import { pagerDutyApiRef } from '../../api'; -import { ApiProvider } from '@backstage/core-app-api'; - -const mockPagerDutyApi = { - getOnCallByPolicyId: jest.fn(), -}; -const apis = TestApiRegistry.from([pagerDutyApiRef, mockPagerDutyApi]); - -describe('Escalation', () => { - it('Handles an empty response', async () => { - mockPagerDutyApi.getOnCallByPolicyId = jest - .fn() - .mockImplementationOnce(async () => ({ oncalls: [] })); - - await renderInTestApp( - - - , - ); - await waitFor(() => !screen.queryByTestId('progress')); - - expect(screen.getByText('Empty escalation policy')).toBeInTheDocument(); - expect(mockPagerDutyApi.getOnCallByPolicyId).toHaveBeenCalledWith('456'); - }); - - it('Render a list of users', async () => { - mockPagerDutyApi.getOnCallByPolicyId = jest - .fn() - .mockImplementationOnce(async () => ({ - oncalls: [ - { - user: { - name: 'person1', - id: 'p1', - summary: 'person1', - email: 'person1@example.com', - html_url: 'http://a.com/id1', - } as PagerDutyUser, - }, - ], - })); - - await renderInTestApp( - - - , - ); - await waitFor(() => !screen.queryByTestId('progress')); - - expect(screen.getByText('person1')).toBeInTheDocument(); - expect(screen.getByText('person1@example.com')).toBeInTheDocument(); - expect(mockPagerDutyApi.getOnCallByPolicyId).toHaveBeenCalledWith('abc'); - }); - - it('Handles errors', async () => { - mockPagerDutyApi.getOnCallByPolicyId = jest - .fn() - .mockRejectedValueOnce(new Error('Error message')); - - await renderInTestApp( - - - , - ); - await waitFor(() => !screen.queryByTestId('progress')); - - expect( - screen.getByText( - 'Error encountered while fetching information. Error message', - ), - ).toBeInTheDocument(); - }); -}); diff --git a/plugins/pagerduty/src/components/Escalation/EscalationPolicy.tsx b/plugins/pagerduty/src/components/Escalation/EscalationPolicy.tsx deleted file mode 100644 index 4b4f1fc99d..0000000000 --- a/plugins/pagerduty/src/components/Escalation/EscalationPolicy.tsx +++ /dev/null @@ -1,72 +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 React from 'react'; -import List from '@material-ui/core/List'; -import ListSubheader from '@material-ui/core/ListSubheader'; -import { EscalationUsersEmptyState } from './EscalationUsersEmptyState'; -import { EscalationUser } from './EscalationUser'; -import useAsync from 'react-use/esm/useAsync'; -import { pagerDutyApiRef } from '../../api'; -import Alert from '@material-ui/lab/Alert'; - -import { useApi } from '@backstage/core-plugin-api'; -import { Progress } from '@backstage/core-components'; - -type Props = { - policyId: string; -}; - -export const EscalationPolicy = ({ policyId }: Props) => { - const api = useApi(pagerDutyApiRef); - - const { - value: users, - loading, - error, - } = useAsync(async () => { - const { oncalls } = await api.getOnCallByPolicyId(policyId); - const usersItem = oncalls - .sort((a, b) => a.escalation_level - b.escalation_level) - .map(oncall => oncall.user); - - return usersItem; - }); - - if (error) { - return ( - - Error encountered while fetching information. {error.message} - - ); - } - - if (loading) { - return ; - } - - if (!users?.length) { - return ; - } - - return ( - ON CALL}> - {users!.map((user, index) => ( - - ))} - - ); -}; diff --git a/plugins/pagerduty/src/components/Escalation/EscalationUser.tsx b/plugins/pagerduty/src/components/Escalation/EscalationUser.tsx deleted file mode 100644 index 41d507b1d4..0000000000 --- a/plugins/pagerduty/src/components/Escalation/EscalationUser.tsx +++ /dev/null @@ -1,76 +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 React from 'react'; -import ListItem from '@material-ui/core/ListItem'; -import ListItemIcon from '@material-ui/core/ListItemIcon'; -import ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction'; -import Tooltip from '@material-ui/core/Tooltip'; -import ListItemText from '@material-ui/core/ListItemText'; -import IconButton from '@material-ui/core/IconButton'; -import Typography from '@material-ui/core/Typography'; -import { makeStyles } from '@material-ui/core/styles'; -import Avatar from '@material-ui/core/Avatar'; -import EmailIcon from '@material-ui/icons/Email'; -import OpenInBrowserIcon from '@material-ui/icons/OpenInBrowser'; -import { PagerDutyUser } from '../types'; - -const useStyles = makeStyles({ - listItemPrimary: { - fontWeight: 'bold', - }, -}); - -type Props = { - user: PagerDutyUser; -}; - -export const EscalationUser = ({ user }: Props) => { - const classes = useStyles(); - - return ( - - - - - - {user.name} - - } - secondary={user.email} - /> - - - - - - - - - - - - - - ); -}; diff --git a/plugins/pagerduty/src/components/Escalation/EscalationUsersEmptyState.tsx b/plugins/pagerduty/src/components/Escalation/EscalationUsersEmptyState.tsx deleted file mode 100644 index 8a32069a50..0000000000 --- a/plugins/pagerduty/src/components/Escalation/EscalationUsersEmptyState.tsx +++ /dev/null @@ -1,46 +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 React from 'react'; -import ListItem from '@material-ui/core/ListItem'; -import ListItemIcon from '@material-ui/core/ListItemIcon'; -import ListItemText from '@material-ui/core/ListItemText'; -import { makeStyles } from '@material-ui/core/styles'; -import { StatusWarning } from '@backstage/core-components'; - -const useStyles = makeStyles({ - denseListIcon: { - marginRight: 0, - display: 'flex', - flexDirection: 'column', - alignItems: 'center', - justifyContent: 'center', - }, -}); - -export const EscalationUsersEmptyState = () => { - const classes = useStyles(); - return ( - - -

- - - - ); -}; diff --git a/plugins/pagerduty/src/components/Escalation/index.ts b/plugins/pagerduty/src/components/Escalation/index.ts deleted file mode 100644 index 165ec6690b..0000000000 --- a/plugins/pagerduty/src/components/Escalation/index.ts +++ /dev/null @@ -1,17 +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. - */ - -export { EscalationPolicy } from './EscalationPolicy'; diff --git a/plugins/pagerduty/src/components/HomePagePagerDutyCard/Content.tsx b/plugins/pagerduty/src/components/HomePagePagerDutyCard/Content.tsx deleted file mode 100644 index b665a6c294..0000000000 --- a/plugins/pagerduty/src/components/HomePagePagerDutyCard/Content.tsx +++ /dev/null @@ -1,29 +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 React from 'react'; - -import { PagerDutyEntity } from '../../types'; -import { PagerDutyCard } from '../PagerDutyCard'; - -/** @public */ -export type HomePagePagerDutyCardProps = PagerDutyEntity & { - readOnly?: boolean; -}; - -/** @public */ -export const Content = (props: HomePagePagerDutyCardProps) => { - return ; -}; diff --git a/plugins/pagerduty/src/components/HomePagePagerDutyCard/index.ts b/plugins/pagerduty/src/components/HomePagePagerDutyCard/index.ts deleted file mode 100644 index e9038852a6..0000000000 --- a/plugins/pagerduty/src/components/HomePagePagerDutyCard/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * 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 { Content } from './Content'; -export type { HomePagePagerDutyCardProps } from './Content'; diff --git a/plugins/pagerduty/src/components/Incident/IncidentEmptyState.tsx b/plugins/pagerduty/src/components/Incident/IncidentEmptyState.tsx deleted file mode 100644 index 181ff6ad84..0000000000 --- a/plugins/pagerduty/src/components/Incident/IncidentEmptyState.tsx +++ /dev/null @@ -1,42 +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 React from 'react'; -import Grid from '@material-ui/core/Grid'; -import Typography from '@material-ui/core/Typography'; -import EmptyStateImage from '../../assets/emptystate.svg'; - -export const IncidentsEmptyState = () => { - return ( - - - Nice! No incidents found! - - - EmptyState - - - ); -}; diff --git a/plugins/pagerduty/src/components/Incident/IncidentListItem.tsx b/plugins/pagerduty/src/components/Incident/IncidentListItem.tsx deleted file mode 100644 index 9c524dd266..0000000000 --- a/plugins/pagerduty/src/components/Incident/IncidentListItem.tsx +++ /dev/null @@ -1,118 +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 React from 'react'; -import ListItem from '@material-ui/core/ListItem'; -import ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction'; -import Tooltip from '@material-ui/core/Tooltip'; -import ListItemText from '@material-ui/core/ListItemText'; -import IconButton from '@material-ui/core/IconButton'; -import Typography from '@material-ui/core/Typography'; -import Chip from '@material-ui/core/Chip'; -import { makeStyles } from '@material-ui/core/styles'; -import Done from '@material-ui/icons/Done'; -import Warning from '@material-ui/icons/Warning'; -import { DateTime, Duration } from 'luxon'; -import { PagerDutyIncident } from '../types'; -import OpenInBrowserIcon from '@material-ui/icons/OpenInBrowser'; -import { Link } from '@backstage/core-components'; - -const useStyles = makeStyles(theme => ({ - denseListIcon: { - marginRight: 0, - display: 'flex', - flexDirection: 'column', - alignItems: 'center', - justifyContent: 'center', - }, - listItemPrimary: { - fontWeight: 'bold', - }, - warning: { - borderColor: theme.palette.status.warning, - color: theme.palette.status.warning, - '& *': { - color: theme.palette.status.warning, - }, - }, - error: { - borderColor: theme.palette.status.error, - color: theme.palette.status.error, - '& *': { - color: theme.palette.status.error, - }, - }, -})); - -type Props = { - incident: PagerDutyIncident; -}; - -export const IncidentListItem = ({ incident }: Props) => { - const classes = useStyles(); - const duration = - new Date().getTime() - new Date(incident.created_at).getTime(); - const createdAt = DateTime.local() - .minus(Duration.fromMillis(duration)) - .toRelative({ locale: 'en' }); - const user = incident.assignments[0]?.assignee; - - return ( - - - : } - className={ - incident.status === 'triggered' - ? classes.error - : classes.warning - } - /> - {incident.title} - - } - primaryTypographyProps={{ - variant: 'body1', - className: classes.listItemPrimary, - }} - secondary={ - - Created {createdAt} and assigned to{' '} - {user?.summary ?? 'nobody'} - - } - /> - - - - - - - - - ); -}; diff --git a/plugins/pagerduty/src/components/Incident/Incidents.test.tsx b/plugins/pagerduty/src/components/Incident/Incidents.test.tsx deleted file mode 100644 index f10f48e059..0000000000 --- a/plugins/pagerduty/src/components/Incident/Incidents.test.tsx +++ /dev/null @@ -1,123 +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 React from 'react'; -import { screen, waitFor } from '@testing-library/react'; -import { Incidents } from './Incidents'; -import { TestApiRegistry, renderInTestApp } from '@backstage/test-utils'; -import { pagerDutyApiRef } from '../../api'; -import { PagerDutyIncident } from '../types'; -import { ApiProvider } from '@backstage/core-app-api'; - -const mockPagerDutyApi = { - getIncidentsByServiceId: jest.fn(), -}; -const apis = TestApiRegistry.from([pagerDutyApiRef, mockPagerDutyApi]); - -describe('Incidents', () => { - it('Renders an empty state when there are no incidents', async () => { - mockPagerDutyApi.getIncidentsByServiceId = jest - .fn() - .mockImplementationOnce(async () => ({ incidents: [] })); - - await renderInTestApp( - - - , - ); - await waitFor(() => !screen.queryByTestId('progress')); - expect(screen.getByText('Nice! No incidents found!')).toBeInTheDocument(); - }); - - it('Renders all incidents', async () => { - mockPagerDutyApi.getIncidentsByServiceId = jest - .fn() - .mockImplementationOnce(async () => ({ - incidents: [ - { - id: 'id1', - status: 'triggered', - title: 'title1', - created_at: '2020-11-06T00:00:00Z', - assignments: [ - { - assignee: { - id: 'p1', - summary: 'person1', - html_url: 'http://a.com/id1', - }, - }, - ], - html_url: 'http://a.com/id1', - serviceId: 'sId1', - }, - { - id: 'id2', - status: 'acknowledged', - title: 'title2', - created_at: '2020-11-07T00:00:00Z', - assignments: [ - { - assignee: { - id: 'p2', - summary: 'person2', - - html_url: 'http://a.com/id2', - }, - }, - ], - html_url: 'http://a.com/id2', - serviceId: 'sId2', - }, - ] as PagerDutyIncident[], - })); - await renderInTestApp( - - - , - ); - await waitFor(() => !screen.queryByTestId('progress')); - expect(screen.getByText('title1')).toBeInTheDocument(); - expect(screen.getByText('title2')).toBeInTheDocument(); - expect(screen.getByText('person1')).toBeInTheDocument(); - expect(screen.getByText('person2')).toBeInTheDocument(); - expect(screen.getByText('triggered')).toBeInTheDocument(); - expect(screen.getByText('acknowledged')).toBeInTheDocument(); - expect(screen.getByTestId('chip-triggered')).toBeInTheDocument(); - expect(screen.getByTestId('chip-acknowledged')).toBeInTheDocument(); - - // assert links, mailto and hrefs, date calculation - expect(screen.getAllByTitle('View in PagerDuty').length).toEqual(2); - }); - - it('Handle errors', async () => { - mockPagerDutyApi.getIncidentsByServiceId = jest - .fn() - .mockRejectedValueOnce(new Error('Error occurred')); - - await renderInTestApp( - - - , - ); - await waitFor(() => !screen.queryByTestId('progress')); - expect( - screen.getByText( - 'Error encountered while fetching information. Error occurred', - ), - ).toBeInTheDocument(); - }); -}); diff --git a/plugins/pagerduty/src/components/Incident/Incidents.tsx b/plugins/pagerduty/src/components/Incident/Incidents.tsx deleted file mode 100644 index 3a9cfeb443..0000000000 --- a/plugins/pagerduty/src/components/Incident/Incidents.tsx +++ /dev/null @@ -1,73 +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 React, { useEffect } from 'react'; -import List from '@material-ui/core/List'; -import ListSubheader from '@material-ui/core/ListSubheader'; -import { IncidentListItem } from './IncidentListItem'; -import { IncidentsEmptyState } from './IncidentEmptyState'; -import useAsyncFn from 'react-use/esm/useAsyncFn'; -import { pagerDutyApiRef } from '../../api'; -import Alert from '@material-ui/lab/Alert'; - -import { useApi } from '@backstage/core-plugin-api'; -import { Progress } from '@backstage/core-components'; - -type Props = { - serviceId: string; - refreshIncidents: boolean; -}; - -export const Incidents = ({ serviceId, refreshIncidents }: Props) => { - const api = useApi(pagerDutyApiRef); - - const [{ value: incidents, loading, error }, getIncidents] = useAsyncFn( - async () => { - const { incidents: foundIncidents } = await api.getIncidentsByServiceId( - serviceId, - ); - return foundIncidents; - }, - ); - - useEffect(() => { - getIncidents(); - }, [refreshIncidents, getIncidents]); - - if (error) { - return ( - - Error encountered while fetching information. {error.message} - - ); - } - - if (loading) { - return ; - } - - if (!incidents?.length) { - return ; - } - - return ( - INCIDENTS}> - {incidents!.map((incident, index) => ( - - ))} - - ); -}; diff --git a/plugins/pagerduty/src/components/Incident/index.ts b/plugins/pagerduty/src/components/Incident/index.ts deleted file mode 100644 index 3729de6e01..0000000000 --- a/plugins/pagerduty/src/components/Incident/index.ts +++ /dev/null @@ -1,17 +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. - */ - -export { Incidents } from './Incidents'; diff --git a/plugins/pagerduty/src/components/PagerDutyCard/PagerDutyCard.test.tsx b/plugins/pagerduty/src/components/PagerDutyCard/PagerDutyCard.test.tsx deleted file mode 100644 index b1f525bcfa..0000000000 --- a/plugins/pagerduty/src/components/PagerDutyCard/PagerDutyCard.test.tsx +++ /dev/null @@ -1,289 +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 React from 'react'; -import { screen, waitFor, fireEvent, act } from '@testing-library/react'; -import { PagerDutyCard } from './PagerDutyCard'; -import { NotFoundError } from '@backstage/errors'; -import { TestApiRegistry, renderInTestApp } from '@backstage/test-utils'; -import { pagerDutyApiRef, UnauthorizedError, PagerDutyClient } from '../../api'; -import { PagerDutyService, PagerDutyUser } from '../types'; - -import { alertApiRef } from '@backstage/core-plugin-api'; -import { ApiProvider } from '@backstage/core-app-api'; - -const user: PagerDutyUser = { - name: 'person1', - id: 'p1', - summary: 'person1', - email: 'person1@example.com', - html_url: 'http://a.com/id1', -}; - -const service: PagerDutyService = { - id: 'def456', - name: 'pagerduty-name', - html_url: 'www.example.com', - escalation_policy: { - id: 'def', - user: user, - html_url: 'http://a.com/id1', - }, - integrationKey: 'abc123', -}; - -const mockPagerDutyApi: Partial = { - getServiceByEntity: async () => ({ service }), - getOnCallByPolicyId: async () => ({ oncalls: [] }), - getIncidentsByServiceId: async () => ({ incidents: [] }), -}; - -const apis = TestApiRegistry.from( - [pagerDutyApiRef, mockPagerDutyApi], - [alertApiRef, {}], -); - -describe('PagerDutyCard', () => { - it('Render pagerduty', async () => { - mockPagerDutyApi.getServiceByPagerDutyEntity = jest - .fn() - .mockImplementationOnce(async () => ({ service })); - - await renderInTestApp( - - - , - ); - await waitFor(() => !screen.queryByTestId('progress')); - expect(screen.getByText('Service Directory')).toBeInTheDocument(); - expect(screen.getByText('Create Incident')).toBeInTheDocument(); - expect(screen.getByText('Nice! No incidents found!')).toBeInTheDocument(); - expect(screen.getByText('Empty escalation policy')).toBeInTheDocument(); - }); - - it('Handles custom error for missing token', async () => { - mockPagerDutyApi.getServiceByPagerDutyEntity = jest - .fn() - .mockRejectedValueOnce(new UnauthorizedError()); - - await renderInTestApp( - - - , - ); - await waitFor(() => !screen.queryByTestId('progress')); - expect( - screen.getByText('Missing or invalid PagerDuty Token'), - ).toBeInTheDocument(); - }); - - it('Handles custom NotFoundError', async () => { - mockPagerDutyApi.getServiceByPagerDutyEntity = jest - .fn() - .mockRejectedValueOnce(new NotFoundError()); - - await renderInTestApp( - - - , - ); - await waitFor(() => !screen.queryByTestId('progress')); - expect(screen.getByText('PagerDuty Service Not Found')).toBeInTheDocument(); - }); - - it('handles general error', async () => { - mockPagerDutyApi.getServiceByPagerDutyEntity = jest - .fn() - .mockRejectedValueOnce(new Error('An error occurred')); - await renderInTestApp( - - - , - ); - await waitFor(() => !screen.queryByTestId('progress')); - - expect( - screen.getByText( - 'Error encountered while fetching information. An error occurred', - ), - ).toBeInTheDocument(); - }); - - it('opens the dialog when trigger button is clicked', async () => { - mockPagerDutyApi.getServiceByPagerDutyEntity = jest - .fn() - .mockImplementationOnce(async () => ({ service })); - - await renderInTestApp( - - - , - ); - await waitFor(() => !screen.queryByTestId('progress')); - expect(screen.getByText('Service Directory')).toBeInTheDocument(); - - const triggerLink = screen.getByText('Create Incident'); - await act(async () => { - fireEvent.click(triggerLink); - }); - expect(screen.getByRole('dialog')).toBeInTheDocument(); - }); - - describe('when entity has the pagerduty.com/service-id annotation', () => { - it('Renders PagerDuty service information', async () => { - mockPagerDutyApi.getServiceByPagerDutyEntity = jest - .fn() - .mockImplementationOnce(async () => ({ service })); - - await renderInTestApp( - - - , - ); - await waitFor(() => !screen.queryByTestId('progress')); - expect(screen.getByText('Service Directory')).toBeInTheDocument(); - expect(screen.getByText('Create Incident')).toBeInTheDocument(); - expect(screen.getByText('Nice! No incidents found!')).toBeInTheDocument(); - expect(screen.getByText('Empty escalation policy')).toBeInTheDocument(); - }); - - it('Handles custom error for missing token', async () => { - mockPagerDutyApi.getServiceByPagerDutyEntity = jest - .fn() - .mockRejectedValueOnce(new UnauthorizedError()); - - await renderInTestApp( - - - , - ); - await waitFor(() => !screen.queryByTestId('progress')); - expect( - screen.getByText('Missing or invalid PagerDuty Token'), - ).toBeInTheDocument(); - }); - - it('Handles custom NotFoundError', async () => { - mockPagerDutyApi.getServiceByPagerDutyEntity = jest - .fn() - .mockRejectedValueOnce(new NotFoundError()); - - await renderInTestApp( - - - , - ); - await waitFor(() => !screen.queryByTestId('progress')); - expect( - screen.getByText('PagerDuty Service Not Found'), - ).toBeInTheDocument(); - }); - - it('handles general error', async () => { - mockPagerDutyApi.getServiceByPagerDutyEntity = jest - .fn() - .mockRejectedValueOnce(new Error('An error occurred')); - await renderInTestApp( - - - , - ); - await waitFor(() => !screen.queryByTestId('progress')); - - expect( - screen.getByText( - 'Error encountered while fetching information. An error occurred', - ), - ).toBeInTheDocument(); - }); - - it('disables the Create Incident button', async () => { - mockPagerDutyApi.getServiceByPagerDutyEntity = jest - .fn() - .mockImplementationOnce(async () => ({ service })); - - await renderInTestApp( - - - , - ); - await waitFor(() => !screen.queryByTestId('progress')); - expect( - screen.getByTitle('Must provide an integration-key to create incidents') - .className, - ).toMatch('disabled'); - }); - }); - - describe('when entity has all annotations', () => { - it('queries by integration key', async () => { - mockPagerDutyApi.getServiceByPagerDutyEntity = jest - .fn() - .mockImplementationOnce(async () => ({ service })); - - await renderInTestApp( - - - , - ); - await waitFor(() => !screen.queryByTestId('progress')); - expect(screen.getByText('Service Directory')).toBeInTheDocument(); - expect(screen.getByText('Create Incident')).toBeInTheDocument(); - expect(screen.getByText('Nice! No incidents found!')).toBeInTheDocument(); - expect(screen.getByText('Empty escalation policy')).toBeInTheDocument(); - }); - }); - - describe('when entity has all annotations but the plugin has been configured to be "read only"', () => { - it('queries by integration key but does not render the "Create Incident" button', async () => { - mockPagerDutyApi.getServiceByPagerDutyEntity = jest - .fn() - .mockImplementationOnce(async () => ({ service })); - - await renderInTestApp( - - - , - ); - await waitFor(() => !screen.queryByTestId('progress')); - expect(screen.getByText('Service Directory')).toBeInTheDocument(); - expect(screen.getByText('Nice! No incidents found!')).toBeInTheDocument(); - expect(screen.getByText('Empty escalation policy')).toBeInTheDocument(); - expect(() => screen.getByText('Create Incident')).toThrow(); - }); - }); -}); diff --git a/plugins/pagerduty/src/components/PagerDutyCard/PagerDutyCard.tsx b/plugins/pagerduty/src/components/PagerDutyCard/PagerDutyCard.tsx deleted file mode 100644 index 3e0f0c8793..0000000000 --- a/plugins/pagerduty/src/components/PagerDutyCard/PagerDutyCard.tsx +++ /dev/null @@ -1,204 +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 React, { ReactNode, useState, useCallback } from 'react'; -import Card from '@material-ui/core/Card'; -import { TabProps } from '@material-ui/core/Tab'; -import CardHeader from '@material-ui/core/CardHeader'; -import Divider from '@material-ui/core/Divider'; -import CardContent from '@material-ui/core/CardContent'; -import { Incidents } from '../Incident'; -import { EscalationPolicy } from '../Escalation'; -import useAsync from 'react-use/esm/useAsync'; -import Alert from '@material-ui/lab/Alert'; -import { pagerDutyApiRef, UnauthorizedError } from '../../api'; -import AlarmAddIcon from '@material-ui/icons/AlarmAdd'; -import { MissingTokenError, ServiceNotFoundError } from '../Errors'; -import WebIcon from '@material-ui/icons/Web'; -import DateRangeIcon from '@material-ui/icons/DateRange'; -import { TriggerDialog } from '../TriggerDialog'; -import { ChangeEvents } from '../ChangeEvents'; - -import { useApi } from '@backstage/core-plugin-api'; -import { NotFoundError } from '@backstage/errors'; -import { - Progress, - HeaderIconLinkRow, - IconLinkVerticalProps, - TabbedCard, - CardTab, - InfoCard, -} from '@backstage/core-components'; -import { PagerDutyEntity } from '../../types'; - -const BasicCard = ({ children }: { children: ReactNode }) => ( - {children} -); - -/** @public */ -export type PagerDutyCardProps = PagerDutyEntity & { - readOnly?: boolean; - disableChangeEvents?: boolean; -}; - -/** @public */ -export const PagerDutyCard = (props: PagerDutyCardProps) => { - const { readOnly, disableChangeEvents, integrationKey, name } = props; - const api = useApi(pagerDutyApiRef); - const [refreshIncidents, setRefreshIncidents] = useState(false); - const [refreshChangeEvents, setRefreshChangeEvents] = - useState(false); - const [dialogShown, setDialogShown] = useState(false); - - const showDialog = useCallback(() => { - setDialogShown(true); - }, [setDialogShown]); - const hideDialog = useCallback(() => { - setDialogShown(false); - }, [setDialogShown]); - - const handleRefresh = useCallback(() => { - setRefreshIncidents(x => !x); - setRefreshChangeEvents(x => !x); - }, []); - - const { - value: service, - loading, - error, - } = useAsync(async () => { - const { service: foundService } = await api.getServiceByPagerDutyEntity( - props, - ); - - return { - id: foundService.id, - name: foundService.name, - url: foundService.html_url, - policyId: foundService.escalation_policy.id, - policyLink: foundService.escalation_policy.html_url, - }; - }); - - if (error) { - let errorNode: ReactNode; - - switch (error.constructor) { - case UnauthorizedError: - errorNode = ; - break; - case NotFoundError: - errorNode = ; - break; - default: - errorNode = ( - - Error encountered while fetching information. {error.message} - - ); - } - - return {errorNode}; - } - - if (loading) { - return ( - - - - ); - } - - const serviceLink: IconLinkVerticalProps = { - label: 'Service Directory', - href: service!.url, - icon: , - }; - - /** - * In order to create incidents using the REST API, a valid user email address must be present. - * There is no guarantee the current user entity has a valid email association, so instead just - * only allow triggering incidents when an integration key is present. - */ - const createIncidentDisabled = !integrationKey; - const triggerLink: IconLinkVerticalProps = { - label: 'Create Incident', - onClick: showDialog, - icon: , - color: 'secondary', - disabled: createIncidentDisabled, - title: createIncidentDisabled - ? 'Must provide an integration-key to create incidents' - : '', - }; - - const escalationPolicyLink: IconLinkVerticalProps = { - label: 'Escalation Policy', - href: service!.policyLink, - icon: , - }; - - const tabs: React.ReactElement[] = [ - - - , - ]; - - if (disableChangeEvents !== true) { - tabs.push( - - - , - ); - } - - return ( - <> - - - } - /> - - - {...tabs} - - - - {!createIncidentDisabled && ( - - )} - - ); -}; diff --git a/plugins/pagerduty/src/components/PagerDutyCard/index.ts b/plugins/pagerduty/src/components/PagerDutyCard/index.ts deleted file mode 100644 index 4944a9a13d..0000000000 --- a/plugins/pagerduty/src/components/PagerDutyCard/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * 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 { PagerDutyCard, type PagerDutyCardProps } from './PagerDutyCard'; diff --git a/plugins/pagerduty/src/components/TriggerButton/index.test.tsx b/plugins/pagerduty/src/components/TriggerButton/index.test.tsx deleted file mode 100644 index 409f11ec04..0000000000 --- a/plugins/pagerduty/src/components/TriggerButton/index.test.tsx +++ /dev/null @@ -1,126 +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 React from 'react'; -import { act, fireEvent, screen, waitFor } from '@testing-library/react'; -import { renderInTestApp, TestApiRegistry } from '@backstage/test-utils'; -import { pagerDutyApiRef } from '../../api'; -import { Entity } from '@backstage/catalog-model'; -import { EntityProvider } from '@backstage/plugin-catalog-react'; -import { TriggerButton } from './'; - -import { ApiProvider } from '@backstage/core-app-api'; -import { alertApiRef } from '@backstage/core-plugin-api'; - -describe('TriggerButton', () => { - const mockTriggerAlarmFn = jest.fn(); - const mockPagerDutyApi = { - triggerAlarm: mockTriggerAlarmFn, - }; - - const apis = TestApiRegistry.from( - [alertApiRef, {}], - [pagerDutyApiRef, mockPagerDutyApi], - ); - - it('renders the trigger button, opens and closes dialog', async () => { - const entity: Entity = { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Component', - metadata: { - name: 'pagerduty-test', - annotations: { - 'pagerduty.com/integration-key': 'abc123', - }, - }, - }; - - await renderInTestApp( - - - - - , - ); - - const triggerButton = screen.getByText('Create Incident'); - expect(screen.queryByRole('dialog')).not.toBeInTheDocument(); - - await act(async () => { - fireEvent.click(triggerButton); - }); - await waitFor(() => { - expect(screen.getByRole('dialog')).toBeInTheDocument(); - }); - - const closeButton = screen.getByText('Close'); - await act(async () => { - fireEvent.click(closeButton); - }); - await waitFor(() => { - expect(screen.queryByRole('dialog')).not.toBeInTheDocument(); - }); - }); - - it('renders the trigger button with children', async () => { - const entity: Entity = { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Component', - metadata: { - name: 'pagerduty-test', - annotations: { - 'pagerduty.com/integration-key': 'abc123', - }, - }, - }; - - await renderInTestApp( - - - Send an alert - - , - ); - - expect(screen.getByText('Send an alert')).toBeInTheDocument(); - }); - - it('renders a disabled trigger button if entity does not include key', async () => { - const entity: Entity = { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Component', - metadata: { - name: 'pagerduty-test', - }, - }; - - await renderInTestApp( - - - - - , - ); - - const triggerButton = screen.getByText('Missing integration key'); - - await act(async () => { - fireEvent.click(triggerButton); - }); - await waitFor(() => { - expect(screen.queryByRole('dialog')).not.toBeInTheDocument(); - }); - }); -}); diff --git a/plugins/pagerduty/src/components/TriggerButton/index.tsx b/plugins/pagerduty/src/components/TriggerButton/index.tsx deleted file mode 100644 index 978489f77c..0000000000 --- a/plugins/pagerduty/src/components/TriggerButton/index.tsx +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import React, { useCallback, ReactNode, useState } from 'react'; -import Button from '@material-ui/core/Button'; -import { makeStyles } from '@material-ui/core/styles'; -import { usePagerdutyEntity } from '../../hooks'; -import { TriggerDialog } from '../TriggerDialog'; - -const useStyles = makeStyles(theme => ({ - buttonStyle: { - backgroundColor: theme.palette.error.main, - color: theme.palette.error.contrastText, - '&:hover': { - backgroundColor: theme.palette.error.dark, - }, - }, -})); - -/** @public */ -export function TriggerButton(props: { children?: ReactNode }) { - const { buttonStyle } = useStyles(); - const { integrationKey, name } = usePagerdutyEntity(); - const [dialogShown, setDialogShown] = useState(false); - - const showDialog = useCallback(() => { - setDialogShown(true); - }, [setDialogShown]); - const hideDialog = useCallback(() => { - setDialogShown(false); - }, [setDialogShown]); - - const disabled = !integrationKey; - return ( - <> - - {integrationKey && ( - - )} - - ); -} diff --git a/plugins/pagerduty/src/components/TriggerDialog/TriggerDialog.test.tsx b/plugins/pagerduty/src/components/TriggerDialog/TriggerDialog.test.tsx deleted file mode 100644 index 74cd5100fa..0000000000 --- a/plugins/pagerduty/src/components/TriggerDialog/TriggerDialog.test.tsx +++ /dev/null @@ -1,85 +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 React from 'react'; -import { fireEvent, act } from '@testing-library/react'; -import { renderInTestApp, TestApiRegistry } from '@backstage/test-utils'; -import { pagerDutyApiRef } from '../../api'; -import { TriggerDialog } from './TriggerDialog'; - -import { ApiProvider } from '@backstage/core-app-api'; -import { - alertApiRef, - IdentityApi, - identityApiRef, -} from '@backstage/core-plugin-api'; - -describe('TriggerDialog', () => { - const mockIdentityApi: Partial = { - getBackstageIdentity: async () => ({ - type: 'user', - userEntityRef: 'user:default/guest', - ownershipEntityRefs: [], - }), - }; - - const mockTriggerAlarmFn = jest.fn(); - const mockPagerDutyApi = { - triggerAlarm: mockTriggerAlarmFn, - }; - - const apis = TestApiRegistry.from( - [alertApiRef, {}], - [identityApiRef, mockIdentityApi], - [pagerDutyApiRef, mockPagerDutyApi], - ); - - it('open the dialog and trigger an alarm', async () => { - const { getByText, getByRole, getByTestId } = await renderInTestApp( - - {}} - onIncidentCreated={() => {}} - /> - , - ); - - expect(getByRole('dialog')).toBeInTheDocument(); - expect( - getByText('This action will trigger an incident for ', { - exact: false, - }), - ).toBeInTheDocument(); - const input = getByTestId('trigger-input'); - const description = 'Test Trigger Alarm'; - await act(async () => { - fireEvent.change(input, { target: { value: description } }); - }); - const triggerButton = getByTestId('trigger-button'); - await act(async () => { - fireEvent.click(triggerButton); - }); - expect(mockTriggerAlarmFn).toHaveBeenCalled(); - expect(mockTriggerAlarmFn).toHaveBeenCalledWith({ - integrationKey: 'abc123', - source: window.location.toString(), - description, - userName: 'guest', - }); - }); -}); diff --git a/plugins/pagerduty/src/components/TriggerDialog/TriggerDialog.tsx b/plugins/pagerduty/src/components/TriggerDialog/TriggerDialog.tsx deleted file mode 100644 index dc74f34d76..0000000000 --- a/plugins/pagerduty/src/components/TriggerDialog/TriggerDialog.tsx +++ /dev/null @@ -1,157 +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 React, { useState, useEffect } from 'react'; -import Dialog from '@material-ui/core/Dialog'; -import DialogTitle from '@material-ui/core/DialogTitle'; -import TextField from '@material-ui/core/TextField'; -import DialogActions from '@material-ui/core/DialogActions'; -import Button from '@material-ui/core/Button'; -import DialogContent from '@material-ui/core/DialogContent'; -import Typography from '@material-ui/core/Typography'; -import CircularProgress from '@material-ui/core/CircularProgress'; -import useAsyncFn from 'react-use/esm/useAsyncFn'; -import { pagerDutyApiRef } from '../../api'; -import Alert from '@material-ui/lab/Alert'; -import { - useApi, - alertApiRef, - identityApiRef, -} from '@backstage/core-plugin-api'; -import { DEFAULT_NAMESPACE, parseEntityRef } from '@backstage/catalog-model'; - -type Props = { - showDialog: boolean; - handleDialog: () => void; - onIncidentCreated?: () => void; - name: string; - integrationKey: string; -}; - -export const TriggerDialog = ({ - showDialog, - handleDialog, - onIncidentCreated: onIncidentCreated, - name, - integrationKey, -}: Props) => { - const alertApi = useApi(alertApiRef); - const identityApi = useApi(identityApiRef); - const api = useApi(pagerDutyApiRef); - const [description, setDescription] = useState(''); - - const [{ value, loading, error }, handleTriggerAlarm] = useAsyncFn( - async (descriptions: string) => { - const { userEntityRef } = await identityApi.getBackstageIdentity(); - const { name: userName } = parseEntityRef(userEntityRef, { - defaultKind: 'User', - defaultNamespace: DEFAULT_NAMESPACE, - }); - return await api.triggerAlarm({ - integrationKey: integrationKey as string, - source: window.location.toString(), - description: descriptions, - userName, - }); - }, - ); - - const descriptionChanged = ( - event: React.ChangeEvent, - ) => { - setDescription(event.target.value); - }; - - useEffect(() => { - if (value) { - (async () => { - alertApi.post({ - message: `Alarm successfully triggered`, - }); - - handleDialog(); - - // The pager duty API isn't always returning the newly created alarm immediately - await new Promise(resolve => setTimeout(resolve, 1000)); - onIncidentCreated?.(); - })(); - } - }, [value, alertApi, handleDialog, onIncidentCreated]); - - if (error) { - alertApi.post({ - message: `Failed to trigger alarm. ${error.message}`, - severity: 'error', - }); - } - - return ( - - - This action will trigger an incident for "{name}". - - - - - If the issue you are seeing does not need urgent attention, please - get in touch with the responsible team using their preferred - communications channel. You can find information about the owner of - this entity in the "About" card. If the issue is urgent, please - don't hesitate to trigger the alert. - - - - Please describe the problem you want to report. Be as descriptive as - possible. Your signed in user and a reference to the current page will - automatically be amended to the alarm so that the receiver can reach - out to you if necessary. - - - - - - - - - ); -}; diff --git a/plugins/pagerduty/src/components/TriggerDialog/index.ts b/plugins/pagerduty/src/components/TriggerDialog/index.ts deleted file mode 100644 index 5c48cce7ed..0000000000 --- a/plugins/pagerduty/src/components/TriggerDialog/index.ts +++ /dev/null @@ -1,17 +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. - */ - -export { TriggerDialog } from './TriggerDialog'; diff --git a/plugins/pagerduty/src/components/constants.ts b/plugins/pagerduty/src/components/constants.ts deleted file mode 100644 index 01308590f1..0000000000 --- a/plugins/pagerduty/src/components/constants.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -export const PAGERDUTY_INTEGRATION_KEY = 'pagerduty.com/integration-key'; -export const PAGERDUTY_SERVICE_ID = 'pagerduty.com/service-id'; diff --git a/plugins/pagerduty/src/components/index.ts b/plugins/pagerduty/src/components/index.ts deleted file mode 100644 index 264d7195e9..0000000000 --- a/plugins/pagerduty/src/components/index.ts +++ /dev/null @@ -1,35 +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. - */ - -export type { - PagerDutyChangeEvent, - PagerDutyIncident, - PagerDutyService, - PagerDutyOnCall, - PagerDutyAssignee, - PagerDutyUser, -} from './types'; - -export type { EntityPagerDutyCardProps } from './EntityPagerDutyCard'; -export type { HomePagePagerDutyCardProps } from './HomePagePagerDutyCard'; - -export { - isPluginApplicableToEntity, - isPluginApplicableToEntity as isPagerDutyAvailable, - EntityPagerDutyCard, -} from './EntityPagerDutyCard'; - -export { TriggerButton } from './TriggerButton'; diff --git a/plugins/pagerduty/src/components/pagerDutyEntity.test.ts b/plugins/pagerduty/src/components/pagerDutyEntity.test.ts deleted file mode 100644 index cf551d3d6e..0000000000 --- a/plugins/pagerduty/src/components/pagerDutyEntity.test.ts +++ /dev/null @@ -1,98 +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 { Entity } from '@backstage/catalog-model'; -import { getPagerDutyEntity } from './pagerDutyEntity'; - -const entity: Entity = { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Component', - metadata: { - name: 'pagerduty-test', - annotations: { - 'pagerduty.com/integration-key': 'abc123', - }, - }, -}; - -const entityWithoutAnnotations: Entity = { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Component', - metadata: { - name: 'pagerduty-test', - annotations: {}, - }, -}; - -const entityWithServiceId: Entity = { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Component', - metadata: { - name: 'pagerduty-test', - annotations: { - 'pagerduty.com/service-id': 'def456', - }, - }, -}; - -const entityWithAllAnnotations: Entity = { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Component', - metadata: { - name: 'pagerduty-test', - annotations: { - 'pagerduty.com/integration-key': 'abc123', - 'pagerduty.com/service-id': 'def456', - }, - }, -}; - -describe('getPagerDutyEntity', () => { - describe('when entity has no annotations', () => { - it('returns a PagerDutyEntity', () => { - expect(getPagerDutyEntity(entityWithoutAnnotations)).toEqual({ - name: 'pagerduty-test', - }); - }); - }); - - describe('when entity has integration key annotation', () => { - it('returns a PagerDutyEntity', () => { - expect(getPagerDutyEntity(entity)).toEqual({ - name: 'pagerduty-test', - integrationKey: 'abc123', - }); - }); - }); - - describe('when entity has service id annotation', () => { - it('returns a PagerDutyEntity', () => { - expect(getPagerDutyEntity(entityWithServiceId)).toEqual({ - name: 'pagerduty-test', - serviceId: 'def456', - }); - }); - }); - - describe('when entity has all annotations', () => { - it('returns a PagerDutyEntity', () => { - expect(getPagerDutyEntity(entityWithAllAnnotations)).toEqual({ - name: 'pagerduty-test', - integrationKey: 'abc123', - serviceId: 'def456', - }); - }); - }); -}); diff --git a/plugins/pagerduty/src/components/pagerDutyEntity.ts b/plugins/pagerduty/src/components/pagerDutyEntity.ts deleted file mode 100644 index 950525881e..0000000000 --- a/plugins/pagerduty/src/components/pagerDutyEntity.ts +++ /dev/null @@ -1,29 +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 { Entity } from '@backstage/catalog-model'; -import { PagerDutyEntity } from '../types'; -import { PAGERDUTY_INTEGRATION_KEY, PAGERDUTY_SERVICE_ID } from './constants'; - -export function getPagerDutyEntity(entity: Entity): PagerDutyEntity { - const { - [PAGERDUTY_INTEGRATION_KEY]: integrationKey, - [PAGERDUTY_SERVICE_ID]: serviceId, - } = entity.metadata.annotations || ({} as Record); - const name = entity.metadata.name; - - return { integrationKey, serviceId, name }; -} diff --git a/plugins/pagerduty/src/components/types.ts b/plugins/pagerduty/src/components/types.ts deleted file mode 100644 index 156b5c9b9d..0000000000 --- a/plugins/pagerduty/src/components/types.ts +++ /dev/null @@ -1,93 +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. - */ - -/** @public */ -export type PagerDutyChangeEvent = { - id: string; - integration: [ - { - service: PagerDutyService; - }, - ]; - source: string; - html_url: string; - links: [ - { - href: string; - text: string; - }, - ]; - summary: string; - timestamp: string; -}; - -/** @public */ -export type PagerDutyIncident = { - id: string; - title: string; - status: string; - html_url: string; - assignments: [ - { - assignee: PagerDutyAssignee; - }, - ]; - serviceId: string; - created_at: string; -}; - -/** @public */ -export type PagerDutyService = { - id: string; - name: string; - html_url: string; - integrationKey: string; - escalation_policy: { - id: string; - user: PagerDutyUser; - html_url: string; - }; -}; - -/** @public */ -export type PagerDutyOnCall = { - user: PagerDutyUser; - escalation_level: number; -}; - -/** @public */ -export type PagerDutyAssignee = { - id: string; - summary: string; - html_url: string; -}; - -/** @public */ -export type PagerDutyUser = { - id: string; - summary: string; - email: string; - html_url: string; - name: string; -}; - -/** @public */ -export type SubHeaderLink = { - title: string; - href?: string; - icon: React.ReactNode; - action?: React.ReactNode; -}; diff --git a/plugins/pagerduty/src/deprecated.ts b/plugins/pagerduty/src/deprecated.ts deleted file mode 100644 index e9f60f6894..0000000000 --- a/plugins/pagerduty/src/deprecated.ts +++ /dev/null @@ -1,29 +0,0 @@ -/* - * 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 { EntityPagerDutyCardProps, EntityPagerDutyCard } from './components'; - -/** - * @public - * @deprecated Please use EntityPagerDutyCard - */ -export const PagerDutyCard = EntityPagerDutyCard; - -/** - * @public - * @deprecated Please use EntityPagerDutyCardProps - */ -export type PagerDutyCardProps = EntityPagerDutyCardProps; diff --git a/plugins/pagerduty/src/hooks/index.ts b/plugins/pagerduty/src/hooks/index.ts deleted file mode 100644 index 8950e443e2..0000000000 --- a/plugins/pagerduty/src/hooks/index.ts +++ /dev/null @@ -1,25 +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 { useEntity } from '@backstage/plugin-catalog-react'; -import { PagerDutyEntity } from '../types'; -import { getPagerDutyEntity } from '../components/pagerDutyEntity'; - -export function usePagerdutyEntity(): PagerDutyEntity { - const { entity } = useEntity(); - - return getPagerDutyEntity(entity); -} diff --git a/plugins/pagerduty/src/index.ts b/plugins/pagerduty/src/index.ts deleted file mode 100644 index c6f7aef89a..0000000000 --- a/plugins/pagerduty/src/index.ts +++ /dev/null @@ -1,35 +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. - */ - -/** - * A Backstage plugin that integrates towards PagerDuty - * - * @packageDocumentation - */ - -export { - pagerDutyPlugin, - pagerDutyPlugin as plugin, - EntityPagerDutyCard, - HomePagePagerDutyCard, -} from './plugin'; - -export * from './components'; - -export * from './api'; -export * from './deprecated'; - -export type { PagerDutyEntity } from './types'; diff --git a/plugins/pagerduty/src/plugin.test.ts b/plugins/pagerduty/src/plugin.test.ts deleted file mode 100644 index c9fe003abd..0000000000 --- a/plugins/pagerduty/src/plugin.test.ts +++ /dev/null @@ -1,22 +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 { pagerDutyPlugin } from './plugin'; - -describe('pagerduty', () => { - it('should export plugin', () => { - expect(pagerDutyPlugin).toBeDefined(); - }); -}); diff --git a/plugins/pagerduty/src/plugin.ts b/plugins/pagerduty/src/plugin.ts deleted file mode 100644 index 4144eb5878..0000000000 --- a/plugins/pagerduty/src/plugin.ts +++ /dev/null @@ -1,99 +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 { pagerDutyApiRef, PagerDutyClient } from './api'; -import { - createApiFactory, - createPlugin, - createRouteRef, - discoveryApiRef, - fetchApiRef, - configApiRef, - createComponentExtension, -} from '@backstage/core-plugin-api'; -import { createCardExtension } from '@backstage/plugin-home-react'; -import { HomePagePagerDutyCardProps } from './components/HomePagePagerDutyCard/Content'; - -export const rootRouteRef = createRouteRef({ - id: 'pagerduty', -}); - -/** - * @public - * @deprecated This plugin will be removed in a future release. Please use \@pagerduty/backstage-plugin plugin instead (https://www.npmjs.com/package/\@pagerduty/backstage-plugin). - */ -export const pagerDutyPlugin = createPlugin({ - id: 'pagerduty', - apis: [ - createApiFactory({ - api: pagerDutyApiRef, - deps: { - discoveryApi: discoveryApiRef, - configApi: configApiRef, - fetchApi: fetchApiRef, - }, - factory: ({ configApi, discoveryApi, fetchApi }) => - PagerDutyClient.fromConfig(configApi, { discoveryApi, fetchApi }), - }), - ], -}); - -/** - * @public - * @deprecated This plugin and it's cards will be removed in a future release. Please use \@pagerduty/backstage-plugin plugin instead (https://www.npmjs.com/package/\@pagerduty/backstage-plugin). - */ -export const EntityPagerDutyCard = pagerDutyPlugin.provide( - createComponentExtension({ - name: 'EntityPagerDutyCard', - component: { - lazy: () => - import('./components/EntityPagerDutyCard').then( - m => m.EntityPagerDutyCard, - ), - }, - }), -); - -/** - * @public - * @deprecated This plugin and it's cards will be removed in a future release. Please use \@pagerduty/backstage-plugin plugin instead (https://www.npmjs.com/package/\@pagerduty/backstage-plugin). - */ -export const HomePagePagerDutyCard = pagerDutyPlugin.provide( - createCardExtension({ - name: 'HomePagePagerDutyCard', - title: 'PagerDuty Homepage Card', - components: () => import('./components/HomePagePagerDutyCard'), - settings: { - schema: { - title: 'PagerDuty', - type: 'object', - properties: { - integrationKey: { - title: 'PagerDuty integration key', - type: 'string', - }, - serviceId: { - title: 'PagerDuty service id', - type: 'string', - }, - name: { - title: 'PagerDuty service name', - type: 'string', - }, - }, - }, - }, - }), -); diff --git a/plugins/pagerduty/src/setupTests.ts b/plugins/pagerduty/src/setupTests.ts deleted file mode 100644 index 963c0f188b..0000000000 --- a/plugins/pagerduty/src/setupTests.ts +++ /dev/null @@ -1,17 +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 '@testing-library/jest-dom'; diff --git a/plugins/pagerduty/src/types.ts b/plugins/pagerduty/src/types.ts deleted file mode 100644 index e026a6ffbe..0000000000 --- a/plugins/pagerduty/src/types.ts +++ /dev/null @@ -1,25 +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. - */ - -/** - * @public - * @deprecated This plugin and it's types will be removed in a future release. Please use \@pagerduty/backstage-plugin plugin instead (https://www.npmjs.com/package/\@pagerduty/backstage-plugin). - */ -export type PagerDutyEntity = { - integrationKey?: string; - serviceId?: string; - name: string; -}; diff --git a/plugins/linguist-backend/.eslintrc.js b/plugins/scaffolder-backend-module-bitbucket/.eslintrc.js similarity index 100% rename from plugins/linguist-backend/.eslintrc.js rename to plugins/scaffolder-backend-module-bitbucket/.eslintrc.js diff --git a/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md new file mode 100644 index 0000000000..be4e753d60 --- /dev/null +++ b/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md @@ -0,0 +1,310 @@ +# @backstage/plugin-scaffolder-backend-module-bitbucket + +## 0.2.7 + +### Patch Changes + +- 33f958a: Improve examples to ensure consistency across all publish actions +- Updated dependencies + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.1.7 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.1.7 + - @backstage/backend-plugin-api@0.6.17 + - @backstage/integration@1.10.0 + - @backstage/plugin-scaffolder-node@0.4.3 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.2.7-next.1 + +### Patch Changes + +- 33f958a: Improve examples to ensure consistency across all publish actions +- Updated dependencies + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.1.7-next.1 + - @backstage/backend-plugin-api@0.6.17-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.1.7-next.1 + - @backstage/plugin-scaffolder-node@0.4.3-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/integration@1.10.0-next.0 + +## 0.2.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.1.7-next.0 + - @backstage/integration@1.10.0-next.0 + - @backstage/backend-plugin-api@0.6.17-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.1.7-next.0 + - @backstage/plugin-scaffolder-node@0.4.3-next.0 + +## 0.2.6 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.16 + - @backstage/plugin-scaffolder-node@0.4.2 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/integration@1.9.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.1.6 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.1.6 + +## 0.2.5 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.4.1 + - @backstage/backend-plugin-api@0.6.15 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/integration@1.9.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.1.5 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.1.5 + +## 0.2.4 + +### Patch Changes + +- 2bd1410: Removed unused dependencies +- f44589d: Introduced `createMockActionContext` to unify the way of creating scaffolder mock context. + + It will help to maintain tests in a long run during structural changes of action context. + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.4.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.1.4 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.1.4 + - @backstage/integration@1.9.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/backend-plugin-api@0.6.14 + +## 0.2.4-next.2 + +### Patch Changes + +- 2bd1410: Removed unused dependencies +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.4.0-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.1.4-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.1.4-next.2 + - @backstage/integration@1.9.1-next.2 + - @backstage/backend-plugin-api@0.6.14-next.2 + - @backstage/config@1.2.0-next.1 + - @backstage/errors@1.2.4-next.0 + +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.2.0-next.1 + - @backstage/plugin-scaffolder-node@0.4.0-next.1 + - @backstage/backend-common@0.21.4-next.1 + - @backstage/backend-plugin-api@0.6.14-next.1 + - @backstage/integration@1.9.1-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.1.4-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.1.4-next.1 + - @backstage/errors@1.2.4-next.0 + +## 0.2.3-next.0 + +### Patch Changes + +- f44589d: Introduced `createMockActionContext` to unify the way of creating scaffolder mock context. + + It will help to maintain tests in a long run during structural changes of action context. + +- Updated dependencies + - @backstage/backend-common@0.21.3-next.0 + - @backstage/errors@1.2.4-next.0 + - @backstage/plugin-scaffolder-node@0.3.3-next.0 + - @backstage/backend-plugin-api@0.6.13-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.1.3-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.1.3-next.0 + - @backstage/config@1.1.2-next.0 + - @backstage/integration@1.9.1-next.0 + +## 0.2.0 + +### Minor Changes + +- 5eb6882: Split `@backstage/plugin-scaffolder-backend-module-bitbucket` into + `@backstage/plugin-scaffolder-backend-module-bitbucket-cloud` and + `@backstage/plugin-scaffolder-backend-module-bitbucket-server`. + + `@backstage/plugin-scaffolder-backend-module-bitbucket` was **deprecated** in favor of these two replacements. + + Please use any of the two replacements depending on your needs. + + ```diff + - backend.add(import('@backstage/plugin-scaffolder-backend-module-bitbucket')); + + backend.add(import('@backstage/plugin-scaffolder-backend-module-bitbucket-cloud')); + + backend.add(import('@backstage/plugin-scaffolder-backend-module-bitbucket-server')); + ``` + +### Patch Changes + +- e9a5228: Exporting a default module for the new Backend System +- 8472188: Added or fixed the `repository` field in `package.json`. +- 6bb6f3e: Updated dependency `fs-extra` to `^11.2.0`. + Updated dependency `@types/fs-extra` to `^11.0.0`. +- fc98bb6: Enhanced the pull request action to allow for adding new content to the PR as described in this issue #21762 +- Updated dependencies + - @backstage/backend-common@0.21.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.1.0 + - @backstage/backend-plugin-api@0.6.10 + - @backstage/integration@1.9.0 + - @backstage/plugin-scaffolder-node@0.3.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.1.0 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + +## 0.2.0-next.3 + +### Patch Changes + +- 8472188: Added or fixed the `repository` field in `package.json`. +- Updated dependencies + - @backstage/backend-common@0.21.0-next.3 + - @backstage/integration@1.9.0-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.1.0-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.1.0-next.1 + - @backstage/plugin-scaffolder-node@0.3.0-next.3 + - @backstage/backend-plugin-api@0.6.10-next.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + +## 0.2.0-next.2 + +### Minor Changes + +- 5eb6882: Split `@backstage/plugin-scaffolder-backend-module-bitbucket` into + `@backstage/plugin-scaffolder-backend-module-bitbucket-cloud` and + `@backstage/plugin-scaffolder-backend-module-bitbucket-server`. + + `@backstage/plugin-scaffolder-backend-module-bitbucket` was **deprecated** in favor of these two replacements. + + Please use any of the two replacements depending on your needs. + + ```diff + - backend.add(import('@backstage/plugin-scaffolder-backend-module-bitbucket')); + + backend.add(import('@backstage/plugin-scaffolder-backend-module-bitbucket-cloud')); + + backend.add(import('@backstage/plugin-scaffolder-backend-module-bitbucket-server')); + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.1.0-next.0 + - @backstage/backend-common@0.21.0-next.2 + - @backstage/backend-plugin-api@0.6.10-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.1.0-next.0 + - @backstage/plugin-scaffolder-node@0.3.0-next.2 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.9.0-next.0 + +## 0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.10-next.1 + - @backstage/backend-common@0.21.0-next.1 + - @backstage/integration@1.9.0-next.0 + - @backstage/plugin-scaffolder-node@0.3.0-next.1 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + +## 0.1.2-next.0 + +### Patch Changes + +- e9a5228: Exporting a default module for the new Backend System +- fc98bb6: Enhanced the pull request action to allow for adding new content to the PR as described in this issue #21762 +- Updated dependencies + - @backstage/backend-common@0.21.0-next.0 + - @backstage/plugin-scaffolder-node@0.3.0-next.0 + - @backstage/backend-plugin-api@0.6.10-next.0 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + +## 0.1.1 + +### Patch Changes + +- a694f71: The Scaffolder builtin actions now contains an action for running pipelines from Bitbucket Cloud Rest API +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/plugin-scaffolder-node@0.2.10 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + +## 0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-scaffolder-node@0.2.10-next.2 + +## 0.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.1 + - @backstage/integration@1.8.0 + - @backstage/config@1.1.1 + - @backstage/plugin-scaffolder-node@0.2.10-next.1 + - @backstage/errors@1.2.3 + +## 0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.0 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + - @backstage/plugin-scaffolder-node@0.2.10-next.0 + +## 0.1.0 + +### Minor Changes + +- 219d7f0: Create new scaffolder module for external integrations + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0 + - @backstage/plugin-scaffolder-node@0.2.9 + - @backstage/integration@1.8.0 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + +## 0.1.0-next.0 + +### Minor Changes + +- 219d7f0: Create new scaffolder module for external integrations + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.2.9-next.3 + - @backstage/backend-common@0.20.0-next.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0-next.1 diff --git a/plugins/scaffolder-backend-module-bitbucket/README.md b/plugins/scaffolder-backend-module-bitbucket/README.md new file mode 100644 index 0000000000..dde4207c0a --- /dev/null +++ b/plugins/scaffolder-backend-module-bitbucket/README.md @@ -0,0 +1,8 @@ +# @backstage/plugin-scaffolder-backend-module-bitbucket + +**Deprecated!** + +Please use one of the following modules instead: + +- [@backstage/plugin-scaffolder-backend-module-bitbucket-cloud](https://www.npmjs.com/package/@backstage/plugin-scaffolder-backend-module-bitbucket-cloud) +- [@backstage/plugin-scaffolder-backend-module-bitbucket-server](https://www.npmjs.com/package/@backstage/plugin-scaffolder-backend-module-bitbucket-server). diff --git a/plugins/scaffolder-backend-module-bitbucket/api-report.md b/plugins/scaffolder-backend-module-bitbucket/api-report.md new file mode 100644 index 0000000000..ce16b0038f --- /dev/null +++ b/plugins/scaffolder-backend-module-bitbucket/api-report.md @@ -0,0 +1,59 @@ +## API Report File for "@backstage/plugin-scaffolder-backend-module-bitbucket" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { BackendFeature } from '@backstage/backend-plugin-api'; +import * as bitbucketCloud from '@backstage/plugin-scaffolder-backend-module-bitbucket-cloud'; +import * as bitbucketServer from '@backstage/plugin-scaffolder-backend-module-bitbucket-server'; +import { Config } from '@backstage/config'; +import { JsonObject } from '@backstage/types'; +import { ScmIntegrationRegistry } from '@backstage/integration'; +import { TemplateAction } from '@backstage/plugin-scaffolder-node'; + +// @public @deprecated +const bitbucketModule: () => BackendFeature; +export default bitbucketModule; + +// @public @deprecated (undocumented) +export const createBitbucketPipelinesRunAction: (options: { + integrations: ScmIntegrationRegistry; +}) => TemplateAction< + { + workspace: string; + repo_slug: string; + body?: object | undefined; + token?: string | undefined; + }, + JsonObject +>; + +// @public @deprecated +export function createPublishBitbucketAction(options: { + integrations: ScmIntegrationRegistry; + config: Config; +}): TemplateAction< + { + repoUrl: string; + description?: string | undefined; + defaultBranch?: string | undefined; + repoVisibility?: 'private' | 'public' | undefined; + sourcePath?: string | undefined; + enableLFS?: boolean | undefined; + token?: string | undefined; + gitCommitMessage?: string | undefined; + gitAuthorName?: string | undefined; + gitAuthorEmail?: string | undefined; + }, + JsonObject +>; + +// @public @deprecated (undocumented) +export const createPublishBitbucketCloudAction: typeof bitbucketCloud.createPublishBitbucketCloudAction; + +// @public @deprecated (undocumented) +export const createPublishBitbucketServerAction: typeof bitbucketServer.createPublishBitbucketServerAction; + +// @public @deprecated (undocumented) +export const createPublishBitbucketServerPullRequestAction: typeof bitbucketServer.createPublishBitbucketServerPullRequestAction; +``` diff --git a/plugins/scaffolder-backend-module-bitbucket/catalog-info.yaml b/plugins/scaffolder-backend-module-bitbucket/catalog-info.yaml new file mode 100644 index 0000000000..b0a94d1c13 --- /dev/null +++ b/plugins/scaffolder-backend-module-bitbucket/catalog-info.yaml @@ -0,0 +1,10 @@ +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: backstage-plugin-scaffolder-backend-module-bitbucket + title: '@backstage/plugin-scaffolder-backend-module-bitbucket' + description: The bitbucket module for @backstage/plugin-scaffolder-backend +spec: + lifecycle: experimental + type: backstage-backend-plugin-module + owner: maintainers diff --git a/plugins/scaffolder-backend-module-bitbucket/knip-report.md b/plugins/scaffolder-backend-module-bitbucket/knip-report.md new file mode 100644 index 0000000000..8c142397d7 --- /dev/null +++ b/plugins/scaffolder-backend-module-bitbucket/knip-report.md @@ -0,0 +1,8 @@ +# Knip report + +## Unused dependencies (1) + +| Name | Location | Severity | +| :------- | :----------- | :------- | +| fs-extra | package.json | error | + diff --git a/plugins/scaffolder-backend-module-bitbucket/package.json b/plugins/scaffolder-backend-module-bitbucket/package.json new file mode 100644 index 0000000000..4a1cfb0ee8 --- /dev/null +++ b/plugins/scaffolder-backend-module-bitbucket/package.json @@ -0,0 +1,61 @@ +{ + "name": "@backstage/plugin-scaffolder-backend-module-bitbucket", + "version": "0.2.7", + "description": "The bitbucket module for @backstage/plugin-scaffolder-backend", + "backstage": { + "role": "backend-plugin-module" + }, + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/scaffolder-backend-module-bitbucket" + }, + "license": "Apache-2.0", + "exports": { + ".": "./src/index.ts", + "./package.json": "./package.json" + }, + "main": "src/index.ts", + "types": "src/index.ts", + "typesVersions": { + "*": { + "package.json": [ + "package.json" + ] + } + }, + "files": [ + "dist" + ], + "scripts": { + "build": "backstage-cli package build", + "clean": "backstage-cli package clean", + "lint": "backstage-cli package lint", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack", + "start": "backstage-cli package start", + "test": "backstage-cli package test" + }, + "dependencies": { + "@backstage/backend-plugin-api": "workspace:^", + "@backstage/config": "workspace:^", + "@backstage/errors": "workspace:^", + "@backstage/integration": "workspace:^", + "@backstage/plugin-scaffolder-backend-module-bitbucket-cloud": "workspace:^", + "@backstage/plugin-scaffolder-backend-module-bitbucket-server": "workspace:^", + "@backstage/plugin-scaffolder-node": "workspace:^", + "fs-extra": "^11.2.0", + "node-fetch": "^2.6.7", + "yaml": "^2.0.0" + }, + "devDependencies": { + "@backstage/backend-test-utils": "workspace:^", + "@backstage/cli": "workspace:^", + "@backstage/plugin-scaffolder-node-test-utils": "workspace:^", + "msw": "^1.0.0" + }, + "deprecated": true +} diff --git a/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucket.examples.test.ts b/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucket.examples.test.ts new file mode 100644 index 0000000000..6633246d70 --- /dev/null +++ b/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucket.examples.test.ts @@ -0,0 +1,368 @@ +/* + * 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. + */ + +jest.mock('@backstage/plugin-scaffolder-node', () => { + return { + ...jest.requireActual('@backstage/plugin-scaffolder-node'), + initRepoAndPush: jest.fn().mockResolvedValue({ + commitHash: '220f19cc36b551763d157f1b5e4a4b446165dbd6', + }), + commitAndPushRepo: jest.fn().mockResolvedValue({ + commitHash: '220f19cc36b551763d157f1b5e4a4b446165dbd6', + }), + }; +}); + +import { createPublishBitbucketAction } from './bitbucket'; +import { rest } from 'msw'; +import { setupServer } from 'msw/node'; +import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; +import { ScmIntegrations } from '@backstage/integration'; +import { ConfigReader } from '@backstage/config'; +import { initRepoAndPush } from '@backstage/plugin-scaffolder-node'; +import yaml from 'yaml'; +import { sep } from 'path'; +import { examples } from './bitbucket.examples'; +import { createMockActionContext } from '@backstage/plugin-scaffolder-node-test-utils'; + +describe('publish:bitbucket', () => { + const config = new ConfigReader({ + integrations: { + bitbucket: [ + { + host: 'bitbucket.org', + token: 'tokenlols', + }, + { + host: 'hosted.bitbucket.com', + token: 'thing', + apiBaseUrl: 'https://hosted.bitbucket.com/rest/api/1.0', + }, + { + host: 'notoken.bitbucket.com', + }, + ], + }, + }); + + const integrations = ScmIntegrations.fromConfig(config); + const action = createPublishBitbucketAction({ integrations, config }); + const mockContext = createMockActionContext({ + input: { + repoUrl: 'bitbucket.org?workspace=workspace&project=project&repo=repo', + repoVisibility: 'private' as const, + }, + }); + const server = setupServer(); + setupRequestMockHandlers(server); + + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('should call initAndPush with the correct values', async () => { + server.use( + rest.post( + 'https://api.bitbucket.org/2.0/repositories/workspace/repo', + (_, res, ctx) => + res( + ctx.status(200), + ctx.set('Content-Type', 'application/json'), + ctx.json({ + links: { + html: { + href: 'https://bitbucket.org/workspace/repo', + }, + clone: [ + { + name: 'https', + href: 'https://bitbucket.org/workspace/cloneurl', + }, + ], + }, + }), + ), + ), + ); + + await action.handler({ + ...mockContext, + input: yaml.parse(examples[0].example).steps[0].input, + }); + + expect(initRepoAndPush).toHaveBeenCalledWith({ + dir: mockContext.workspacePath, + remoteUrl: 'https://bitbucket.org/workspace/cloneurl', + defaultBranch: 'master', + auth: { username: 'x-token-auth', password: 'tokenlols' }, + logger: mockContext.logger, + commitMessage: 'initial commit', + gitAuthorInfo: { email: undefined, name: undefined }, + }); + }); + + it('should call initAndPush with the correct default branch', async () => { + server.use( + rest.post( + 'https://api.bitbucket.org/2.0/repositories/workspace/repo', + (_, res, ctx) => + res( + ctx.status(200), + ctx.set('Content-Type', 'application/json'), + ctx.json({ + links: { + html: { + href: 'https://bitbucket.org/workspace/repo', + }, + clone: [ + { + name: 'https', + href: 'https://bitbucket.org/workspace/cloneurl', + }, + ], + }, + }), + ), + ), + ); + + await action.handler({ + ...mockContext, + input: yaml.parse(examples[3].example).steps[0].input, + }); + + expect(initRepoAndPush).toHaveBeenCalledWith({ + dir: mockContext.workspacePath, + remoteUrl: 'https://bitbucket.org/workspace/cloneurl', + defaultBranch: 'main', + auth: { username: 'x-token-auth', password: 'tokenlols' }, + logger: mockContext.logger, + commitMessage: 'initial commit', + gitAuthorInfo: { email: undefined, name: undefined }, + }); + }); + + it('should call initAndPush with the specified source path', async () => { + server.use( + rest.post( + 'https://api.bitbucket.org/2.0/repositories/workspace/repo', + (_, res, ctx) => + res( + ctx.status(200), + ctx.set('Content-Type', 'application/json'), + ctx.json({ + links: { + html: { + href: 'https://bitbucket.org/workspace/repo', + }, + clone: [ + { + name: 'https', + href: 'https://bitbucket.org/workspace/cloneurl', + }, + ], + }, + }), + ), + ), + ); + + await action.handler({ + ...mockContext, + input: yaml.parse(examples[4].example).steps[0].input, + }); + expect(initRepoAndPush).toHaveBeenCalledWith({ + dir: `${mockContext.workspacePath}${sep}repoRoot`, + remoteUrl: 'https://bitbucket.org/workspace/cloneurl', + auth: { username: 'x-token-auth', password: 'tokenlols' }, + logger: mockContext.logger, + defaultBranch: 'master', + commitMessage: 'initial commit', + gitAuthorInfo: { email: undefined, name: undefined }, + }); + }); + + it('should call initAndPush with the authentication token', async () => { + server.use( + rest.post( + 'https://api.bitbucket.org/2.0/repositories/workspace/repo', + (_, res, ctx) => + res( + ctx.status(200), + ctx.set('Content-Type', 'application/json'), + ctx.json({ + links: { + html: { + href: 'https://bitbucket.org/workspace/repo', + }, + clone: [ + { + name: 'https', + href: 'https://bitbucket.org/workspace/cloneurl', + }, + ], + }, + }), + ), + ), + ); + + await action.handler({ + ...mockContext, + input: yaml.parse(examples[6].example).steps[0].input, + }); + expect(initRepoAndPush).toHaveBeenCalledWith({ + dir: mockContext.workspacePath, + remoteUrl: 'https://bitbucket.org/workspace/cloneurl', + auth: { username: 'x-token-auth', password: 'your-auth-token' }, + logger: mockContext.logger, + defaultBranch: 'master', + commitMessage: 'initial commit', + gitAuthorInfo: { + email: undefined, + name: undefined, + }, + }); + }); + + it('should call initAndPush with the custom commit message', async () => { + server.use( + rest.post( + 'https://api.bitbucket.org/2.0/repositories/workspace/repo', + (_, res, ctx) => + res( + ctx.status(200), + ctx.set('Content-Type', 'application/json'), + ctx.json({ + links: { + html: { + href: 'https://bitbucket.org/workspace/repo', + }, + clone: [ + { + name: 'https', + href: 'https://bitbucket.org/workspace/cloneurl', + }, + ], + }, + }), + ), + ), + ); + + await action.handler({ + ...mockContext, + input: yaml.parse(examples[7].example).steps[0].input, + }); + + expect(initRepoAndPush).toHaveBeenCalledWith({ + dir: mockContext.workspacePath, + remoteUrl: 'https://bitbucket.org/workspace/cloneurl', + auth: { username: 'x-token-auth', password: 'tokenlols' }, + logger: mockContext.logger, + defaultBranch: 'master', + commitMessage: 'Initial commit with custom message', + gitAuthorInfo: { email: undefined, name: undefined }, + }); + }); + + it('should call initAndPush with the custom author name and email for the commit.', async () => { + server.use( + rest.post( + 'https://api.bitbucket.org/2.0/repositories/workspace/repo', + (_, res, ctx) => + res( + ctx.status(200), + ctx.set('Content-Type', 'application/json'), + ctx.json({ + links: { + html: { + href: 'https://bitbucket.org/workspace/repo', + }, + clone: [ + { + name: 'https', + href: 'https://bitbucket.org/workspace/cloneurl', + }, + ], + }, + }), + ), + ), + ); + + await action.handler({ + ...mockContext, + input: yaml.parse(examples[8].example).steps[0].input, + }); + + expect(initRepoAndPush).toHaveBeenCalledWith({ + dir: mockContext.workspacePath, + remoteUrl: 'https://bitbucket.org/workspace/cloneurl', + auth: { username: 'x-token-auth', password: 'tokenlols' }, + logger: mockContext.logger, + defaultBranch: 'master', + commitMessage: 'initial commit', + gitAuthorInfo: { email: 'your.email@example.com', name: 'Your Name' }, + }); + }); + + describe('LFS for hosted bitbucket', () => { + const repoCreationResponse = { + links: { + self: [ + { + href: 'https://bitbucket.mycompany.com/projects/project/repos/repo', + }, + ], + clone: [ + { + name: 'http', + href: 'https://bitbucket.mycompany.com/scm/project/repo', + }, + ], + }, + }; + + it('should call the correct APIs to enable LFS if requested and the host is hosted bitbucket', async () => { + expect.assertions(1); + server.use( + rest.post( + 'https://hosted.bitbucket.com/rest/api/1.0/projects/project/repos', + (_, res, ctx) => { + return res( + ctx.status(201), + ctx.set('Content-Type', 'application/json'), + ctx.json(repoCreationResponse), + ); + }, + ), + rest.put( + 'https://hosted.bitbucket.com/rest/git-lfs/admin/projects/project/repos/repo/enabled', + (req, res, ctx) => { + expect(req.headers.get('Authorization')).toBe('Bearer thing'); + return res(ctx.status(204)); + }, + ), + ); + + await action.handler({ + ...mockContext, + input: yaml.parse(examples[5].example).steps[0].input, + }); + }); + }); +}); diff --git a/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucket.examples.ts b/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucket.examples.ts new file mode 100644 index 0000000000..12f9472398 --- /dev/null +++ b/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucket.examples.ts @@ -0,0 +1,203 @@ +/* + * 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 { TemplateExample } from '@backstage/plugin-scaffolder-node'; +import yaml from 'yaml'; + +export const examples: TemplateExample[] = [ + { + description: + 'Initializes a git repository with the content in the workspace, and publishes it to Bitbucket with the default configuration.', + example: yaml.stringify({ + steps: [ + { + id: 'publish', + action: 'publish:bitbucket', + name: 'Publish to Bitbucket', + input: { + repoUrl: + 'bitbucket.org?repo=repo&workspace=workspace&project=project', + }, + }, + ], + }), + }, + { + description: 'Initializes a Bitbucket repository with a description.', + example: yaml.stringify({ + steps: [ + { + id: 'publish', + action: 'publish:bitbucket', + name: 'Publish to Bitbucket', + input: { + repoUrl: + 'bitbucket.org?repo=repo&workspace=workspace&project=project', + description: 'Initialize a git repository', + }, + }, + ], + }), + }, + { + description: + 'Initializes a Bitbucket repository with public repo visibility, if not set defaults to private', + example: yaml.stringify({ + steps: [ + { + id: 'publish', + action: 'publish:bitbucket', + name: 'Publish to Bitbucket', + input: { + repoUrl: + 'bitbucket.org?repo=repo&workspace=workspace&project=project', + repoVisibility: 'public', + }, + }, + ], + }), + }, + { + description: + 'Initializes a Bitbucket repository with a default branch, if not set defaults to master', + example: yaml.stringify({ + steps: [ + { + id: 'publish', + action: 'publish:bitbucket', + name: 'Publish to Bitbucket', + input: { + repoUrl: + 'bitbucket.org?repo=repo&workspace=workspace&project=project', + defaultBranch: 'main', + }, + }, + ], + }), + }, + { + description: + 'Path within the workspace that will be used as the repository root. If omitted, the entire workspace will be published as the repository', + example: yaml.stringify({ + steps: [ + { + id: 'publish', + action: 'publish:bitbucket', + name: 'Publish to Bitbucket', + input: { + repoUrl: + 'bitbucket.org?repo=repo&workspace=workspace&project=project', + sourcePath: './repoRoot', + }, + }, + ], + }), + }, + { + description: 'Initializes a Bitbucket repository with LFS enabled', + example: yaml.stringify({ + steps: [ + { + id: 'publish', + action: 'publish:bitbucket', + name: 'Publish to Bitbucket', + input: { + repoUrl: 'hosted.bitbucket.com?project=project&repo=repo', + enableLFS: true, + }, + }, + ], + }), + }, + { + description: + 'Initializes a Bitbucket repository with a custom authentication token', + example: yaml.stringify({ + steps: [ + { + id: 'publish', + action: 'publish:bitbucket', + name: 'Publish to Bitbucket', + input: { + repoUrl: + 'bitbucket.org?repo=repo&workspace=workspace&project=project', + token: 'your-auth-token', + }, + }, + ], + }), + }, + { + description: + 'Initializes a Bitbucket repository with an initial commit message, if not set defaults to `initial commit`', + example: yaml.stringify({ + steps: [ + { + id: 'publish', + action: 'publish:bitbucket', + name: 'Publish to Bitbucket', + input: { + repoUrl: + 'bitbucket.org?repo=repo&workspace=workspace&project=project', + gitCommitMessage: 'Initial commit with custom message', + }, + }, + ], + }), + }, + { + description: 'Initializes a Bitbucket repository with a custom author', + example: yaml.stringify({ + steps: [ + { + id: 'publish', + action: 'publish:bitbucket', + name: 'Publish to Bitbucket', + input: { + repoUrl: + 'bitbucket.org?repo=repo&workspace=workspace&project=project', + gitAuthorName: 'Your Name', + gitAuthorEmail: 'your.email@example.com', + }, + }, + ], + }), + }, + { + description: + 'Initializes a Bitbucket repository with all proporties being set', + example: yaml.stringify({ + steps: [ + { + id: 'publish', + action: 'publish:bitbucket', + name: 'Publish to Bitbucket', + input: { + repoUrl: + 'bitbucket.org?repo=repo&workspace=workspace&project=project', + description: 'Initialize a git repository', + repoVisibility: 'public', + defaultBranch: 'main', + token: 'your-auth-token', + gitCommitMessage: 'Initial commit with custom message', + gitAuthorName: 'Your Name', + gitAuthorEmail: 'your.email@example.com', + }, + }, + ], + }), + }, +]; diff --git a/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucket.test.ts b/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucket.test.ts new file mode 100644 index 0000000000..a63d657904 --- /dev/null +++ b/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucket.test.ts @@ -0,0 +1,619 @@ +/* + * 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. + */ + +jest.mock('@backstage/plugin-scaffolder-node', () => { + return { + ...jest.requireActual('@backstage/plugin-scaffolder-node'), + initRepoAndPush: jest.fn().mockResolvedValue({ + commitHash: '220f19cc36b551763d157f1b5e4a4b446165dbd6', + }), + commitAndPushRepo: jest.fn().mockResolvedValue({ + commitHash: '220f19cc36b551763d157f1b5e4a4b446165dbd6', + }), + }; +}); +import { createPublishBitbucketAction } from './bitbucket'; +import { rest } from 'msw'; +import { setupServer } from 'msw/node'; +import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; +import { ScmIntegrations } from '@backstage/integration'; +import { ConfigReader } from '@backstage/config'; +import { initRepoAndPush } from '@backstage/plugin-scaffolder-node'; +import { createMockActionContext } from '@backstage/plugin-scaffolder-node-test-utils'; + +describe('publish:bitbucket', () => { + const config = new ConfigReader({ + integrations: { + bitbucket: [ + { + host: 'bitbucket.org', + token: 'tokenlols', + }, + { + host: 'hosted.bitbucket.com', + token: 'thing', + apiBaseUrl: 'https://hosted.bitbucket.com/rest/api/1.0', + }, + { + host: 'notoken.bitbucket.com', + }, + ], + }, + }); + + const integrations = ScmIntegrations.fromConfig(config); + const action = createPublishBitbucketAction({ integrations, config }); + const mockContext = createMockActionContext({ + input: { + repoUrl: 'bitbucket.org?workspace=workspace&project=project&repo=repo', + repoVisibility: 'private' as const, + }, + }); + const server = setupServer(); + setupRequestMockHandlers(server); + + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('should throw an error when the repoUrl is not well formed', async () => { + await expect( + action.handler({ + ...mockContext, + input: { repoUrl: 'bitbucket.org?project=project&repo=repo' }, + }), + ).rejects.toThrow(/missing workspace/); + + await expect( + action.handler({ + ...mockContext, + input: { repoUrl: 'bitbucket.org?workspace=workspace&repo=repo' }, + }), + ).rejects.toThrow(/missing project/); + + await expect( + action.handler({ + ...mockContext, + input: { repoUrl: 'bitbucket.org?workspace=workspace&project=project' }, + }), + ).rejects.toThrow(/missing repo/); + }); + + it('should throw if there is no integration config provided', async () => { + await expect( + action.handler({ + ...mockContext, + input: { + repoUrl: 'missing.com?workspace=workspace&project=project&repo=repo', + }, + }), + ).rejects.toThrow(/No matching integration configuration/); + }); + + it('should throw if there is no token in the integration config that is returned', async () => { + await expect( + action.handler({ + ...mockContext, + input: { + repoUrl: + 'notoken.bitbucket.com?workspace=workspace&project=project&repo=repo', + }, + }), + ).rejects.toThrow(/Authorization has not been provided for Bitbucket/); + }); + + it('should call the correct APIs when the host is bitbucket cloud', async () => { + expect.assertions(2); + server.use( + rest.post( + 'https://api.bitbucket.org/2.0/repositories/workspace/repo', + (req, res, ctx) => { + expect(req.headers.get('Authorization')).toBe('Bearer tokenlols'); + expect(req.body).toEqual({ + is_private: true, + scm: 'git', + project: { key: 'project' }, + }); + return res( + ctx.status(200), + ctx.set('Content-Type', 'application/json'), + ctx.json({ + links: { + html: { + href: 'https://bitbucket.org/workspace/repo', + }, + clone: [ + { + name: 'https', + href: 'https://bitbucket.org/workspace/repo', + }, + ], + }, + }), + ); + }, + ), + ); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + repoUrl: 'bitbucket.org?workspace=workspace&project=project&repo=repo', + }, + }); + }); + + it('should call the correct APIs when the host is hosted bitbucket', async () => { + expect.assertions(2); + server.use( + rest.post( + 'https://hosted.bitbucket.com/rest/api/1.0/projects/project/repos', + (req, res, ctx) => { + expect(req.headers.get('Authorization')).toBe('Bearer thing'); + expect(req.body).toEqual({ public: false, name: 'repo' }); + return res( + ctx.status(201), + ctx.set('Content-Type', 'application/json'), + ctx.json({ + links: { + self: [ + { + href: 'https://bitbucket.mycompany.com/projects/project/repos/repo', + }, + ], + clone: [ + { + name: 'http', + href: 'https://bitbucket.mycompany.com/scm/project/repo', + }, + ], + }, + }), + ); + }, + ), + ); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + repoUrl: 'hosted.bitbucket.com?project=project&repo=repo', + }, + }); + }); + + it('should work if the token is provided through ctx.input', async () => { + expect.assertions(2); + server.use( + rest.post( + 'https://notoken.bitbucket.com/rest/api/1.0/projects/project/repos', + (req, res, ctx) => { + expect(req.headers.get('Authorization')).toBe('Bearer lols'); + expect(req.body).toEqual({ public: false, name: 'repo' }); + return res( + ctx.status(201), + ctx.set('Content-Type', 'application/json'), + ctx.json({ + links: { + self: [ + { + href: 'https://bitbucket.mycompany.com/projects/project/repos/repo', + }, + ], + clone: [ + { + name: 'http', + href: 'https://bitbucket.mycompany.com/scm/project/repo', + }, + ], + }, + }), + ); + }, + ), + ); + await action.handler({ + ...mockContext, + input: { + repoUrl: 'notoken.bitbucket.com?project=project&repo=repo', + token: 'lols', + }, + }); + }); + + describe('LFS for hosted bitbucket', () => { + const repoCreationResponse = { + links: { + self: [ + { + href: 'https://bitbucket.mycompany.com/projects/project/repos/repo', + }, + ], + clone: [ + { + name: 'http', + href: 'https://bitbucket.mycompany.com/scm/project/repo', + }, + ], + }, + }; + + it('should call the correct APIs to enable LFS if requested and the host is hosted bitbucket', async () => { + expect.assertions(1); + server.use( + rest.post( + 'https://hosted.bitbucket.com/rest/api/1.0/projects/project/repos', + (_, res, ctx) => { + return res( + ctx.status(201), + ctx.set('Content-Type', 'application/json'), + ctx.json(repoCreationResponse), + ); + }, + ), + rest.put( + 'https://hosted.bitbucket.com/rest/git-lfs/admin/projects/project/repos/repo/enabled', + (req, res, ctx) => { + expect(req.headers.get('Authorization')).toBe('Bearer thing'); + return res(ctx.status(204)); + }, + ), + ); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + repoUrl: 'hosted.bitbucket.com?project=project&repo=repo', + enableLFS: true, + }, + }); + }); + + it('should report an error if enabling LFS fails', async () => { + server.use( + rest.post( + 'https://hosted.bitbucket.com/rest/api/1.0/projects/project/repos', + (_, res, ctx) => { + return res( + ctx.status(201), + ctx.set('Content-Type', 'application/json'), + ctx.json(repoCreationResponse), + ); + }, + ), + rest.put( + 'https://hosted.bitbucket.com/rest/git-lfs/admin/projects/project/repos/repo/enabled', + (_, res, ctx) => { + return res(ctx.status(500)); + }, + ), + ); + + await expect( + action.handler({ + ...mockContext, + input: { + ...mockContext.input, + repoUrl: 'hosted.bitbucket.com?project=project&repo=repo', + enableLFS: true, + }, + }), + ).rejects.toThrow(/Failed to enable LFS/); + }); + }); + + it('should call initAndPush with the correct values', async () => { + server.use( + rest.post( + 'https://api.bitbucket.org/2.0/repositories/workspace/repo', + (_, res, ctx) => + res( + ctx.status(200), + ctx.set('Content-Type', 'application/json'), + ctx.json({ + links: { + html: { + href: 'https://bitbucket.org/workspace/repo', + }, + clone: [ + { + name: 'https', + href: 'https://bitbucket.org/workspace/cloneurl', + }, + ], + }, + }), + ), + ), + ); + + await action.handler(mockContext); + + expect(initRepoAndPush).toHaveBeenCalledWith({ + dir: mockContext.workspacePath, + remoteUrl: 'https://bitbucket.org/workspace/cloneurl', + defaultBranch: 'master', + auth: { username: 'x-token-auth', password: 'tokenlols' }, + logger: mockContext.logger, + commitMessage: 'initial commit', + gitAuthorInfo: {}, + }); + }); + + it('should call initAndPush with the correct default branch', async () => { + server.use( + rest.post( + 'https://api.bitbucket.org/2.0/repositories/workspace/repo', + (_, res, ctx) => + res( + ctx.status(200), + ctx.set('Content-Type', 'application/json'), + ctx.json({ + links: { + html: { + href: 'https://bitbucket.org/workspace/repo', + }, + clone: [ + { + name: 'https', + href: 'https://bitbucket.org/workspace/cloneurl', + }, + ], + }, + }), + ), + ), + ); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + defaultBranch: 'main', + }, + }); + + expect(initRepoAndPush).toHaveBeenCalledWith({ + dir: mockContext.workspacePath, + remoteUrl: 'https://bitbucket.org/workspace/cloneurl', + defaultBranch: 'main', + auth: { username: 'x-token-auth', password: 'tokenlols' }, + logger: mockContext.logger, + commitMessage: 'initial commit', + gitAuthorInfo: {}, + }); + }); + + it('should call initAndPush with the configured defaultAuthor', async () => { + const customAuthorConfig = new ConfigReader({ + integrations: { + bitbucket: [ + { + host: 'bitbucket.org', + token: 'tokenlols', + }, + { + host: 'hosted.bitbucket.com', + token: 'thing', + apiBaseUrl: 'https://hosted.bitbucket.com/rest/api/1.0', + }, + { + host: 'notoken.bitbucket.com', + }, + ], + }, + scaffolder: { + defaultAuthor: { + name: 'Test', + email: 'example@example.com', + }, + }, + }); + + const customAuthorIntegrations = + ScmIntegrations.fromConfig(customAuthorConfig); + const customAuthorAction = createPublishBitbucketAction({ + integrations: customAuthorIntegrations, + config: customAuthorConfig, + }); + + server.use( + rest.post( + 'https://api.bitbucket.org/2.0/repositories/workspace/repo', + (_, res, ctx) => + res( + ctx.status(200), + ctx.set('Content-Type', 'application/json'), + ctx.json({ + links: { + html: { + href: 'https://bitbucket.org/workspace/repo', + }, + clone: [ + { + name: 'https', + href: 'https://bitbucket.org/workspace/cloneurl', + }, + ], + }, + }), + ), + ), + ); + + await customAuthorAction.handler(mockContext); + + expect(initRepoAndPush).toHaveBeenCalledWith({ + dir: mockContext.workspacePath, + remoteUrl: 'https://bitbucket.org/workspace/cloneurl', + auth: { username: 'x-token-auth', password: 'tokenlols' }, + logger: mockContext.logger, + defaultBranch: 'master', + commitMessage: 'initial commit', + gitAuthorInfo: { name: 'Test', email: 'example@example.com' }, + }); + }); + + it('should call initAndPush with the configured defaultCommitMessage', async () => { + const customAuthorConfig = new ConfigReader({ + integrations: { + bitbucket: [ + { + host: 'bitbucket.org', + token: 'tokenlols', + }, + { + host: 'hosted.bitbucket.com', + token: 'thing', + apiBaseUrl: 'https://hosted.bitbucket.com/rest/api/1.0', + }, + { + host: 'notoken.bitbucket.com', + }, + ], + }, + scaffolder: { + defaultCommitMessage: 'Test commit message', + }, + }); + + const customAuthorIntegrations = + ScmIntegrations.fromConfig(customAuthorConfig); + const customAuthorAction = createPublishBitbucketAction({ + integrations: customAuthorIntegrations, + config: customAuthorConfig, + }); + + server.use( + rest.post( + 'https://api.bitbucket.org/2.0/repositories/workspace/repo', + (_, res, ctx) => + res( + ctx.status(200), + ctx.set('Content-Type', 'application/json'), + ctx.json({ + links: { + html: { + href: 'https://bitbucket.org/workspace/repo', + }, + clone: [ + { + name: 'https', + href: 'https://bitbucket.org/workspace/cloneurl', + }, + ], + }, + }), + ), + ), + ); + + await customAuthorAction.handler(mockContext); + + expect(initRepoAndPush).toHaveBeenCalledWith({ + dir: mockContext.workspacePath, + remoteUrl: 'https://bitbucket.org/workspace/cloneurl', + auth: { username: 'x-token-auth', password: 'tokenlols' }, + logger: mockContext.logger, + defaultBranch: 'master', + commitMessage: 'initial commit', + gitAuthorInfo: { email: undefined, name: undefined }, + }); + }); + + it('should call outputs with the correct urls', async () => { + server.use( + rest.post( + 'https://api.bitbucket.org/2.0/repositories/workspace/repo', + (_, res, ctx) => + res( + ctx.status(200), + ctx.set('Content-Type', 'application/json'), + ctx.json({ + links: { + html: { + href: 'https://bitbucket.org/workspace/repo', + }, + clone: [ + { + name: 'https', + href: 'https://bitbucket.org/workspace/cloneurl', + }, + ], + }, + }), + ), + ), + ); + + await action.handler(mockContext); + + expect(mockContext.output).toHaveBeenCalledWith( + 'remoteUrl', + 'https://bitbucket.org/workspace/cloneurl', + ); + expect(mockContext.output).toHaveBeenCalledWith( + 'repoContentsUrl', + 'https://bitbucket.org/workspace/repo/src/master', + ); + }); + + it('should call outputs with the correct urls with correct default branch', async () => { + server.use( + rest.post( + 'https://api.bitbucket.org/2.0/repositories/workspace/repo', + (_, res, ctx) => + res( + ctx.status(200), + ctx.set('Content-Type', 'application/json'), + ctx.json({ + links: { + html: { + href: 'https://bitbucket.org/workspace/repo', + }, + clone: [ + { + name: 'https', + href: 'https://bitbucket.org/workspace/cloneurl', + }, + ], + }, + }), + ), + ), + ); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + defaultBranch: 'main', + }, + }); + + expect(mockContext.output).toHaveBeenCalledWith( + 'remoteUrl', + 'https://bitbucket.org/workspace/cloneurl', + ); + expect(mockContext.output).toHaveBeenCalledWith( + 'repoContentsUrl', + 'https://bitbucket.org/workspace/repo/src/main', + ); + }); +}); diff --git a/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucket.ts b/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucket.ts new file mode 100644 index 0000000000..f1b45111b4 --- /dev/null +++ b/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucket.ts @@ -0,0 +1,424 @@ +/* + * 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 { InputError } from '@backstage/errors'; +import { + BitbucketIntegrationConfig, + ScmIntegrationRegistry, +} from '@backstage/integration'; +import { + createTemplateAction, + initRepoAndPush, + getRepoSourceDirectory, + parseRepoUrl, +} from '@backstage/plugin-scaffolder-node'; +import fetch, { Response, RequestInit } from 'node-fetch'; +import { Config } from '@backstage/config'; +import { examples } from './bitbucket.examples'; + +const createBitbucketCloudRepository = async (opts: { + workspace: string; + project: string; + repo: string; + description?: string; + repoVisibility: 'private' | 'public'; + mainBranch: string; + authorization: string; + apiBaseUrl: string; +}) => { + const { + workspace, + project, + repo, + description, + repoVisibility, + mainBranch, + authorization, + apiBaseUrl, + } = opts; + + const options: RequestInit = { + method: 'POST', + body: JSON.stringify({ + scm: 'git', + description: description, + is_private: repoVisibility === 'private', + project: { key: project }, + }), + headers: { + Authorization: authorization, + 'Content-Type': 'application/json', + }, + }; + + let response: Response; + try { + response = await fetch( + `${apiBaseUrl}/repositories/${workspace}/${repo}`, + options, + ); + } catch (e) { + throw new Error(`Unable to create repository, ${e}`); + } + + if (response.status !== 200) { + throw new Error( + `Unable to create repository, ${response.status} ${ + response.statusText + }, ${await response.text()}`, + ); + } + + const r = await response.json(); + let remoteUrl = ''; + for (const link of r.links.clone) { + if (link.name === 'https') { + remoteUrl = link.href; + } + } + + // "mainbranch.name" cannot be set neither at create nor update of the repo + // the first pushed branch will be set as "main branch" then + const repoContentsUrl = `${r.links.html.href}/src/${mainBranch}`; + return { remoteUrl, repoContentsUrl }; +}; + +const createBitbucketServerRepository = async (opts: { + project: string; + repo: string; + description?: string; + repoVisibility: 'private' | 'public'; + authorization: string; + apiBaseUrl: string; +}) => { + const { + project, + repo, + description, + authorization, + repoVisibility, + apiBaseUrl, + } = opts; + + let response: Response; + const options: RequestInit = { + method: 'POST', + body: JSON.stringify({ + name: repo, + description: description, + public: repoVisibility === 'public', + }), + headers: { + Authorization: authorization, + 'Content-Type': 'application/json', + }, + }; + + try { + response = await fetch(`${apiBaseUrl}/projects/${project}/repos`, options); + } catch (e) { + throw new Error(`Unable to create repository, ${e}`); + } + + if (response.status !== 201) { + throw new Error( + `Unable to create repository, ${response.status} ${ + response.statusText + }, ${await response.text()}`, + ); + } + + const r = await response.json(); + let remoteUrl = ''; + for (const link of r.links.clone) { + if (link.name === 'http') { + remoteUrl = link.href; + } + } + + const repoContentsUrl = `${r.links.self[0].href}`; + return { remoteUrl, repoContentsUrl }; +}; + +const getAuthorizationHeader = (config: BitbucketIntegrationConfig) => { + if (config.username && config.appPassword) { + const buffer = Buffer.from( + `${config.username}:${config.appPassword}`, + 'utf8', + ); + + return `Basic ${buffer.toString('base64')}`; + } + + if (config.token) { + return `Bearer ${config.token}`; + } + + throw new Error( + `Authorization has not been provided for Bitbucket. Please add either username + appPassword or token to the Integrations config`, + ); +}; + +const performEnableLFS = async (opts: { + authorization: string; + host: string; + project: string; + repo: string; +}) => { + const { authorization, host, project, repo } = opts; + + const options: RequestInit = { + method: 'PUT', + headers: { + Authorization: authorization, + }, + }; + + const { ok, status, statusText } = await fetch( + `https://${host}/rest/git-lfs/admin/projects/${project}/repos/${repo}/enabled`, + options, + ); + + if (!ok) + throw new Error( + `Failed to enable LFS in the repository, ${status}: ${statusText}`, + ); +}; + +/** + * Creates a new action that initializes a git repository of the content in the workspace + * and publishes it to Bitbucket. + * @public + * @deprecated in favor of "createPublishBitbucketCloudAction" by \@backstage/plugin-scaffolder-backend-module-bitbucket-cloud and "createPublishBitbucketServerAction" by \@backstage/plugin-scaffolder-backend-module-bitbucket-server + */ +export function createPublishBitbucketAction(options: { + integrations: ScmIntegrationRegistry; + config: Config; +}) { + const { integrations, config } = options; + + return createTemplateAction<{ + repoUrl: string; + description?: string; + defaultBranch?: string; + repoVisibility?: 'private' | 'public'; + sourcePath?: string; + enableLFS?: boolean; + token?: string; + gitCommitMessage?: string; + gitAuthorName?: string; + gitAuthorEmail?: string; + }>({ + id: 'publish:bitbucket', + description: + 'Initializes a git repository of the content in the workspace, and publishes it to Bitbucket.', + examples, + schema: { + input: { + type: 'object', + required: ['repoUrl'], + properties: { + repoUrl: { + title: 'Repository Location', + type: 'string', + }, + description: { + title: 'Repository Description', + type: 'string', + }, + repoVisibility: { + title: 'Repository Visibility', + type: 'string', + enum: ['private', 'public'], + }, + defaultBranch: { + title: 'Default Branch', + type: 'string', + description: `Sets the default branch on the repository. The default value is 'master'`, + }, + sourcePath: { + title: 'Source Path', + description: + 'Path within the workspace that will be used as the repository root. If omitted, the entire workspace will be published as the repository.', + type: 'string', + }, + enableLFS: { + title: 'Enable LFS?', + description: + 'Enable LFS for the repository. Only available for hosted Bitbucket.', + type: 'boolean', + }, + token: { + title: 'Authentication Token', + type: 'string', + description: 'The token to use for authorization to BitBucket', + }, + gitCommitMessage: { + title: 'Git Commit Message', + type: 'string', + description: `Sets the commit message on the repository. The default value is 'initial commit'`, + }, + gitAuthorName: { + title: 'Default Author Name', + type: 'string', + description: `Sets the default author name for the commit. The default value is 'Scaffolder'`, + }, + gitAuthorEmail: { + title: 'Default Author Email', + type: 'string', + description: `Sets the default author email for the commit.`, + }, + }, + }, + output: { + type: 'object', + properties: { + remoteUrl: { + title: 'A URL to the repository with the provider', + type: 'string', + }, + repoContentsUrl: { + title: 'A URL to the root of the repository', + type: 'string', + }, + commitHash: { + title: 'The git commit hash of the initial commit', + type: 'string', + }, + }, + }, + }, + async handler(ctx) { + ctx.logger.warn( + `[Deprecated] Please migrate the use of action "publish:bitbucket" to "publish:bitbucketCloud" or "publish:bitbucketServer".`, + ); + const { + repoUrl, + description, + defaultBranch = 'master', + repoVisibility = 'private', + enableLFS = false, + gitCommitMessage = 'initial commit', + gitAuthorName, + gitAuthorEmail, + } = ctx.input; + + const { workspace, project, repo, host } = parseRepoUrl( + repoUrl, + integrations, + ); + + // Workspace is only required for bitbucket cloud + if (host === 'bitbucket.org') { + if (!workspace) { + throw new InputError( + `Invalid URL provider was included in the repo URL to create ${ctx.input.repoUrl}, missing workspace`, + ); + } + } + + // Project is required for both bitbucket cloud and bitbucket server + if (!project) { + throw new InputError( + `Invalid URL provider was included in the repo URL to create ${ctx.input.repoUrl}, missing project`, + ); + } + + const integrationConfig = integrations.bitbucket.byHost(host); + + if (!integrationConfig) { + throw new InputError( + `No matching integration configuration for host ${host}, please check your integrations config`, + ); + } + + const authorization = getAuthorizationHeader( + ctx.input.token + ? { + host: integrationConfig.config.host, + apiBaseUrl: integrationConfig.config.apiBaseUrl, + token: ctx.input.token, + } + : integrationConfig.config, + ); + + const apiBaseUrl = integrationConfig.config.apiBaseUrl; + + const createMethod = + host === 'bitbucket.org' + ? createBitbucketCloudRepository + : createBitbucketServerRepository; + + const { remoteUrl, repoContentsUrl } = await createMethod({ + authorization, + workspace: workspace || '', + project, + repo, + repoVisibility, + mainBranch: defaultBranch, + description, + apiBaseUrl, + }); + + const gitAuthorInfo = { + name: gitAuthorName + ? gitAuthorName + : config.getOptionalString('scaffolder.defaultAuthor.name'), + email: gitAuthorEmail + ? gitAuthorEmail + : config.getOptionalString('scaffolder.defaultAuthor.email'), + }; + + let auth; + + if (ctx.input.token) { + auth = { + username: 'x-token-auth', + password: ctx.input.token, + }; + } else { + auth = { + username: integrationConfig.config.username + ? integrationConfig.config.username + : 'x-token-auth', + password: integrationConfig.config.appPassword + ? integrationConfig.config.appPassword + : integrationConfig.config.token ?? '', + }; + } + + const commitResult = await initRepoAndPush({ + dir: getRepoSourceDirectory(ctx.workspacePath, ctx.input.sourcePath), + remoteUrl, + auth, + defaultBranch, + logger: ctx.logger, + commitMessage: gitCommitMessage + ? gitCommitMessage + : config.getOptionalString('scaffolder.defaultCommitMessage'), + gitAuthorInfo, + }); + + if (enableLFS && host !== 'bitbucket.org') { + await performEnableLFS({ authorization, host, project, repo }); + } + + ctx.output('commitHash', commitResult?.commitHash); + ctx.output('remoteUrl', remoteUrl); + ctx.output('repoContentsUrl', repoContentsUrl); + }, + }); +} diff --git a/plugins/scaffolder-backend-module-bitbucket/src/deprecated.ts b/plugins/scaffolder-backend-module-bitbucket/src/deprecated.ts new file mode 100644 index 0000000000..a17c88c3a4 --- /dev/null +++ b/plugins/scaffolder-backend-module-bitbucket/src/deprecated.ts @@ -0,0 +1,43 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import * as bitbucketCloud from '@backstage/plugin-scaffolder-backend-module-bitbucket-cloud'; +import * as bitbucketServer from '@backstage/plugin-scaffolder-backend-module-bitbucket-server'; + +export { createPublishBitbucketAction } from './actions/bitbucket'; + +/** + * @public @deprecated use import from \@backstage/plugin-scaffolder-backend-module-bitbucket-cloud instead + */ +export const createPublishBitbucketCloudAction = + bitbucketCloud.createPublishBitbucketCloudAction; + +/** + * @public @deprecated use import from \@backstage/plugin-scaffolder-backend-module-bitbucket-cloud instead + */ +export const createBitbucketPipelinesRunAction = + bitbucketCloud.createBitbucketPipelinesRunAction; + +/** + * @public @deprecated use import from \@backstage/plugin-scaffolder-backend-module-bitbucket-server instead + */ +export const createPublishBitbucketServerAction = + bitbucketServer.createPublishBitbucketServerAction; + +/** + * @public @deprecated use import from \@backstage/plugin-scaffolder-backend-module-bitbucket-server instead + */ +export const createPublishBitbucketServerPullRequestAction = + bitbucketServer.createPublishBitbucketServerPullRequestAction; diff --git a/plugins/linguist-backend/src/processor/index.ts b/plugins/scaffolder-backend-module-bitbucket/src/index.ts similarity index 75% rename from plugins/linguist-backend/src/processor/index.ts rename to plugins/scaffolder-backend-module-bitbucket/src/index.ts index b56618b203..7f68a3f395 100644 --- a/plugins/linguist-backend/src/processor/index.ts +++ b/plugins/scaffolder-backend-module-bitbucket/src/index.ts @@ -13,8 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export type { - LinguistTagsProcessorOptions, - ShouldProcessEntity, -} from './LinguistTagsProcessor'; -export { LinguistTagsProcessor } from './LinguistTagsProcessor'; + +/** + * A module for the scaffolder backend that lets you interact with bitbucket + * + * @packageDocumentation + */ + +export * from './deprecated'; +export { bitbucketModule as default } from './module'; diff --git a/plugins/scaffolder-backend-module-bitbucket/src/module.ts b/plugins/scaffolder-backend-module-bitbucket/src/module.ts new file mode 100644 index 0000000000..db27d0b7b9 --- /dev/null +++ b/plugins/scaffolder-backend-module-bitbucket/src/module.ts @@ -0,0 +1,58 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + coreServices, + createBackendModule, +} from '@backstage/backend-plugin-api'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; +import { + createBitbucketPipelinesRunAction, + createPublishBitbucketCloudAction, + createPublishBitbucketServerAction, + createPublishBitbucketServerPullRequestAction, +} from './deprecated'; +import { ScmIntegrations } from '@backstage/integration'; + +/** + * The Bitbucket Module for the Scaffolder Backend + * @public + * @deprecated use module by \@backstage/plugin-scaffolder-backend-module-bitbucket-cloud or \@backstage/plugin-scaffolder-backend-module-bitbucket-server instead + */ +export const bitbucketModule = createBackendModule({ + moduleId: 'bitbucket', + pluginId: 'scaffolder', + register({ registerInit }) { + registerInit({ + deps: { + scaffolder: scaffolderActionsExtensionPoint, + config: coreServices.rootConfig, + }, + async init({ scaffolder, config }) { + const integrations = ScmIntegrations.fromConfig(config); + + scaffolder.addActions( + createPublishBitbucketCloudAction({ integrations, config }), + createPublishBitbucketServerAction({ integrations, config }), + createPublishBitbucketServerPullRequestAction({ + integrations, + config, + }), + createBitbucketPipelinesRunAction({ integrations }), + ); + }, + }); + }, +}); diff --git a/plugins/search-backend-module-explore/package.json b/plugins/search-backend-module-explore/package.json index d5f6e907e7..4741e2fde2 100644 --- a/plugins/search-backend-module-explore/package.json +++ b/plugins/search-backend-module-explore/package.json @@ -46,11 +46,11 @@ "test": "backstage-cli package test" }, "dependencies": { + "@backstage-community/plugin-explore-common": "^0.0.3", "@backstage/backend-common": "workspace:^", "@backstage/backend-plugin-api": "workspace:^", "@backstage/backend-tasks": "workspace:^", "@backstage/config": "workspace:^", - "@backstage/plugin-explore-common": "workspace:^", "@backstage/plugin-search-backend-node": "workspace:^", "@backstage/plugin-search-common": "workspace:^", "node-fetch": "^2.6.7" diff --git a/yarn.lock b/yarn.lock index 0a27eecdea..5961036a6b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -105,30 +105,6 @@ __metadata: languageName: node linkType: hard -"@apollo/explorer@npm:^3.0.0": - version: 3.6.0 - resolution: "@apollo/explorer@npm:3.6.0" - dependencies: - "@types/whatwg-mimetype": ^3.0.0 - graphql-ws: ^5.9.0 - subscriptions-transport-ws: ^0.11.0 - whatwg-mimetype: ^3.0.0 - zen-observable-ts: ^1.1.0 - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - use-deep-compare-effect: ^1.8.1 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - use-deep-compare-effect: - optional: true - checksum: 0617cd1995cb8a63e25ee93204e09f6210a9031ca7942a7c74b9ac74677072fd6242d1479110d9a756c013589626706766380788e9b07dc63a18b494f581406c - languageName: node - linkType: hard - "@ardatan/sync-fetch@npm:^0.0.1": version: 0.0.1 resolution: "@ardatan/sync-fetch@npm:0.0.1" @@ -1476,34 +1452,7 @@ __metadata: languageName: node linkType: hard -"@azure/arm-appservice@npm:^14.0.0": - version: 14.1.0 - resolution: "@azure/arm-appservice@npm:14.1.0" - dependencies: - "@azure/abort-controller": ^1.0.0 - "@azure/core-auth": ^1.3.0 - "@azure/core-client": ^1.7.0 - "@azure/core-lro": ^2.5.4 - "@azure/core-paging": ^1.2.0 - "@azure/core-rest-pipeline": ^1.12.0 - tslib: ^2.2.0 - checksum: b989bc26d94056e0f02d2ede9981ebbf90ebefdc8b35c8f66531d3220c4ce52484d49c0a15b7056b79898a76533b0de0edf141b7736aadfabf2c33305804b884 - languageName: node - linkType: hard - -"@azure/arm-resourcegraph@npm:^4.2.1": - version: 4.2.1 - resolution: "@azure/arm-resourcegraph@npm:4.2.1" - dependencies: - "@azure/core-auth": ^1.1.4 - "@azure/ms-rest-azure-js": ^2.1.0 - "@azure/ms-rest-js": ^2.2.0 - tslib: ^1.10.0 - checksum: a5afea9faef84ed4576fda430301039524aefe6976a54204fe4453e672aa3d13edc7ef5c996ad6293e9afa3a0833549174aaac18ce236c4ec1242698e2c22bd2 - languageName: node - linkType: hard - -"@azure/core-auth@npm:^1.1.4, @azure/core-auth@npm:^1.3.0, @azure/core-auth@npm:^1.4.0, @azure/core-auth@npm:^1.5.0": +"@azure/core-auth@npm:^1.3.0, @azure/core-auth@npm:^1.4.0, @azure/core-auth@npm:^1.5.0": version: 1.5.0 resolution: "@azure/core-auth@npm:1.5.0" dependencies: @@ -1514,7 +1463,7 @@ __metadata: languageName: node linkType: hard -"@azure/core-client@npm:^1.4.0, @azure/core-client@npm:^1.7.0": +"@azure/core-client@npm:^1.4.0": version: 1.7.3 resolution: "@azure/core-client@npm:1.7.3" dependencies: @@ -1551,7 +1500,7 @@ __metadata: languageName: node linkType: hard -"@azure/core-lro@npm:^2.2.0, @azure/core-lro@npm:^2.5.4": +"@azure/core-lro@npm:^2.2.0": version: 2.5.4 resolution: "@azure/core-lro@npm:2.5.4" dependencies: @@ -1563,7 +1512,7 @@ __metadata: languageName: node linkType: hard -"@azure/core-paging@npm:^1.1.1, @azure/core-paging@npm:^1.2.0": +"@azure/core-paging@npm:^1.1.1": version: 1.3.0 resolution: "@azure/core-paging@npm:1.3.0" dependencies: @@ -1572,7 +1521,7 @@ __metadata: languageName: node linkType: hard -"@azure/core-rest-pipeline@npm:^1.1.0, @azure/core-rest-pipeline@npm:^1.12.0, @azure/core-rest-pipeline@npm:^1.9.1": +"@azure/core-rest-pipeline@npm:^1.1.0, @azure/core-rest-pipeline@npm:^1.9.1": version: 1.12.2 resolution: "@azure/core-rest-pipeline@npm:1.12.2" dependencies: @@ -1649,33 +1598,6 @@ __metadata: languageName: node linkType: hard -"@azure/ms-rest-azure-js@npm:^2.1.0": - version: 2.1.0 - resolution: "@azure/ms-rest-azure-js@npm:2.1.0" - dependencies: - "@azure/core-auth": ^1.1.4 - "@azure/ms-rest-js": ^2.2.0 - tslib: ^1.10.0 - checksum: 0e6d6700f4ee0ad14383642b02fe86b33f4034aaff38499374ed5be59154e869ee231790d20b7557622ebcdfa9eed45dc2559391a79dee51c849a8ced0c86fed - languageName: node - linkType: hard - -"@azure/ms-rest-js@npm:^2.2.0": - version: 2.7.0 - resolution: "@azure/ms-rest-js@npm:2.7.0" - dependencies: - "@azure/core-auth": ^1.1.4 - abort-controller: ^3.0.0 - form-data: ^2.5.0 - node-fetch: ^2.6.7 - tslib: ^1.10.0 - tunnel: 0.0.6 - uuid: ^8.3.2 - xml2js: ^0.5.0 - checksum: 38434010f3fc54a625f637a7758358d7ce0ad3e55ce9a6c7490bf05bbec8ea75ae95fe80041d2376beb3ef78ee6e55858bd0541477d7a88703246e368cfd59c1 - languageName: node - linkType: hard - "@azure/msal-browser@npm:^3.11.1": version: 3.11.1 resolution: "@azure/msal-browser@npm:3.11.1" @@ -3192,7 +3114,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.1, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.20.1, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.20.6, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.4.4, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.0, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.3, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.1, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.20.1, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.20.6, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.4.4, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.0, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.3, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": version: 7.24.4 resolution: "@babel/runtime@npm:7.24.4" dependencies: @@ -3241,6 +3163,52 @@ __metadata: languageName: node linkType: hard +"@backstage-community/plugin-explore-common@npm:^0.0.3": + version: 0.0.3 + resolution: "@backstage-community/plugin-explore-common@npm:0.0.3" + checksum: 54b81496122c11bd16cbb71c4fcc92e6bf16b5e4f580fc8043dbea35955447d67b463a40065e629ed81ef3aeeb36d1f41d445b7fa4d8ab7e0036a296b361e398 + languageName: node + linkType: hard + +"@backstage-community/plugin-puppetdb@npm:^0.1.18": + version: 0.1.18 + resolution: "@backstage-community/plugin-puppetdb@npm:0.1.18" + dependencies: + "@backstage/catalog-model": ^1.4.5 + "@backstage/core-components": ^0.14.4 + "@backstage/core-plugin-api": ^1.9.2 + "@backstage/errors": ^1.2.4 + "@backstage/plugin-catalog-react": ^1.11.3 + "@material-ui/core": ^4.12.2 + "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + react-use: ^17.2.4 + peerDependencies: + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 + checksum: d0e4fe3f818aa05c527d773d558291b97f3a4fee1b1a765e0e6f5a2f36ca1897e3933e92abdeffeb8b33701c21314eb3565900ff78624fe1d5eff3ee2781cfff + languageName: node + linkType: hard + +"@backstage-community/plugin-stackstorm@npm:^0.1.16": + version: 0.1.16 + resolution: "@backstage-community/plugin-stackstorm@npm:0.1.16" + dependencies: + "@backstage/core-components": ^0.14.4 + "@backstage/core-plugin-api": ^1.9.2 + "@backstage/errors": ^1.2.4 + "@material-ui/core": ^4.12.2 + "@material-ui/icons": ^4.9.1 + "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + react-use: ^17.2.4 + peerDependencies: + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 + checksum: 2fd7d290cd98ad09b16862a5dee3302796942e85818abf9c4a9102038a4fb83e86ceee39d901e59bb7fb7c60df7797524f8c6a5cfee1a4a0ea59edcbb4de5a0a + languageName: node + linkType: hard + "@backstage/app-defaults@workspace:^, @backstage/app-defaults@workspace:packages/app-defaults": version: 0.0.0-use.local resolution: "@backstage/app-defaults@workspace:packages/app-defaults" @@ -3869,6 +3837,8 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/core-compat-api@workspace:packages/core-compat-api" dependencies: + "@backstage-community/plugin-puppetdb": ^0.1.18 + "@backstage-community/plugin-stackstorm": ^0.1.16 "@backstage/cli": "workspace:^" "@backstage/core-app-api": "workspace:^" "@backstage/core-plugin-api": "workspace:^" @@ -3876,8 +3846,6 @@ __metadata: "@backstage/frontend-plugin-api": "workspace:^" "@backstage/frontend-test-utils": "workspace:^" "@backstage/plugin-catalog": "workspace:^" - "@backstage/plugin-puppetdb": "workspace:^" - "@backstage/plugin-stackstorm": "workspace:^" "@backstage/version-bridge": "workspace:^" "@oriflame/backstage-plugin-score-card": ^0.8.0 "@testing-library/jest-dom": ^6.0.0 @@ -3889,7 +3857,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-components@^0.14.3, @backstage/core-components@workspace:^, @backstage/core-components@workspace:packages/core-components": +"@backstage/core-components@^0.14.4, @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: @@ -4013,7 +3981,7 @@ __metadata: languageName: node linkType: hard -"@backstage/core-plugin-api@^1.8.2, @backstage/core-plugin-api@^1.9.1, @backstage/core-plugin-api@workspace:^, @backstage/core-plugin-api@workspace:packages/core-plugin-api": +"@backstage/core-plugin-api@^1.8.2, @backstage/core-plugin-api@^1.9.2, @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: @@ -4111,7 +4079,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/errors@^1.2.3, @backstage/errors@workspace:^, @backstage/errors@workspace:packages/errors": +"@backstage/errors@^1.2.3, @backstage/errors@^1.2.4, @backstage/errors@workspace:^, @backstage/errors@workspace:packages/errors": version: 0.0.0-use.local resolution: "@backstage/errors@workspace:packages/errors" dependencies: @@ -4223,7 +4191,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/integration-react@^1.1.25, @backstage/integration-react@workspace:^, @backstage/integration-react@workspace:packages/integration-react": +"@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: @@ -4267,236 +4235,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-adr-backend@workspace:^, @backstage/plugin-adr-backend@workspace:plugins/adr-backend": - version: 0.0.0-use.local - resolution: "@backstage/plugin-adr-backend@workspace:plugins/adr-backend" - dependencies: - "@backstage/backend-common": "workspace:^" - "@backstage/backend-plugin-api": "workspace:^" - "@backstage/catalog-client": "workspace:^" - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/integration": "workspace:^" - "@backstage/plugin-adr-common": "workspace:^" - "@backstage/plugin-search-common": "workspace:^" - "@types/express": ^4.17.6 - "@types/supertest": ^2.0.8 - express: ^4.17.1 - express-promise-router: ^4.1.0 - luxon: ^3.0.0 - marked: ^12.0.0 - node-fetch: ^2.6.5 - supertest: ^6.1.3 - yn: ^4.0.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-adr-common@workspace:^, @backstage/plugin-adr-common@workspace:plugins/adr-common": - version: 0.0.0-use.local - resolution: "@backstage/plugin-adr-common@workspace:plugins/adr-common" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/integration": "workspace:^" - "@backstage/plugin-search-common": "workspace:^" - front-matter: ^4.0.2 - luxon: ^3.0.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-adr@workspace:^, @backstage/plugin-adr@workspace:plugins/adr": - version: 0.0.0-use.local - resolution: "@backstage/plugin-adr@workspace:plugins/adr" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/frontend-plugin-api": "workspace:^" - "@backstage/integration-react": "workspace:^" - "@backstage/plugin-adr-common": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/plugin-search-common": "workspace:^" - "@backstage/plugin-search-react": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - lodash: ^4.17.21 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-airbrake-backend@workspace:plugins/airbrake-backend": - version: 0.0.0-use.local - resolution: "@backstage/plugin-airbrake-backend@workspace:plugins/airbrake-backend" - dependencies: - "@backstage/backend-common": "workspace:^" - "@backstage/backend-plugin-api": "workspace:^" - "@backstage/backend-test-utils": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@types/express": "*" - "@types/http-proxy-middleware": ^1.0.0 - "@types/supertest": ^2.0.8 - express: ^4.17.1 - express-promise-router: ^4.1.0 - http-proxy-middleware: ^2.0.0 - supertest: ^6.1.6 - yn: ^4.0.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-airbrake@workspace:^, @backstage/plugin-airbrake@workspace:plugins/airbrake": - version: 0.0.0-use.local - resolution: "@backstage/plugin-airbrake@workspace:plugins/airbrake" - dependencies: - "@backstage/app-defaults": "workspace:^" - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - msw: ^1.0.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-allure@workspace:plugins/allure": - version: 0.0.0-use.local - resolution: "@backstage/plugin-allure@workspace:plugins/allure" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - msw: ^1.0.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-analytics-module-ga4@workspace:plugins/analytics-module-ga4": - version: 0.0.0-use.local - resolution: "@backstage/plugin-analytics-module-ga4@workspace:plugins/analytics-module-ga4" - dependencies: - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/frontend-plugin-api": "workspace:^" - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/jest": ^29.0.0 - "@types/react": ^16.13.1 || ^17.0.0 - react-ga4: ^2.0.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-analytics-module-ga@workspace:plugins/analytics-module-ga": - version: 0.0.0-use.local - resolution: "@backstage/plugin-analytics-module-ga@workspace:plugins/analytics-module-ga" - dependencies: - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/frontend-plugin-api": "workspace:^" - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 - react-ga: ^3.3.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-analytics-module-newrelic-browser@workspace:plugins/analytics-module-newrelic-browser": - version: 0.0.0-use.local - resolution: "@backstage/plugin-analytics-module-newrelic-browser@workspace:plugins/analytics-module-newrelic-browser" - dependencies: - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/frontend-plugin-api": "workspace:^" - "@newrelic/browser-agent": ^1.236.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-apache-airflow@workspace:^, @backstage/plugin-apache-airflow@workspace:plugins/apache-airflow": - version: 0.0.0-use.local - resolution: "@backstage/plugin-apache-airflow@workspace:plugins/apache-airflow" - dependencies: - "@backstage/cli": "workspace:^" - "@backstage/core-app-api": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - cross-fetch: ^4.0.0 - msw: ^1.0.0 - qs: ^6.10.1 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - "@backstage/plugin-api-docs-module-protoc-gen-doc@workspace:plugins/api-docs-module-protoc-gen-doc": version: 0.0.0-use.local resolution: "@backstage/plugin-api-docs-module-protoc-gen-doc@workspace:plugins/api-docs-module-protoc-gen-doc" @@ -4553,30 +4291,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-apollo-explorer@workspace:plugins/apollo-explorer": - version: 0.0.0-use.local - resolution: "@backstage/plugin-apollo-explorer@workspace:plugins/apollo-explorer" - dependencies: - "@apollo/explorer": ^3.0.0 - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/lab": ^4.0.0-alpha.61 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - react-use: ^17.5.0 - use-deep-compare-effect: ^1.8.1 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - "@backstage/plugin-app-backend@workspace:^, @backstage/plugin-app-backend@workspace:plugins/app-backend": version: 0.0.0-use.local resolution: "@backstage/plugin-app-backend@workspace:plugins/app-backend" @@ -4621,7 +4335,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-app-visualizer@workspace:^, @backstage/plugin-app-visualizer@workspace:plugins/app-visualizer": +"@backstage/plugin-app-visualizer@workspace:plugins/app-visualizer": version: 0.0.0-use.local resolution: "@backstage/plugin-app-visualizer@workspace:plugins/app-visualizer" dependencies: @@ -5079,244 +4793,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-azure-devops-backend@workspace:^, @backstage/plugin-azure-devops-backend@workspace:plugins/azure-devops-backend": - version: 0.0.0-use.local - resolution: "@backstage/plugin-azure-devops-backend@workspace:plugins/azure-devops-backend" - dependencies: - "@backstage/backend-common": "workspace:^" - "@backstage/backend-plugin-api": "workspace:^" - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/integration": "workspace:^" - "@backstage/plugin-auth-node": "workspace:^" - "@backstage/plugin-azure-devops-common": "workspace:^" - "@backstage/plugin-catalog-common": "workspace:^" - "@backstage/plugin-catalog-node": "workspace:^" - "@backstage/plugin-permission-common": "workspace:^" - "@backstage/plugin-permission-node": "workspace:^" - "@types/express": ^4.17.6 - "@types/supertest": ^2.0.8 - azure-devops-node-api: ^12.0.0 - express: ^4.17.1 - express-promise-router: ^4.1.0 - lodash: ^4.17.21 - mime-types: ^2.1.27 - p-limit: ^3.1.0 - supertest: ^6.1.6 - yn: ^4.0.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-azure-devops-common@workspace:^, @backstage/plugin-azure-devops-common@workspace:plugins/azure-devops-common": - version: 0.0.0-use.local - resolution: "@backstage/plugin-azure-devops-common@workspace:plugins/azure-devops-common" - dependencies: - "@backstage/cli": "workspace:^" - "@backstage/plugin-catalog-common": "workspace:^" - "@backstage/plugin-permission-common": "workspace:^" - languageName: unknown - linkType: soft - -"@backstage/plugin-azure-devops@workspace:^, @backstage/plugin-azure-devops@workspace:plugins/azure-devops": - version: 0.0.0-use.local - resolution: "@backstage/plugin-azure-devops@workspace:plugins/azure-devops" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-compat-api": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/frontend-plugin-api": "workspace:^" - "@backstage/plugin-azure-devops-common": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/plugin-permission-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - humanize-duration: ^3.27.0 - luxon: ^3.0.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-azure-sites-backend@workspace:plugins/azure-sites-backend": - version: 0.0.0-use.local - resolution: "@backstage/plugin-azure-sites-backend@workspace:plugins/azure-sites-backend" - dependencies: - "@azure/arm-appservice": ^14.0.0 - "@azure/arm-resourcegraph": ^4.2.1 - "@azure/identity": ^4.0.0 - "@backstage/backend-common": "workspace:^" - "@backstage/backend-plugin-api": "workspace:^" - "@backstage/catalog-client": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-azure-sites-common": "workspace:^" - "@backstage/plugin-catalog-node": "workspace:^" - "@backstage/plugin-permission-common": "workspace:^" - "@backstage/plugin-permission-node": "workspace:^" - "@types/express": ^4.17.6 - "@types/supertest": ^2.0.8 - express: ^4.17.1 - express-promise-router: ^4.1.0 - yn: ^4.0.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-azure-sites-common@workspace:^, @backstage/plugin-azure-sites-common@workspace:plugins/azure-sites-common": - version: 0.0.0-use.local - resolution: "@backstage/plugin-azure-sites-common@workspace:plugins/azure-sites-common" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/plugin-catalog-common": "workspace:^" - "@backstage/plugin-permission-common": "workspace:^" - languageName: unknown - linkType: soft - -"@backstage/plugin-azure-sites@workspace:^, @backstage/plugin-azure-sites@workspace:plugins/azure-sites": - version: 0.0.0-use.local - resolution: "@backstage/plugin-azure-sites@workspace:plugins/azure-sites" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/plugin-azure-sites-common": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/plugin-permission-common": "workspace:^" - "@backstage/plugin-permission-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@backstage/theme": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - luxon: ^3.0.0 - msw: ^1.0.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-badges-backend@workspace:^, @backstage/plugin-badges-backend@workspace:plugins/badges-backend": - version: 0.0.0-use.local - resolution: "@backstage/plugin-badges-backend@workspace:plugins/badges-backend" - dependencies: - "@backstage/backend-common": "workspace:^" - "@backstage/backend-plugin-api": "workspace:^" - "@backstage/backend-test-utils": "workspace:^" - "@backstage/catalog-client": "workspace:^" - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-auth-node": "workspace:^" - "@types/express": ^4.17.6 - badge-maker: ^3.3.0 - cors: ^2.8.5 - express: ^4.17.1 - express-promise-router: ^4.1.0 - knex: ^3.0.0 - lodash: ^4.17.21 - supertest: ^6.3.3 - uuid: ^9.0.0 - winston: ^3.2.1 - yn: ^4.0.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-badges@workspace:^, @backstage/plugin-badges@workspace:plugins/badges": - version: 0.0.0-use.local - resolution: "@backstage/plugin-badges@workspace:plugins/badges" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@testing-library/jest-dom": ^6.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-bazaar-backend@workspace:plugins/bazaar-backend": - version: 0.0.0-use.local - resolution: "@backstage/plugin-bazaar-backend@workspace:plugins/bazaar-backend" - dependencies: - "@backstage/backend-common": "workspace:^" - "@backstage/backend-plugin-api": "workspace:^" - "@backstage/backend-test-utils": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@backstage/plugin-auth-node": "workspace:^" - "@types/express": ^4.17.6 - express: ^4.17.1 - express-promise-router: ^4.1.0 - knex: ^3.0.0 - yn: ^4.0.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-bazaar@workspace:plugins/bazaar": - version: 0.0.0-use.local - resolution: "@backstage/plugin-bazaar@workspace:plugins/bazaar" - dependencies: - "@backstage/catalog-client": "workspace:^" - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@date-io/luxon": 1.x - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@material-ui/pickers": ^3.3.10 - "@testing-library/jest-dom": ^6.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - luxon: ^3.0.0 - material-ui-search-bar: ^1.0.0 - react-hook-form: ^7.13.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - "@backstage/plugin-bitbucket-cloud-common@workspace:^, @backstage/plugin-bitbucket-cloud-common@workspace:plugins/bitbucket-cloud-common": version: 0.0.0-use.local resolution: "@backstage/plugin-bitbucket-cloud-common@workspace:plugins/bitbucket-cloud-common" @@ -5330,40 +4806,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-bitrise@workspace:plugins/bitrise": - version: 0.0.0-use.local - resolution: "@backstage/plugin-bitrise@workspace:plugins/bitrise" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-app-api": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@testing-library/user-event": ^14.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - "@types/recharts": ^1.8.15 - lodash: ^4.17.21 - luxon: ^3.0.0 - msw: ^1.0.0 - qs: ^6.9.6 - react-use: ^17.2.4 - recharts: ^2.5.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - "@backstage/plugin-catalog-backend-module-aws@workspace:plugins/catalog-backend-module-aws": version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-backend-module-aws@workspace:plugins/catalog-backend-module-aws" @@ -5911,7 +5353,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-react@^1.11.2, @backstage/plugin-catalog-react@^1.9.3, @backstage/plugin-catalog-react@workspace:^, @backstage/plugin-catalog-react@workspace:plugins/catalog-react": +"@backstage/plugin-catalog-react@^1.11.3, @backstage/plugin-catalog-react@^1.9.3, @backstage/plugin-catalog-react@workspace:^, @backstage/plugin-catalog-react@workspace:plugins/catalog-react": version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-react@workspace:plugins/catalog-react" dependencies: @@ -6036,227 +5478,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-cicd-statistics-module-gitlab@workspace:plugins/cicd-statistics-module-gitlab": - version: 0.0.0-use.local - resolution: "@backstage/plugin-cicd-statistics-module-gitlab@workspace:plugins/cicd-statistics-module-gitlab" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/plugin-cicd-statistics": "workspace:^" - "@gitbeaker/browser": ^35.6.0 - "@gitbeaker/core": ^35.6.0 - "@types/react": ^16.13.1 || ^17.0.0 - luxon: ^3.0.0 - p-limit: ^3.1.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-cicd-statistics@workspace:^, @backstage/plugin-cicd-statistics@workspace:plugins/cicd-statistics": - version: 0.0.0-use.local - resolution: "@backstage/plugin-cicd-statistics@workspace:plugins/cicd-statistics" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@date-io/luxon": ^1.3.13 - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@material-ui/pickers": ^3.3.10 - "@types/luxon": ^3.0.0 - "@types/react": ^16.13.1 || ^17.0.0 - already: ^3.2.0 - humanize-duration: ^3.27.0 - lodash: ^4.17.21 - luxon: ^3.0.0 - react-use: ^17.3.1 - recharts: ^2.5.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-circleci@workspace:plugins/circleci": - version: 0.0.0-use.local - resolution: "@backstage/plugin-circleci@workspace:plugins/circleci" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@types/humanize-duration": ^3.25.1 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - circleci-api: ^4.0.0 - humanize-duration: ^3.27.0 - lodash: ^4.17.21 - luxon: ^3.0.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-cloudbuild@workspace:^, @backstage/plugin-cloudbuild@workspace:plugins/cloudbuild": - version: 0.0.0-use.local - resolution: "@backstage/plugin-cloudbuild@workspace:plugins/cloudbuild" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - luxon: ^3.0.0 - qs: ^6.9.4 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-code-climate@workspace:plugins/code-climate": - version: 0.0.0-use.local - resolution: "@backstage/plugin-code-climate@workspace:plugins/code-climate" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/humanize-duration": ^3.27.1 - "@types/luxon": ^3.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - humanize-duration: ^3.27.1 - luxon: ^3.0.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-code-coverage-backend@workspace:^, @backstage/plugin-code-coverage-backend@workspace:plugins/code-coverage-backend": - version: 0.0.0-use.local - resolution: "@backstage/plugin-code-coverage-backend@workspace:plugins/code-coverage-backend" - dependencies: - "@backstage/backend-common": "workspace:^" - "@backstage/backend-plugin-api": "workspace:^" - "@backstage/backend-test-utils": "workspace:^" - "@backstage/catalog-client": "workspace:^" - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/integration": "workspace:^" - "@types/body-parser-xml": ^2.0.2 - "@types/express": ^4.17.6 - "@types/supertest": ^2.0.8 - body-parser: ^1.20.0 - body-parser-xml: ^2.0.5 - express: ^4.17.1 - express-promise-router: ^4.1.0 - knex: ^3.0.0 - supertest: ^6.1.6 - uuid: ^9.0.0 - xml2js: ^0.6.0 - yn: ^4.0.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-code-coverage@workspace:^, @backstage/plugin-code-coverage@workspace:plugins/code-coverage": - version: 0.0.0-use.local - resolution: "@backstage/plugin-code-coverage@workspace:plugins/code-coverage" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@material-ui/styles": ^4.11.0 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/highlightjs": ^10.1.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - "@types/recharts": ^1.8.15 - highlight.js: ^10.6.0 - luxon: ^3.0.0 - react-use: ^17.2.4 - recharts: ^2.5.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-codescene@workspace:plugins/codescene": - version: 0.0.0-use.local - resolution: "@backstage/plugin-codescene@workspace:plugins/codescene" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@backstage/core-app-api": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@backstage/theme": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/lab": 4.0.0-alpha.61 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - luxon: ^3.4.4 - msw: ^1.0.0 - rc-progress: 3.5.1 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - "@backstage/plugin-config-schema@workspace:plugins/config-schema": version: 0.0.0-use.local resolution: "@backstage/plugin-config-schema@workspace:plugins/config-schema" @@ -6284,59 +5505,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-cost-insights-common@workspace:^, @backstage/plugin-cost-insights-common@workspace:plugins/cost-insights-common": - version: 0.0.0-use.local - resolution: "@backstage/plugin-cost-insights-common@workspace:plugins/cost-insights-common" - dependencies: - "@backstage/cli": "workspace:^" - languageName: unknown - linkType: soft - -"@backstage/plugin-cost-insights@workspace:^, @backstage/plugin-cost-insights@workspace:plugins/cost-insights": - version: 0.0.0-use.local - resolution: "@backstage/plugin-cost-insights@workspace:plugins/cost-insights" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@backstage/core-app-api": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/plugin-cost-insights-common": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@backstage/theme": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@material-ui/styles": ^4.9.6 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@testing-library/user-event": ^14.0.0 - "@types/pluralize": ^0.0.33 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - "@types/recharts": ^1.8.14 - "@types/regression": ^2.0.0 - "@types/yup": ^0.32.0 - canvas: ^2.10.2 - classnames: ^2.2.6 - history: ^5.0.0 - luxon: ^3.0.0 - pluralize: ^8.0.0 - qs: ^6.9.4 - react-use: ^17.2.4 - recharts: ^2.5.0 - regression: ^2.0.1 - yup: ^1.0.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - "@backstage/plugin-devtools-backend@workspace:^, @backstage/plugin-devtools-backend@workspace:plugins/devtools-backend": version: 0.0.0-use.local resolution: "@backstage/plugin-devtools-backend@workspace:plugins/devtools-backend" @@ -6382,7 +5550,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-devtools@workspace:^, @backstage/plugin-devtools@workspace:plugins/devtools": +"@backstage/plugin-devtools@workspace:plugins/devtools": version: 0.0.0-use.local resolution: "@backstage/plugin-devtools@workspace:plugins/devtools" dependencies: @@ -6409,128 +5577,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-dynatrace@workspace:^, @backstage/plugin-dynatrace@workspace:plugins/dynatrace": - version: 0.0.0-use.local - resolution: "@backstage/plugin-dynatrace@workspace:plugins/dynatrace" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-app-api": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - react-use: ^17.2.4 - peerDependencies: - "@backstage/plugin-catalog-react": "workspace:^" - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-entity-feedback-backend@workspace:^, @backstage/plugin-entity-feedback-backend@workspace:plugins/entity-feedback-backend": - version: 0.0.0-use.local - resolution: "@backstage/plugin-entity-feedback-backend@workspace:plugins/entity-feedback-backend" - dependencies: - "@backstage/backend-common": "workspace:^" - "@backstage/backend-plugin-api": "workspace:^" - "@backstage/backend-test-utils": "workspace:^" - "@backstage/catalog-client": "workspace:^" - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-auth-node": "workspace:^" - "@backstage/plugin-entity-feedback-common": "workspace:^" - "@types/express": "*" - "@types/supertest": ^2.0.12 - express: ^4.18.1 - express-promise-router: ^4.1.0 - knex: ^3.0.0 - node-fetch: ^2.6.7 - supertest: ^6.2.4 - yn: ^4.0.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-entity-feedback-common@workspace:^, @backstage/plugin-entity-feedback-common@workspace:plugins/entity-feedback-common": - version: 0.0.0-use.local - resolution: "@backstage/plugin-entity-feedback-common@workspace:plugins/entity-feedback-common" - dependencies: - "@backstage/cli": "workspace:^" - languageName: unknown - linkType: soft - -"@backstage/plugin-entity-feedback@workspace:^, @backstage/plugin-entity-feedback@workspace:plugins/entity-feedback": - version: 0.0.0-use.local - resolution: "@backstage/plugin-entity-feedback@workspace:plugins/entity-feedback" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/plugin-entity-feedback-common": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.9.13 - "@material-ui/icons": ^4.9.1 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@testing-library/user-event": ^14.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - msw: ^1.0.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-entity-validation@workspace:plugins/entity-validation": - version: 0.0.0-use.local - resolution: "@backstage/plugin-entity-validation@workspace:plugins/entity-validation" - dependencies: - "@backstage/catalog-client": "workspace:^" - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-catalog-common": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@codemirror/language": ^6.0.0 - "@codemirror/legacy-modes": ^6.1.0 - "@codemirror/view": ^6.0.0 - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@react-hookz/web": ^24.0.0 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - "@uiw/react-codemirror": ^4.9.3 - lodash: ^4.17.21 - react-use: ^17.2.4 - yaml: ^2.0.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - "@backstage/plugin-events-backend-module-aws-sqs@workspace:plugins/events-backend-module-aws-sqs": version: 0.0.0-use.local resolution: "@backstage/plugin-events-backend-module-aws-sqs@workspace:plugins/events-backend-module-aws-sqs" @@ -6652,466 +5698,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-explore-backend@workspace:^, @backstage/plugin-explore-backend@workspace:plugins/explore-backend": - version: 0.0.0-use.local - resolution: "@backstage/plugin-explore-backend@workspace:plugins/explore-backend" - dependencies: - "@backstage/backend-common": "workspace:^" - "@backstage/backend-plugin-api": "workspace:^" - "@backstage/backend-test-utils": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@backstage/plugin-explore-common": "workspace:^" - "@backstage/plugin-search-backend-module-explore": "workspace:^" - "@backstage/types": "workspace:^" - "@types/express": "*" - "@types/supertest": ^2.0.8 - express: ^4.18.1 - express-promise-router: ^4.1.0 - lodash: ^4.17.21 - node-fetch: ^2.6.7 - supertest: ^6.2.4 - yn: ^4.0.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-explore-common@workspace:^, @backstage/plugin-explore-common@workspace:plugins/explore-common": - version: 0.0.0-use.local - resolution: "@backstage/plugin-explore-common@workspace:plugins/explore-common" - dependencies: - "@backstage/cli": "workspace:^" - languageName: unknown - linkType: soft - -"@backstage/plugin-explore-react@workspace:^, @backstage/plugin-explore-react@workspace:plugins/explore-react": - version: 0.0.0-use.local - resolution: "@backstage/plugin-explore-react@workspace:plugins/explore-react" - dependencies: - "@backstage/cli": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/plugin-explore-common": "workspace:^" - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-explore@workspace:^, @backstage/plugin-explore@workspace:plugins/explore": - version: 0.0.0-use.local - resolution: "@backstage/plugin-explore@workspace:plugins/explore" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-app-api": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/frontend-plugin-api": "workspace:^" - "@backstage/plugin-catalog": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/plugin-explore-common": "workspace:^" - "@backstage/plugin-explore-react": "workspace:^" - "@backstage/plugin-search-common": "workspace:^" - "@backstage/plugin-search-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - classnames: ^2.2.6 - msw: ^1.0.0 - pluralize: ^8.0.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-firehydrant@workspace:plugins/firehydrant": - version: 0.0.0-use.local - resolution: "@backstage/plugin-firehydrant@workspace:plugins/firehydrant" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-app-api": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - luxon: ^3.0.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-fossa@workspace:plugins/fossa": - version: 0.0.0-use.local - resolution: "@backstage/plugin-fossa@workspace:plugins/fossa" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-app-api": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/lab": 4.0.0-alpha.61 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - cross-fetch: ^4.0.0 - luxon: ^3.0.0 - msw: ^1.0.0 - p-limit: ^3.0.2 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-gcalendar@workspace:^, @backstage/plugin-gcalendar@workspace:plugins/gcalendar": - version: 0.0.0-use.local - resolution: "@backstage/plugin-gcalendar@workspace:plugins/gcalendar" - dependencies: - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@maxim_mazurok/gapi.client.calendar": ^3.0.20220408 - "@tanstack/react-query": ^4.1.3 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/dompurify": ^3.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - "@types/sanitize-html": ^2.6.2 - classnames: ^2.3.1 - dompurify: ^3.0.0 - lodash: ^4.17.21 - luxon: ^3.0.0 - material-ui-popup-state: ^1.9.3 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-gcp-projects@workspace:^, @backstage/plugin-gcp-projects@workspace:plugins/gcp-projects": - version: 0.0.0-use.local - resolution: "@backstage/plugin-gcp-projects@workspace:plugins/gcp-projects" - dependencies: - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@react-hookz/web": ^24.0.0 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-git-release-manager@workspace:plugins/git-release-manager": - version: 0.0.0-use.local - resolution: "@backstage/plugin-git-release-manager@workspace:plugins/git-release-manager" - dependencies: - "@backstage/cli": "workspace:^" - "@backstage/core-app-api": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/integration": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@octokit/rest": ^19.0.3 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - "@types/recharts": ^1.8.15 - luxon: ^3.0.0 - qs: ^6.10.1 - react-use: ^17.2.4 - recharts: ^2.5.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-github-actions@workspace:^, @backstage/plugin-github-actions@workspace:plugins/github-actions": - version: 0.0.0-use.local - resolution: "@backstage/plugin-github-actions@workspace:plugins/github-actions" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-app-api": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/integration": "workspace:^" - "@backstage/integration-react": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@octokit/rest": ^19.0.3 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - git-url-parse: ^14.0.0 - luxon: ^3.0.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-github-deployments@workspace:plugins/github-deployments": - version: 0.0.0-use.local - resolution: "@backstage/plugin-github-deployments@workspace:plugins/github-deployments" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-app-api": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/integration": "workspace:^" - "@backstage/integration-react": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@octokit/graphql": ^5.0.0 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - luxon: ^3.0.0 - msw: ^1.0.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-github-issues@workspace:plugins/github-issues": - version: 0.0.0-use.local - resolution: "@backstage/plugin-github-issues@workspace:plugins/github-issues" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/integration": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.4 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - luxon: ^3.0.0 - octokit: ^3.0.0 - react-use: ^17.4.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-github-pull-requests-board@workspace:^, @backstage/plugin-github-pull-requests-board@workspace:plugins/github-pull-requests-board": - version: 0.0.0-use.local - resolution: "@backstage/plugin-github-pull-requests-board@workspace:plugins/github-pull-requests-board" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/integration": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@octokit/rest": ^19.0.3 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - luxon: ^3.0.0 - p-limit: ^3.1.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-gitops-profiles@workspace:plugins/gitops-profiles": - version: 0.0.0-use.local - resolution: "@backstage/plugin-gitops-profiles@workspace:plugins/gitops-profiles" - dependencies: - "@backstage/cli": "workspace:^" - "@backstage/core-app-api": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-gocd@workspace:^, @backstage/plugin-gocd@workspace:plugins/gocd": - version: 0.0.0-use.local - resolution: "@backstage/plugin-gocd@workspace:plugins/gocd" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-app-api": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@testing-library/user-event": ^14.0.0 - "@types/lodash": ^4.14.173 - "@types/luxon": ^3.0.0 - "@types/react": ^16.13.1 || ^17.0.0 - lodash: ^4.17.21 - luxon: ^3.0.0 - qs: ^6.10.1 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-graphiql@workspace:^, @backstage/plugin-graphiql@workspace:plugins/graphiql": - version: 0.0.0-use.local - resolution: "@backstage/plugin-graphiql@workspace:plugins/graphiql" - dependencies: - "@backstage/cli": "workspace:^" - "@backstage/core-compat-api": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/frontend-plugin-api": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/codemirror": ^5.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - graphiql: ^3.0.6 - graphql: ^16.0.0 - graphql-ws: ^5.4.1 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-graphql-voyager@workspace:plugins/graphql-voyager": - version: 0.0.0-use.local - resolution: "@backstage/plugin-graphql-voyager@workspace:plugins/graphql-voyager" - dependencies: - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - graphql-voyager: ^1.0.0-rc.31 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-home-react@^0.1.11, @backstage/plugin-home-react@workspace:^, @backstage/plugin-home-react@workspace:plugins/home-react": +"@backstage/plugin-home-react@workspace:^, @backstage/plugin-home-react@workspace:plugins/home-react": version: 0.0.0-use.local resolution: "@backstage/plugin-home-react@workspace:plugins/home-react" dependencies: @@ -7174,149 +5761,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-ilert@workspace:plugins/ilert": - version: 0.0.0-use.local - resolution: "@backstage/plugin-ilert@workspace:plugins/ilert" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@date-io/luxon": 1.x - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@material-ui/pickers": ^3.3.10 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - humanize-duration: ^3.26.0 - luxon: ^3.0.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-jenkins-backend@workspace:^, @backstage/plugin-jenkins-backend@workspace:plugins/jenkins-backend": - version: 0.0.0-use.local - resolution: "@backstage/plugin-jenkins-backend@workspace:plugins/jenkins-backend" - dependencies: - "@backstage/backend-common": "workspace:^" - "@backstage/backend-plugin-api": "workspace:^" - "@backstage/backend-test-utils": "workspace:^" - "@backstage/catalog-client": "workspace:^" - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-catalog-node": "workspace:^" - "@backstage/plugin-jenkins-common": "workspace:^" - "@backstage/plugin-permission-common": "workspace:^" - "@backstage/plugin-permission-node": "workspace:^" - "@types/express": ^4.17.6 - "@types/jenkins": ^1.0.0 - "@types/supertest": ^2.0.8 - express: ^4.17.1 - express-promise-router: ^4.1.0 - jenkins: ^1.0.0 - node-fetch: ^2.6.7 - yn: ^4.0.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-jenkins-common@workspace:^, @backstage/plugin-jenkins-common@workspace:plugins/jenkins-common": - version: 0.0.0-use.local - resolution: "@backstage/plugin-jenkins-common@workspace:plugins/jenkins-common" - dependencies: - "@backstage/cli": "workspace:^" - "@backstage/plugin-catalog-common": "workspace:^" - "@backstage/plugin-permission-common": "workspace:^" - languageName: unknown - linkType: soft - -"@backstage/plugin-jenkins@workspace:^, @backstage/plugin-jenkins@workspace:plugins/jenkins": - version: 0.0.0-use.local - resolution: "@backstage/plugin-jenkins@workspace:plugins/jenkins" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/plugin-jenkins-common": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - "@types/testing-library__jest-dom": ^6.0.0 - luxon: ^3.0.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-kafka-backend@workspace:^, @backstage/plugin-kafka-backend@workspace:plugins/kafka-backend": - version: 0.0.0-use.local - resolution: "@backstage/plugin-kafka-backend@workspace:plugins/kafka-backend" - dependencies: - "@backstage/backend-common": "workspace:^" - "@backstage/backend-plugin-api": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@backstage/errors": "workspace:^" - "@types/express": ^4.17.6 - "@types/jest-when": ^3.5.0 - "@types/lodash": ^4.14.151 - express: ^4.17.1 - express-promise-router: ^4.1.0 - jest-when: ^3.1.0 - kafkajs: ^2.0.0 - lodash: ^4.17.21 - supertest: ^6.1.3 - languageName: unknown - linkType: soft - -"@backstage/plugin-kafka@workspace:^, @backstage/plugin-kafka@workspace:plugins/kafka": - version: 0.0.0-use.local - resolution: "@backstage/plugin-kafka@workspace:plugins/kafka" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - jest-when: ^3.1.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - "@backstage/plugin-kubernetes-backend@workspace:^, @backstage/plugin-kubernetes-backend@workspace:plugins/kubernetes-backend": version: 0.0.0-use.local resolution: "@backstage/plugin-kubernetes-backend@workspace:plugins/kubernetes-backend" @@ -7515,254 +5959,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-lighthouse-backend@workspace:^, @backstage/plugin-lighthouse-backend@workspace:plugins/lighthouse-backend": - version: 0.0.0-use.local - resolution: "@backstage/plugin-lighthouse-backend@workspace:plugins/lighthouse-backend" - dependencies: - "@backstage/backend-common": "workspace:^" - "@backstage/backend-plugin-api": "workspace:^" - "@backstage/backend-tasks": "workspace:^" - "@backstage/catalog-client": "workspace:^" - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@backstage/plugin-catalog-node": "workspace:^" - "@backstage/plugin-lighthouse-common": "workspace:^" - "@backstage/types": "workspace:^" - winston: ^3.2.1 - languageName: unknown - linkType: soft - -"@backstage/plugin-lighthouse-common@workspace:^, @backstage/plugin-lighthouse-common@workspace:plugins/lighthouse-common": - version: 0.0.0-use.local - resolution: "@backstage/plugin-lighthouse-common@workspace:plugins/lighthouse-common" - dependencies: - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - languageName: unknown - linkType: soft - -"@backstage/plugin-lighthouse@workspace:^, @backstage/plugin-lighthouse@workspace:plugins/lighthouse": - version: 0.0.0-use.local - resolution: "@backstage/plugin-lighthouse@workspace:plugins/lighthouse" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-app-api": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/plugin-lighthouse-common": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - msw: ^1.0.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-linguist-backend@workspace:^, @backstage/plugin-linguist-backend@workspace:plugins/linguist-backend": - version: 0.0.0-use.local - resolution: "@backstage/plugin-linguist-backend@workspace:plugins/linguist-backend" - dependencies: - "@backstage/backend-common": "workspace:^" - "@backstage/backend-plugin-api": "workspace:^" - "@backstage/backend-tasks": "workspace:^" - "@backstage/backend-test-utils": "workspace:^" - "@backstage/catalog-client": "workspace:^" - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-catalog-node": "workspace:^" - "@backstage/plugin-linguist-common": "workspace:^" - "@backstage/types": "workspace:^" - "@types/express": "*" - "@types/supertest": ^2.0.8 - express: ^4.18.1 - express-promise-router: ^4.1.0 - fs-extra: ^11.0.0 - js-yaml: ^4.1.0 - knex: ^3.0.0 - linguist-js: ^2.5.3 - luxon: ^3.0.0 - node-fetch: ^2.6.7 - supertest: ^6.2.4 - uuid: ^9.0.0 - yn: ^4.0.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-linguist-common@workspace:^, @backstage/plugin-linguist-common@workspace:plugins/linguist-common": - version: 0.0.0-use.local - resolution: "@backstage/plugin-linguist-common@workspace:plugins/linguist-common" - dependencies: - "@backstage/cli": "workspace:^" - languageName: unknown - linkType: soft - -"@backstage/plugin-linguist@workspace:^, @backstage/plugin-linguist@workspace:plugins/linguist": - version: 0.0.0-use.local - resolution: "@backstage/plugin-linguist@workspace:plugins/linguist" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-compat-api": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/frontend-plugin-api": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/plugin-linguist-common": "workspace:^" - "@material-ui/core": ^4.9.13 - "@material-ui/lab": 4.0.0-alpha.61 - "@testing-library/jest-dom": ^6.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - luxon: ^3.0.0 - react-use: ^17.2.4 - slugify: ^1.6.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-microsoft-calendar@workspace:^, @backstage/plugin-microsoft-calendar@workspace:plugins/microsoft-calendar": - version: 0.0.0-use.local - resolution: "@backstage/plugin-microsoft-calendar@workspace:plugins/microsoft-calendar" - dependencies: - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/errors": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@microsoft/microsoft-graph-types": ^2.25.0 - "@tanstack/react-query": ^4.1.3 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - classnames: ^2.3.1 - dompurify: ^3.0.0 - lodash: ^4.17.21 - luxon: ^3.0.0 - material-ui-popup-state: ^1.9.3 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-newrelic-dashboard@workspace:^, @backstage/plugin-newrelic-dashboard@workspace:plugins/newrelic-dashboard": - version: 0.0.0-use.local - resolution: "@backstage/plugin-newrelic-dashboard@workspace:plugins/newrelic-dashboard" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@testing-library/jest-dom": ^6.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-newrelic@workspace:^, @backstage/plugin-newrelic@workspace:plugins/newrelic": - version: 0.0.0-use.local - resolution: "@backstage/plugin-newrelic@workspace:plugins/newrelic" - dependencies: - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/lab": 4.0.0-alpha.61 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/parse-link-header": ^2.0.1 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - msw: ^1.2.3 - parse-link-header: ^2.0.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-nomad-backend@workspace:^, @backstage/plugin-nomad-backend@workspace:plugins/nomad-backend": - version: 0.0.0-use.local - resolution: "@backstage/plugin-nomad-backend@workspace:plugins/nomad-backend" - dependencies: - "@backstage/backend-common": "workspace:^" - "@backstage/backend-plugin-api": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@backstage/errors": "workspace:^" - "@types/express": "*" - "@types/supertest": ^2.0.8 - express: ^4.17.1 - express-promise-router: ^4.1.0 - node-fetch: ^2.6.7 - supertest: ^6.2.4 - yn: ^4.0.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-nomad@workspace:^, @backstage/plugin-nomad@workspace:plugins/nomad": - version: 0.0.0-use.local - resolution: "@backstage/plugin-nomad@workspace:plugins/nomad" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@material-ui/core": ^4.9.13 - "@material-ui/icons": ^4.9.1 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - cross-fetch: ^4.0.0 - luxon: ^3.3.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - "@backstage/plugin-notifications-backend@workspace:^, @backstage/plugin-notifications-backend@workspace:plugins/notifications-backend": version: 0.0.0-use.local resolution: "@backstage/plugin-notifications-backend@workspace:plugins/notifications-backend" @@ -7859,55 +6055,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-octopus-deploy@workspace:^, @backstage/plugin-octopus-deploy@workspace:plugins/octopus-deploy": - version: 0.0.0-use.local - resolution: "@backstage/plugin-octopus-deploy@workspace:plugins/octopus-deploy" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/plugin-scaffolder-react": "workspace:^" - "@material-ui/core": ^4.9.13 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-opencost@workspace:plugins/opencost": - version: 0.0.0-use.local - resolution: "@backstage/plugin-opencost@workspace:plugins/opencost" - dependencies: - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@date-io/luxon": 1.x - "@material-ui/core": ^4.9.13 - "@material-ui/icons": ^4.9.1 - "@material-ui/pickers": ^3.3.10 - "@material-ui/styles": ^4.11.5 - "@testing-library/jest-dom": ^6.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - axios: ^1.4.0 - date-fns: ^3.0.0 - lodash: ^4.17.21 - recharts: ^2.5.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: "*" - languageName: unknown - linkType: soft - "@backstage/plugin-org-react@workspace:plugins/org-react": version: 0.0.0-use.local resolution: "@backstage/plugin-org-react@workspace:plugins/org-react" @@ -7976,79 +6123,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-pagerduty@workspace:^, @backstage/plugin-pagerduty@workspace:plugins/pagerduty": - version: 0.0.0-use.local - resolution: "@backstage/plugin-pagerduty@workspace:plugins/pagerduty" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-app-api": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/plugin-home-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - luxon: ^3.0.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-periskop-backend@workspace:plugins/periskop-backend": - version: 0.0.0-use.local - resolution: "@backstage/plugin-periskop-backend@workspace:plugins/periskop-backend" - dependencies: - "@backstage/backend-common": "workspace:^" - "@backstage/backend-plugin-api": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@types/express": "*" - "@types/supertest": ^2.0.8 - express: ^4.17.1 - express-promise-router: ^4.1.0 - node-fetch: ^2.6.7 - supertest: ^6.1.6 - yn: ^4.0.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-periskop@workspace:plugins/periskop": - version: 0.0.0-use.local - resolution: "@backstage/plugin-periskop@workspace:plugins/periskop" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/luxon": ^3.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - luxon: ^3.0.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - "@backstage/plugin-permission-backend-module-allow-all-policy@workspace:^, @backstage/plugin-permission-backend-module-allow-all-policy@workspace:plugins/permission-backend-module-policy-allow-all": version: 0.0.0-use.local resolution: "@backstage/plugin-permission-backend-module-allow-all-policy@workspace:plugins/permission-backend-module-policy-allow-all" @@ -8148,84 +6222,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-playlist-backend@workspace:^, @backstage/plugin-playlist-backend@workspace:plugins/playlist-backend": - version: 0.0.0-use.local - resolution: "@backstage/plugin-playlist-backend@workspace:plugins/playlist-backend" - dependencies: - "@backstage/backend-common": "workspace:^" - "@backstage/backend-plugin-api": "workspace:^" - "@backstage/backend-test-utils": "workspace:^" - "@backstage/catalog-client": "workspace:^" - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-auth-node": "workspace:^" - "@backstage/plugin-permission-common": "workspace:^" - "@backstage/plugin-permission-node": "workspace:^" - "@backstage/plugin-playlist-common": "workspace:^" - "@types/express": "*" - "@types/supertest": ^2.0.8 - express: ^4.17.1 - express-promise-router: ^4.1.0 - knex: ^3.0.0 - node-fetch: ^2.6.7 - supertest: ^6.1.3 - uuid: ^9.0.0 - yn: ^4.0.0 - zod: ^3.22.4 - languageName: unknown - linkType: soft - -"@backstage/plugin-playlist-common@workspace:^, @backstage/plugin-playlist-common@workspace:plugins/playlist-common": - version: 0.0.0-use.local - resolution: "@backstage/plugin-playlist-common@workspace:plugins/playlist-common" - dependencies: - "@backstage/cli": "workspace:^" - "@backstage/plugin-permission-common": "workspace:^" - languageName: unknown - linkType: soft - -"@backstage/plugin-playlist@workspace:^, @backstage/plugin-playlist@workspace:plugins/playlist": - version: 0.0.0-use.local - resolution: "@backstage/plugin-playlist@workspace:plugins/playlist" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-app-api": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-catalog-common": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/plugin-permission-common": "workspace:^" - "@backstage/plugin-permission-react": "workspace:^" - "@backstage/plugin-playlist-common": "workspace:^" - "@backstage/plugin-search-common": "workspace:^" - "@backstage/plugin-search-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - lodash: ^4.17.21 - msw: ^1.0.0 - pluralize: ^8.0.0 - qs: ^6.9.4 - react-hook-form: ^7.13.0 - react-use: ^17.2.4 - swr: ^2.0.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - "@backstage/plugin-proxy-backend@workspace:^, @backstage/plugin-proxy-backend@workspace:plugins/proxy-backend": version: 0.0.0-use.local resolution: "@backstage/plugin-proxy-backend@workspace:plugins/proxy-backend" @@ -8255,84 +6251,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-puppetdb@workspace:^, @backstage/plugin-puppetdb@workspace:plugins/puppetdb": - version: 0.0.0-use.local - resolution: "@backstage/plugin-puppetdb@workspace:plugins/puppetdb" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-app-api": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - msw: ^1.0.1 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-rollbar-backend@workspace:^, @backstage/plugin-rollbar-backend@workspace:plugins/rollbar-backend": - version: 0.0.0-use.local - resolution: "@backstage/plugin-rollbar-backend@workspace:plugins/rollbar-backend" - dependencies: - "@backstage/backend-common": "workspace:^" - "@backstage/backend-test-utils": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@types/express": ^4.17.6 - "@types/supertest": ^2.0.8 - compression: ^1.7.4 - cors: ^2.8.5 - express: ^4.17.1 - express-promise-router: ^4.1.0 - fs-extra: ^11.2.0 - lodash: ^4.17.21 - morgan: ^1.10.0 - msw: ^1.0.0 - node-fetch: ^2.6.7 - supertest: ^6.1.3 - winston: ^3.2.1 - yn: ^4.0.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-rollbar@workspace:^, @backstage/plugin-rollbar@workspace:plugins/rollbar": - version: 0.0.0-use.local - resolution: "@backstage/plugin-rollbar@workspace:plugins/rollbar" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/lab": 4.0.0-alpha.61 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - lodash: ^4.17.21 - react-sparklines: ^1.7.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - "@backstage/plugin-scaffolder-backend-module-azure@workspace:^, @backstage/plugin-scaffolder-backend-module-azure@workspace:plugins/scaffolder-backend-module-azure": version: 0.0.0-use.local resolution: "@backstage/plugin-scaffolder-backend-module-azure@workspace:plugins/scaffolder-backend-module-azure" @@ -8874,13 +6792,13 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-search-backend-module-explore@workspace:plugins/search-backend-module-explore" dependencies: + "@backstage-community/plugin-explore-common": ^0.0.3 "@backstage/backend-common": "workspace:^" "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-tasks": "workspace:^" "@backstage/backend-test-utils": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" - "@backstage/plugin-explore-common": "workspace:^" "@backstage/plugin-search-backend-node": "workspace:^" "@backstage/plugin-search-common": "workspace:^" msw: ^1.2.1 @@ -8906,7 +6824,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-search-backend-module-stack-overflow-collator@workspace:^, @backstage/plugin-search-backend-module-stack-overflow-collator@workspace:plugins/search-backend-module-stack-overflow-collator": +"@backstage/plugin-search-backend-module-stack-overflow-collator@workspace:plugins/search-backend-module-stack-overflow-collator": version: 0.0.0-use.local resolution: "@backstage/plugin-search-backend-module-stack-overflow-collator@workspace:plugins/search-backend-module-stack-overflow-collator" dependencies: @@ -9079,64 +6997,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-sentry@workspace:^, @backstage/plugin-sentry@workspace:plugins/sentry": - version: 0.0.0-use.local - resolution: "@backstage/plugin-sentry@workspace:plugins/sentry" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@date-io/core": ^1.3.13 - "@material-table/core": ^3.1.0 - "@material-ui/core": ^4.12.2 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/luxon": ^3.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - luxon: ^3.0.0 - react-sparklines: ^1.7.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-shortcuts@workspace:^, @backstage/plugin-shortcuts@workspace:plugins/shortcuts": - version: 0.0.0-use.local - resolution: "@backstage/plugin-shortcuts@workspace:plugins/shortcuts" - dependencies: - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@backstage/theme": "workspace:^" - "@backstage/types": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - "@types/zen-observable": ^0.8.2 - react-hook-form: ^7.12.2 - react-use: ^17.2.4 - uuid: ^9.0.0 - zen-observable: ^0.10.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - "@backstage/plugin-signals-backend@workspace:^, @backstage/plugin-signals-backend@workspace:plugins/signals-backend": version: 0.0.0-use.local resolution: "@backstage/plugin-signals-backend@workspace:plugins/signals-backend" @@ -9230,313 +7090,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-sonarqube-backend@workspace:^, @backstage/plugin-sonarqube-backend@workspace:plugins/sonarqube-backend": - version: 0.0.0-use.local - resolution: "@backstage/plugin-sonarqube-backend@workspace:plugins/sonarqube-backend" - dependencies: - "@backstage/backend-common": "workspace:^" - "@backstage/backend-plugin-api": "workspace:^" - "@backstage/backend-test-utils": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@backstage/errors": "workspace:^" - "@types/express": "*" - "@types/supertest": ^2.0.12 - express: ^4.18.1 - express-promise-router: ^4.1.0 - msw: ^1.0.0 - node-fetch: ^2.6.7 - supertest: ^6.2.4 - yn: ^5.0.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-sonarqube-react@workspace:^, @backstage/plugin-sonarqube-react@workspace:plugins/sonarqube-react": - version: 0.0.0-use.local - resolution: "@backstage/plugin-sonarqube-react@workspace:plugins/sonarqube-react" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@types/react": ^16.13.1 || ^17.0.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-sonarqube@workspace:plugins/sonarqube": - version: 0.0.0-use.local - resolution: "@backstage/plugin-sonarqube@workspace:plugins/sonarqube" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-app-api": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/plugin-sonarqube-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/styles": ^4.10.0 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - cross-fetch: ^4.0.0 - luxon: ^3.0.0 - msw: ^1.0.0 - rc-progress: 3.5.1 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-splunk-on-call@workspace:plugins/splunk-on-call": - version: 0.0.0-use.local - resolution: "@backstage/plugin-splunk-on-call@workspace:plugins/splunk-on-call" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-app-api": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/luxon": ^3.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - luxon: ^3.0.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-stack-overflow-backend@workspace:plugins/stack-overflow-backend": - version: 0.0.0-use.local - resolution: "@backstage/plugin-stack-overflow-backend@workspace:plugins/stack-overflow-backend" - dependencies: - "@backstage/backend-test-utils": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/plugin-search-backend-module-stack-overflow-collator": "workspace:^" - node-fetch: ^2.6.7 - qs: ^6.9.4 - winston: ^3.2.1 - languageName: unknown - linkType: soft - -"@backstage/plugin-stack-overflow@workspace:^, @backstage/plugin-stack-overflow@workspace:plugins/stack-overflow": - version: 0.0.0-use.local - resolution: "@backstage/plugin-stack-overflow@workspace:plugins/stack-overflow" - dependencies: - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/frontend-plugin-api": "workspace:^" - "@backstage/plugin-home-react": "workspace:^" - "@backstage/plugin-search-common": "workspace:^" - "@backstage/plugin-search-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@testing-library/user-event": ^14.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - cross-fetch: ^4.0.0 - lodash: ^4.17.21 - msw: ^1.0.0 - qs: ^6.9.4 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-stackstorm@workspace:^, @backstage/plugin-stackstorm@workspace:plugins/stackstorm": - version: 0.0.0-use.local - resolution: "@backstage/plugin-stackstorm@workspace:plugins/stackstorm" - dependencies: - "@backstage/cli": "workspace:^" - "@backstage/core-app-api": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - msw: ^1.0.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-tech-insights-backend-module-jsonfc@workspace:^, @backstage/plugin-tech-insights-backend-module-jsonfc@workspace:plugins/tech-insights-backend-module-jsonfc": - version: 0.0.0-use.local - resolution: "@backstage/plugin-tech-insights-backend-module-jsonfc@workspace:plugins/tech-insights-backend-module-jsonfc" - dependencies: - "@backstage/backend-common": "workspace:^" - "@backstage/backend-plugin-api": "workspace:^" - "@backstage/backend-test-utils": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-tech-insights-common": "workspace:^" - "@backstage/plugin-tech-insights-node": "workspace:^" - "@backstage/types": "workspace:^" - ajv: ^8.10.0 - json-rules-engine: ^6.1.2 - lodash: ^4.17.21 - luxon: ^3.0.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-tech-insights-backend@workspace:^, @backstage/plugin-tech-insights-backend@workspace:plugins/tech-insights-backend": - version: 0.0.0-use.local - resolution: "@backstage/plugin-tech-insights-backend@workspace:plugins/tech-insights-backend" - dependencies: - "@backstage/backend-common": "workspace:^" - "@backstage/backend-plugin-api": "workspace:^" - "@backstage/backend-tasks": "workspace:^" - "@backstage/backend-test-utils": "workspace:^" - "@backstage/catalog-client": "workspace:^" - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-tech-insights-common": "workspace:^" - "@backstage/plugin-tech-insights-node": "workspace:^" - "@backstage/types": "workspace:^" - "@types/express": ^4.17.6 - "@types/luxon": ^3.0.0 - "@types/semver": ^7.3.8 - "@types/supertest": ^2.0.8 - express: ^4.17.1 - express-promise-router: ^4.1.0 - knex: ^3.0.0 - lodash: ^4.17.21 - luxon: ^3.0.0 - semver: ^7.5.3 - supertest: ^6.1.3 - uuid: ^9.0.0 - wait-for-expect: ^3.0.2 - yn: ^4.0.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-tech-insights-common@workspace:^, @backstage/plugin-tech-insights-common@workspace:plugins/tech-insights-common": - version: 0.0.0-use.local - resolution: "@backstage/plugin-tech-insights-common@workspace:plugins/tech-insights-common" - dependencies: - "@backstage/cli": "workspace:^" - "@backstage/types": "workspace:^" - "@types/luxon": ^3.0.0 - luxon: ^3.0.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-tech-insights-node@workspace:^, @backstage/plugin-tech-insights-node@workspace:plugins/tech-insights-node": - version: 0.0.0-use.local - resolution: "@backstage/plugin-tech-insights-node@workspace:plugins/tech-insights-node" - dependencies: - "@backstage/backend-common": "workspace:^" - "@backstage/backend-plugin-api": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@backstage/plugin-tech-insights-common": "workspace:^" - "@backstage/types": "workspace:^" - "@types/luxon": ^3.0.0 - luxon: ^3.0.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-tech-insights@workspace:^, @backstage/plugin-tech-insights@workspace:plugins/tech-insights": - version: 0.0.0-use.local - resolution: "@backstage/plugin-tech-insights@workspace:plugins/tech-insights" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/plugin-tech-insights-common": "workspace:^" - "@backstage/types": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - qs: ^6.9.4 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-tech-radar@workspace:^, @backstage/plugin-tech-radar@workspace:plugins/tech-radar": - version: 0.0.0-use.local - resolution: "@backstage/plugin-tech-radar@workspace:plugins/tech-radar" - dependencies: - "@backstage/cli": "workspace:^" - "@backstage/core-compat-api": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/frontend-plugin-api": "workspace:^" - "@backstage/frontend-test-utils": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@testing-library/user-event": ^14.0.0 - "@types/color": ^3.0.1 - "@types/d3-force": ^3.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - color: ^4.0.1 - d3-force: ^3.0.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - "@backstage/plugin-techdocs-addons-test-utils@workspace:^, @backstage/plugin-techdocs-addons-test-utils@workspace:plugins/techdocs-addons-test-utils": version: 0.0.0-use.local resolution: "@backstage/plugin-techdocs-addons-test-utils@workspace:plugins/techdocs-addons-test-utils" @@ -9746,54 +7299,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-todo-backend@workspace:^, @backstage/plugin-todo-backend@workspace:plugins/todo-backend": - version: 0.0.0-use.local - resolution: "@backstage/plugin-todo-backend@workspace:plugins/todo-backend" - dependencies: - "@backstage/backend-common": "workspace:^" - "@backstage/backend-openapi-utils": "workspace:^" - "@backstage/backend-plugin-api": "workspace:^" - "@backstage/catalog-client": "workspace:^" - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/integration": "workspace:^" - "@backstage/plugin-catalog-node": "workspace:^" - "@backstage/repo-tools": "workspace:^" - "@types/express": ^4.17.6 - "@types/supertest": ^2.0.8 - express: ^4.17.1 - leasot: ^12.0.0 - supertest: ^6.1.3 - yn: ^4.0.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-todo@workspace:^, @backstage/plugin-todo@workspace:plugins/todo": - version: 0.0.0-use.local - resolution: "@backstage/plugin-todo@workspace:plugins/todo" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/icons": ^4.9.1 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - "@backstage/plugin-user-settings-backend@workspace:plugins/user-settings-backend": version: 0.0.0-use.local resolution: "@backstage/plugin-user-settings-backend@workspace:plugins/user-settings-backend" @@ -9852,103 +7357,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-vault-backend@workspace:plugins/vault-backend": - version: 0.0.0-use.local - resolution: "@backstage/plugin-vault-backend@workspace:plugins/vault-backend" - dependencies: - "@backstage/backend-common": "workspace:^" - "@backstage/backend-plugin-api": "workspace:^" - "@backstage/backend-tasks": "workspace:^" - "@backstage/backend-test-utils": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-vault-node": "workspace:^" - "@types/compression": ^1.7.2 - "@types/express": "*" - "@types/supertest": ^2.0.8 - compression: ^1.7.4 - cors: ^2.8.5 - express: ^4.17.1 - express-promise-router: ^4.1.0 - helmet: ^6.0.0 - msw: ^1.0.0 - node-fetch: ^2.6.7 - p-limit: ^3.1.0 - supertest: ^6.1.6 - winston: ^3.2.1 - yn: ^5.0.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-vault-node@workspace:^, @backstage/plugin-vault-node@workspace:plugins/vault-node": - version: 0.0.0-use.local - resolution: "@backstage/plugin-vault-node@workspace:plugins/vault-node" - dependencies: - "@backstage/backend-plugin-api": "workspace:^" - "@backstage/cli": "workspace:^" - languageName: unknown - linkType: soft - -"@backstage/plugin-vault@workspace:plugins/vault": - version: 0.0.0-use.local - resolution: "@backstage/plugin-vault@workspace:plugins/vault" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/core-app-api": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - msw: ^1.0.0 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - -"@backstage/plugin-xcmetrics@workspace:plugins/xcmetrics": - version: 0.0.0-use.local - resolution: "@backstage/plugin-xcmetrics@workspace:plugins/xcmetrics" - dependencies: - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@testing-library/dom": ^10.0.0 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@testing-library/user-event": ^14.0.0 - "@types/luxon": ^3.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - lodash: ^4.17.21 - luxon: ^3.0.0 - react-use: ^17.2.4 - recharts: ^2.5.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - "@backstage/release-manifests@workspace:^, @backstage/release-manifests@workspace:packages/release-manifests": version: 0.0.0-use.local resolution: "@backstage/release-manifests@workspace:packages/release-manifests" @@ -10045,7 +7453,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/theme@^0.5.0, @backstage/theme@^0.5.2, @backstage/theme@workspace:^, @backstage/theme@workspace:packages/theme": +"@backstage/theme@^0.5.0, @backstage/theme@workspace:^, @backstage/theme@workspace:packages/theme": version: 0.0.0-use.local resolution: "@backstage/theme@workspace:packages/theme" dependencies: @@ -10365,32 +7773,6 @@ __metadata: languageName: node linkType: hard -"@circleci/backstage-plugin@npm:^0.1.1": - version: 0.1.1 - resolution: "@circleci/backstage-plugin@npm:0.1.1" - dependencies: - "@backstage/catalog-model": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@backstage/theme": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@types/react": ^16.13.1 || ^17.0.0 - circleci-api: ^4.0.0 - humanize-duration: ^3.27.0 - lodash: ^4.17.21 - luxon: ^3.0.0 - react-use: ^17.2.4 - peerDependencies: - 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: ded80e2eef1cec3f83f76e62b1362499c1662ae6307bdc829b78aed02101af6fd85134d94716fbbb60e8a0d5b3d2a4653df81fbdfcab576a47f7b59a332e580f - languageName: node - linkType: hard - "@codemirror/autocomplete@npm:^6.0.0": version: 6.3.0 resolution: "@codemirror/autocomplete@npm:6.3.0" @@ -10529,13 +7911,6 @@ __metadata: languageName: node linkType: hard -"@date-io/core@npm:2.10.7": - version: 2.10.7 - resolution: "@date-io/core@npm:2.10.7" - checksum: 0d8b047e600296ffe31f83a6785d8a80ffbc2de1b536ce0349275c383b4cc30f62316e88ee6da21d39b8081a1d8fe2f698e7ec78927458603fdc47ec2fc64e25 - languageName: node - linkType: hard - "@date-io/date-fns@npm:^1.3.13": version: 1.3.13 resolution: "@date-io/date-fns@npm:1.3.13" @@ -10547,17 +7922,6 @@ __metadata: languageName: node linkType: hard -"@date-io/luxon@npm:1.x, @date-io/luxon@npm:^1.3.13": - version: 1.3.13 - resolution: "@date-io/luxon@npm:1.3.13" - dependencies: - "@date-io/core": ^1.3.13 - peerDependencies: - luxon: ^1.21.3 - checksum: 7dd18ef11ea14111595d8836247ffe756889bd31309796fd98f3bf05b5aaf25f63e8574280d35ae1f511ba11ba6903accc4a584b7103b8affd626b79ab69b056 - languageName: node - linkType: hard - "@davidzemon/passport-okta-oauth@npm:^0.0.5": version: 0.0.5 resolution: "@davidzemon/passport-okta-oauth@npm:0.0.5" @@ -10593,7 +7957,7 @@ __metadata: languageName: node linkType: hard -"@emotion/babel-plugin@npm:^11.10.5, @emotion/babel-plugin@npm:^11.11.0": +"@emotion/babel-plugin@npm:^11.11.0": version: 11.11.0 resolution: "@emotion/babel-plugin@npm:11.11.0" dependencies: @@ -10612,7 +7976,7 @@ __metadata: languageName: node linkType: hard -"@emotion/cache@npm:^11.10.5, @emotion/cache@npm:^11.11.0": +"@emotion/cache@npm:^11.11.0": version: 11.11.0 resolution: "@emotion/cache@npm:11.11.0" dependencies: @@ -10648,7 +8012,7 @@ __metadata: languageName: node linkType: hard -"@emotion/is-prop-valid@npm:^1.1.0, @emotion/is-prop-valid@npm:^1.2.0, @emotion/is-prop-valid@npm:^1.2.2": +"@emotion/is-prop-valid@npm:^1.1.0, @emotion/is-prop-valid@npm:^1.2.2": version: 1.2.2 resolution: "@emotion/is-prop-valid@npm:1.2.2" dependencies: @@ -10671,30 +8035,6 @@ __metadata: languageName: node linkType: hard -"@emotion/react@npm:11.10.5": - version: 11.10.5 - resolution: "@emotion/react@npm:11.10.5" - dependencies: - "@babel/runtime": ^7.18.3 - "@emotion/babel-plugin": ^11.10.5 - "@emotion/cache": ^11.10.5 - "@emotion/serialize": ^1.1.1 - "@emotion/use-insertion-effect-with-fallbacks": ^1.0.0 - "@emotion/utils": ^1.2.0 - "@emotion/weak-memoize": ^0.3.0 - hoist-non-react-statics: ^3.3.1 - peerDependencies: - "@babel/core": ^7.0.0 - react: ">=16.8.0" - peerDependenciesMeta: - "@babel/core": - optional: true - "@types/react": - optional: true - checksum: 32b67b28e9b6d6c53b970072680697f04c2521441050bdeb19a1a7f0164af549b4dad39ff375eda1b6a3cf1cc86ba2c6fa55460ec040e6ebbca3e9ec58353cf7 - languageName: node - linkType: hard - "@emotion/react@npm:^11.10.5": version: 11.11.4 resolution: "@emotion/react@npm:11.11.4" @@ -10716,7 +8056,7 @@ __metadata: languageName: node linkType: hard -"@emotion/serialize@npm:^1.1.1, @emotion/serialize@npm:^1.1.2, @emotion/serialize@npm:^1.1.3, @emotion/serialize@npm:^1.1.4": +"@emotion/serialize@npm:^1.1.2, @emotion/serialize@npm:^1.1.3, @emotion/serialize@npm:^1.1.4": version: 1.1.4 resolution: "@emotion/serialize@npm:1.1.4" dependencies: @@ -10736,29 +8076,6 @@ __metadata: languageName: node linkType: hard -"@emotion/styled@npm:11.10.5": - version: 11.10.5 - resolution: "@emotion/styled@npm:11.10.5" - dependencies: - "@babel/runtime": ^7.18.3 - "@emotion/babel-plugin": ^11.10.5 - "@emotion/is-prop-valid": ^1.2.0 - "@emotion/serialize": ^1.1.1 - "@emotion/use-insertion-effect-with-fallbacks": ^1.0.0 - "@emotion/utils": ^1.2.0 - peerDependencies: - "@babel/core": ^7.0.0 - "@emotion/react": ^11.0.0-rc.0 - react: ">=16.8.0" - peerDependenciesMeta: - "@babel/core": - optional: true - "@types/react": - optional: true - checksum: 1cec5f6aeb227a7255141031e8594f38ad83902413472aae0a46c27e5f9769c01e23c1ad39adee408d8a2168a697464314d1a0c4f50b31a5d25ea506b2d7bbc8 - languageName: node - linkType: hard - "@emotion/styled@npm:^11.10.5": version: 11.11.5 resolution: "@emotion/styled@npm:11.11.5" @@ -10800,7 +8117,7 @@ __metadata: languageName: node linkType: hard -"@emotion/use-insertion-effect-with-fallbacks@npm:^1.0.0, @emotion/use-insertion-effect-with-fallbacks@npm:^1.0.1": +"@emotion/use-insertion-effect-with-fallbacks@npm:^1.0.1": version: 1.0.1 resolution: "@emotion/use-insertion-effect-with-fallbacks@npm:1.0.1" peerDependencies: @@ -10809,14 +8126,14 @@ __metadata: languageName: node linkType: hard -"@emotion/utils@npm:^1.2.0, @emotion/utils@npm:^1.2.1": +"@emotion/utils@npm:^1.2.1": version: 1.2.1 resolution: "@emotion/utils@npm:1.2.1" checksum: e0b44be0705b56b079c55faff93952150be69e79b660ae70ddd5b6e09fc40eb1319654315a9f34bb479d7f4ec94be6068c061abbb9e18b9778ae180ad5d97c73 languageName: node linkType: hard -"@emotion/weak-memoize@npm:^0.3.0, @emotion/weak-memoize@npm:^0.3.1": +"@emotion/weak-memoize@npm:^0.3.1": version: 0.3.1 resolution: "@emotion/weak-memoize@npm:0.3.1" checksum: b2be47caa24a8122622ea18cd2d650dbb4f8ad37b636dc41ed420c2e082f7f1e564ecdea68122b546df7f305b159bf5ab9ffee872abd0f052e687428459af594 @@ -11259,19 +8576,7 @@ __metadata: languageName: node linkType: hard -"@gitbeaker/browser@npm:^35.6.0": - version: 35.8.1 - resolution: "@gitbeaker/browser@npm:35.8.1" - dependencies: - "@gitbeaker/core": ^35.8.1 - "@gitbeaker/requester-utils": ^35.8.1 - delay: ^5.0.0 - ky: 0.28.7 - checksum: 8a76322cfd19da3d691fb08c7ebc79971da02cfb950841578523f20de02cb5e2dcf9741eca048dfa17d6a9620eb4884c9a29d84a230ba9c8d18fc528deb830cd - languageName: node - linkType: hard - -"@gitbeaker/core@npm:^35.6.0, @gitbeaker/core@npm:^35.8.0, @gitbeaker/core@npm:^35.8.1": +"@gitbeaker/core@npm:^35.8.0, @gitbeaker/core@npm:^35.8.1": version: 35.8.1 resolution: "@gitbeaker/core@npm:35.8.1" dependencies: @@ -11437,33 +8742,6 @@ __metadata: languageName: node linkType: hard -"@graphiql/react@npm:^0.21.0": - version: 0.21.0 - resolution: "@graphiql/react@npm:0.21.0" - dependencies: - "@graphiql/toolkit": ^0.9.1 - "@headlessui/react": ^1.7.15 - "@radix-ui/react-dialog": ^1.0.4 - "@radix-ui/react-dropdown-menu": ^2.0.5 - "@radix-ui/react-tooltip": ^1.0.6 - "@radix-ui/react-visually-hidden": ^1.0.3 - "@types/codemirror": ^5.60.8 - clsx: ^1.2.1 - codemirror: ^5.65.3 - codemirror-graphql: ^2.0.11 - copy-to-clipboard: ^3.2.0 - framer-motion: ^6.5.1 - graphql-language-service: ^5.2.0 - markdown-it: ^14.1.0 - set-value: ^4.1.0 - peerDependencies: - graphql: ^15.5.0 || ^16.0.0 - react: ^16.8.0 || ^17 || ^18 - react-dom: ^16.8.0 || ^17 || ^18 - checksum: a0515477b06afdbfa032475456ac08133e10d85d58f332048e38a54c7c4d02e62354996abad7f42d194c6e1dc7fb8365e3ac739f4ae51bf4a8f80403abb81be3 - languageName: node - linkType: hard - "@graphiql/toolkit@npm:^0.9.1": version: 0.9.1 resolution: "@graphiql/toolkit@npm:0.9.1" @@ -12597,48 +9875,6 @@ __metadata: languageName: node linkType: hard -"@material-ui/lab@npm:4.0.0-alpha.45": - version: 4.0.0-alpha.45 - resolution: "@material-ui/lab@npm:4.0.0-alpha.45" - dependencies: - "@babel/runtime": ^7.4.4 - "@material-ui/utils": ^4.7.1 - clsx: ^1.0.4 - prop-types: ^15.7.2 - react-is: ^16.8.0 - peerDependencies: - "@material-ui/core": ^4.9.0 - "@types/react": ^16.8.6 - react: ^16.8.0 - react-dom: ^16.8.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: fa9edb1c6351df6b5d69faa32f94a98fe4ab1b54da02c2287f8448041f9bbb7df940deb1c9dce169c00c0e46d3553175b16a56129a549320ece39094c8836eba - languageName: node - linkType: hard - -"@material-ui/lab@npm:4.0.0-alpha.57": - version: 4.0.0-alpha.57 - resolution: "@material-ui/lab@npm:4.0.0-alpha.57" - dependencies: - "@babel/runtime": ^7.4.4 - "@material-ui/utils": ^4.11.2 - clsx: ^1.0.4 - prop-types: ^15.7.2 - react-is: ^16.8.0 || ^17.0.0 - peerDependencies: - "@material-ui/core": ^4.9.10 - "@types/react": ^16.8.6 || ^17.0.0 - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 0bc8b35e4a96ea04fa3fd43a64ff9685bdea2ad6ed8baf4c8f5cbe1524101a87f33229f6d23638074a3626fc3c55ba15a38d2ab984777dda896e117d0cea5c0e - languageName: node - linkType: hard - "@material-ui/lab@npm:4.0.0-alpha.61, @material-ui/lab@npm:^4.0.0-alpha.57, @material-ui/lab@npm:^4.0.0-alpha.60, @material-ui/lab@npm:^4.0.0-alpha.61": version: 4.0.0-alpha.61 resolution: "@material-ui/lab@npm:4.0.0-alpha.61" @@ -12700,7 +9936,7 @@ __metadata: languageName: node linkType: hard -"@material-ui/styles@npm:^4.10.0, @material-ui/styles@npm:^4.11.0, @material-ui/styles@npm:^4.11.4, @material-ui/styles@npm:^4.11.5, @material-ui/styles@npm:^4.9.6": +"@material-ui/styles@npm:^4.10.0, @material-ui/styles@npm:^4.11.0, @material-ui/styles@npm:^4.11.4, @material-ui/styles@npm:^4.11.5": version: 4.11.5 resolution: "@material-ui/styles@npm:4.11.5" dependencies: @@ -12774,7 +10010,7 @@ __metadata: languageName: node linkType: hard -"@material-ui/utils@npm:^4.11.2, @material-ui/utils@npm:^4.11.3, @material-ui/utils@npm:^4.7.1": +"@material-ui/utils@npm:^4.11.3": version: 4.11.3 resolution: "@material-ui/utils@npm:4.11.3" dependencies: @@ -12788,15 +10024,6 @@ __metadata: languageName: node linkType: hard -"@maxim_mazurok/gapi.client.calendar@npm:^3.0.20220408": - version: 3.0.20220805 - resolution: "@maxim_mazurok/gapi.client.calendar@npm:3.0.20220805" - dependencies: - "@types/gapi.client": "*" - checksum: 981560f83b310a9a8ab1641befac02b732ce92e803b20dabd2cb6fc701d4df97aa265820762455385ce9691850ce31f4323778c60de11f144060800cf10c6ef5 - languageName: node - linkType: hard - "@microsoft/api-documenter@npm:^7.22.33": version: 7.22.33 resolution: "@microsoft/api-documenter@npm:7.22.33" @@ -12847,7 +10074,7 @@ __metadata: languageName: node linkType: hard -"@microsoft/microsoft-graph-types@npm:^2.25.0, @microsoft/microsoft-graph-types@npm:^2.6.0": +"@microsoft/microsoft-graph-types@npm:^2.6.0": version: 2.40.0 resolution: "@microsoft/microsoft-graph-types@npm:2.40.0" checksum: 3892e910baf4fcf2d1bcee4c71683e3707818be6ff1b4b9dbc29b9e2eab942ea0b171b3023d4620213f10d93d03611e6615706a3d1af4ca44028491a0544ccaf @@ -12985,29 +10212,6 @@ __metadata: languageName: node linkType: hard -"@mui/base@npm:5.0.0-alpha.112": - version: 5.0.0-alpha.112 - resolution: "@mui/base@npm:5.0.0-alpha.112" - dependencies: - "@babel/runtime": ^7.20.7 - "@emotion/is-prop-valid": ^1.2.0 - "@mui/types": ^7.2.3 - "@mui/utils": ^5.11.2 - "@popperjs/core": ^2.11.6 - clsx: ^1.2.1 - prop-types: ^15.8.1 - react-is: ^18.2.0 - peerDependencies: - "@types/react": ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: fd19240ac16859d62f057fd80261fc4e0dbc960a648b601bd7beaeb44b88c059f654b0989f33cea655ad61106832bffa0cd8446730c1be7671b6cde383dbce80 - languageName: node - linkType: hard - "@mui/base@npm:5.0.0-beta.40": version: 5.0.0-beta.40 resolution: "@mui/base@npm:5.0.0-beta.40" @@ -13030,92 +10234,13 @@ __metadata: languageName: node linkType: hard -"@mui/core-downloads-tracker@npm:^5.11.2, @mui/core-downloads-tracker@npm:^5.15.15": +"@mui/core-downloads-tracker@npm:^5.15.15": version: 5.15.15 resolution: "@mui/core-downloads-tracker@npm:5.15.15" checksum: 3e99a04e03f66d5fa5f0c23cdce0f9fa2331ba08c99a75dc2347ccaa1c6ed520153e04aaeb0d613c9dca099a3e6242558a6284c33d93f95cc65e3243b17860bc languageName: node linkType: hard -"@mui/icons-material@npm:5.11.0": - version: 5.11.0 - resolution: "@mui/icons-material@npm:5.11.0" - dependencies: - "@babel/runtime": ^7.20.6 - peerDependencies: - "@mui/material": ^5.0.0 - "@types/react": ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 764c1185b3432f0228f3c5217b0e218b10f106fa96d305dfc62c0ef5afd2a7a087b0d664fd0a8171282e195c18d3ee073d5f037901a2bed1a1519a70fbb0501c - languageName: node - linkType: hard - -"@mui/lab@npm:5.0.0-alpha.114": - version: 5.0.0-alpha.114 - resolution: "@mui/lab@npm:5.0.0-alpha.114" - dependencies: - "@babel/runtime": ^7.20.7 - "@mui/base": 5.0.0-alpha.112 - "@mui/system": ^5.11.2 - "@mui/types": ^7.2.3 - "@mui/utils": ^5.11.2 - clsx: ^1.2.1 - prop-types: ^15.8.1 - react-is: ^18.2.0 - peerDependencies: - "@emotion/react": ^11.5.0 - "@emotion/styled": ^11.3.0 - "@mui/material": ^5.0.0 - "@types/react": ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@emotion/react": - optional: true - "@emotion/styled": - optional: true - "@types/react": - optional: true - checksum: 0b6441e7f7a69e2a6910f044ef2a222462a219f61e3a05c023484508e7f14a5fe6baeddf08b37bceab357c7cb0eed90324ac42ecd8e59a6eb6e1c801ea01504a - languageName: node - linkType: hard - -"@mui/material@npm:5.11.2": - version: 5.11.2 - resolution: "@mui/material@npm:5.11.2" - dependencies: - "@babel/runtime": ^7.20.7 - "@mui/base": 5.0.0-alpha.112 - "@mui/core-downloads-tracker": ^5.11.2 - "@mui/system": ^5.11.2 - "@mui/types": ^7.2.3 - "@mui/utils": ^5.11.2 - "@types/react-transition-group": ^4.4.5 - clsx: ^1.2.1 - csstype: ^3.1.1 - prop-types: ^15.8.1 - react-is: ^18.2.0 - react-transition-group: ^4.4.5 - peerDependencies: - "@emotion/react": ^11.5.0 - "@emotion/styled": ^11.3.0 - "@types/react": ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@emotion/react": - optional: true - "@emotion/styled": - optional: true - "@types/react": - optional: true - checksum: 4f2baa4b4d8f7842b081e9e919172020f7055e33c24af36c5a458eac1a76ff3e896651fdf21daa523a68ac0bfb3670864c1b4dec9fae6d8fadf2b602f14f95ea - languageName: node - linkType: hard - "@mui/material@npm:^5.12.2": version: 5.15.15 resolution: "@mui/material@npm:5.15.15" @@ -13218,7 +10343,7 @@ __metadata: languageName: node linkType: hard -"@mui/system@npm:^5.11.2, @mui/system@npm:^5.15.15": +"@mui/system@npm:^5.15.15": version: 5.15.15 resolution: "@mui/system@npm:5.15.15" dependencies: @@ -13246,7 +10371,7 @@ __metadata: languageName: node linkType: hard -"@mui/types@npm:^7.2.14, @mui/types@npm:^7.2.3": +"@mui/types@npm:^7.2.14": version: 7.2.14 resolution: "@mui/types@npm:7.2.14" peerDependencies: @@ -13258,7 +10383,7 @@ __metadata: languageName: node linkType: hard -"@mui/utils@npm:^5.11.2, @mui/utils@npm:^5.14.15, @mui/utils@npm:^5.15.14": +"@mui/utils@npm:^5.14.15, @mui/utils@npm:^5.15.14": version: 5.15.14 resolution: "@mui/utils@npm:5.15.14" dependencies: @@ -13344,18 +10469,6 @@ __metadata: languageName: node linkType: hard -"@newrelic/browser-agent@npm:^1.236.0": - version: 1.252.1 - resolution: "@newrelic/browser-agent@npm:1.252.1" - dependencies: - core-js: ^3.26.0 - fflate: ^0.7.4 - rrweb: 2.0.0-alpha.11 - web-vitals: ^3.1.0 - checksum: 19570311115a926fd99dd24036f71fc304834c6cc379ebcbef874288d6d9a0e3abd77c81df99110bbc395a2d68c4ceb926940913aac7ae4c6bfa9d5e7dfec875 - languageName: node - linkType: hard - "@node-saml/node-saml@npm:^4.0.4": version: 4.0.5 resolution: "@node-saml/node-saml@npm:4.0.5" @@ -14756,7 +11869,7 @@ __metadata: languageName: node linkType: hard -"@popperjs/core@npm:^2.11.6, @popperjs/core@npm:^2.11.8": +"@popperjs/core@npm:^2.11.8": version: 2.11.8 resolution: "@popperjs/core@npm:2.11.8" checksum: e5c69fdebf52a4012f6a1f14817ca8e9599cb1be73dd1387e1785e2ed5e5f0862ff817f420a87c7fc532add1f88a12e25aeb010ffcbdc98eace3d55ce2139cf0 @@ -15530,113 +12643,6 @@ __metadata: languageName: node linkType: hard -"@roadiehq/backstage-plugin-buildkite@npm:^2.0.8": - version: 2.1.22 - resolution: "@roadiehq/backstage-plugin-buildkite@npm:2.1.22" - dependencies: - "@backstage/catalog-model": ^1.4.5 - "@backstage/core-components": ^0.14.3 - "@backstage/core-plugin-api": ^1.9.1 - "@backstage/plugin-catalog-react": ^1.11.2 - "@backstage/theme": ^0.5.2 - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.11.2 - "@material-ui/lab": 4.0.0-alpha.57 - history: ^5.0.0 - moment: ^2.29.1 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router: 6.0.0-beta.0 || ^6.3.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: dfc24af432311725dcede466cc0b8fd070ab3f52cca66d6ca73094096cce42dc79e4bdd32eceb9a749bd0f1c3e707f5113fa7a06031ce5e6c6de00d5aa25e582 - languageName: node - linkType: hard - -"@roadiehq/backstage-plugin-github-insights@npm:^2.0.5": - version: 2.3.28 - resolution: "@roadiehq/backstage-plugin-github-insights@npm:2.3.28" - dependencies: - "@backstage/catalog-model": ^1.4.5 - "@backstage/core-components": ^0.14.3 - "@backstage/core-plugin-api": ^1.9.1 - "@backstage/integration-react": ^1.1.25 - "@backstage/plugin-catalog-react": ^1.11.2 - "@backstage/theme": ^0.5.2 - "@date-io/core": 2.10.7 - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.45 - "@octokit/rest": ^19.0.3 - "@octokit/types": ^9.0.0 - history: ^5.0.0 - immer: 9.0.7 - react-use: ^17.2.4 - zustand: 3.6.9 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router: 6.0.0-beta.0 || ^6.3.0 - checksum: a7955de4d5af049c8af3216b394c157d90e3890f8c31ab47042ab8cd423b3fb98808eb8c9997b66cdd0868ee6bea067e71b110909302841c686559e83ca4dfd1 - languageName: node - linkType: hard - -"@roadiehq/backstage-plugin-github-pull-requests@npm:^2.2.7": - version: 2.5.25 - resolution: "@roadiehq/backstage-plugin-github-pull-requests@npm:2.5.25" - dependencies: - "@backstage/catalog-model": ^1.4.5 - "@backstage/core-components": ^0.14.3 - "@backstage/core-plugin-api": ^1.9.1 - "@backstage/plugin-catalog-react": ^1.11.2 - "@backstage/plugin-home-react": ^0.1.11 - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": ^4.0.0-alpha.60 - "@octokit/rest": ^19.0.3 - "@octokit/types": ^9.0.0 - "@types/node-fetch": ^2.5.7 - history: ^5.0.0 - lodash: ^4.17.21 - luxon: ^3.0.0 - msw: ^1.0.1 - node-fetch: ^2.6.1 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router: 6.0.0-beta.0 || ^6.3.0 - checksum: 009322d338dd5fae958bd1f660cedab0d00e447d1e15468ce0bf04a51822914f00424012091874fadba4689006d5f1bb0c662cf248397d3e631984047ad156c1 - languageName: node - linkType: hard - -"@roadiehq/backstage-plugin-travis-ci@npm:^2.0.5": - version: 2.1.22 - resolution: "@roadiehq/backstage-plugin-travis-ci@npm:2.1.22" - dependencies: - "@backstage/catalog-model": ^1.4.5 - "@backstage/core-components": ^0.14.3 - "@backstage/core-plugin-api": ^1.9.1 - "@backstage/plugin-catalog-react": ^1.11.2 - "@backstage/theme": ^0.5.2 - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.11.2 - "@material-ui/lab": 4.0.0-alpha.57 - cross-fetch: ^3.1.3 - date-fns: ^2.18.0 - history: ^5.0.0 - moment: ^2.29.1 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router: 6.0.0-beta.0 || ^6.3.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: 7c9537c7e277ffc430daac1afdd53765c27d2c12af73860e249ab859c096c732d1ad0166ddbe9a5bff9ff749908da3199b49da1e4028a7cee1c1cf1fbc9c50b5 - languageName: node - linkType: hard - "@rollup/plugin-commonjs@npm:^25.0.0": version: 25.0.7 resolution: "@rollup/plugin-commonjs@npm:25.0.7" @@ -15859,15 +12865,6 @@ __metadata: languageName: node linkType: hard -"@rrweb/types@npm:^2.0.0-alpha.11": - version: 2.0.0-alpha.11 - resolution: "@rrweb/types@npm:2.0.0-alpha.11" - dependencies: - rrweb-snapshot: ^2.0.0-alpha.11 - checksum: 63c815597daacb7f6978c973c53e6e8f10301c0224ce675792c2c8a2cdf059845aefef92b2ee259837813081796398e3432195fdd8cb72c437ab77a20c50b2c7 - languageName: node - linkType: hard - "@rushstack/node-core-library@npm:3.59.7": version: 3.59.7 resolution: "@rushstack/node-core-library@npm:3.59.7" @@ -17830,32 +14827,6 @@ __metadata: languageName: node linkType: hard -"@tanstack/query-core@npm:4.36.1": - version: 4.36.1 - resolution: "@tanstack/query-core@npm:4.36.1" - checksum: 47672094da20d89402d9fe03bb7b0462be73a76ff9ca715169738bc600a719d064d106d083a8eedae22a2c22de22f87d5eb5d31ef447aba771d9190f2117ed10 - languageName: node - linkType: hard - -"@tanstack/react-query@npm:^4.1.3": - version: 4.36.1 - resolution: "@tanstack/react-query@npm:4.36.1" - dependencies: - "@tanstack/query-core": 4.36.1 - use-sync-external-store: ^1.2.0 - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-native: "*" - peerDependenciesMeta: - react-dom: - optional: true - react-native: - optional: true - checksum: 1aff0a476859386f8d32253fa0d0bde7b81769a6d4d4d9cbd78778f0f955459a3bdb7ee27a0d2ee7373090f12998b45df80db0b5b313bd0a7a39d36c6e8e51c5 - languageName: node - linkType: hard - "@techdocs/cli@workspace:*, @techdocs/cli@workspace:packages/techdocs-cli": version: 0.0.0-use.local resolution: "@techdocs/cli@workspace:packages/techdocs-cli" @@ -17905,7 +14876,7 @@ __metadata: languageName: node linkType: hard -"@testing-library/jest-dom@npm:*, @testing-library/jest-dom@npm:^6.0.0": +"@testing-library/jest-dom@npm:^6.0.0": version: 6.4.2 resolution: "@testing-library/jest-dom@npm:6.4.2" dependencies: @@ -18168,19 +15139,6 @@ __metadata: languageName: node linkType: hard -"@types/body-parser-xml@npm:^2.0.2": - version: 2.0.5 - resolution: "@types/body-parser-xml@npm:2.0.5" - dependencies: - "@types/body-parser": "*" - "@types/connect": "*" - "@types/express-serve-static-core": "*" - "@types/node": "*" - "@types/xml2js": "*" - checksum: 97def7a9c60fe72d78a29b14c05bee5cd3f9afb365db919d139d72691ec0435d9df0b2c2f208edcc375c8a78e5dce75bd142c8f2fd5377c101f1c80405df6506 - languageName: node - linkType: hard - "@types/body-parser@npm:*, @types/body-parser@npm:^1.19.0": version: 1.19.5 resolution: "@types/body-parser@npm:1.19.5" @@ -18244,7 +15202,7 @@ __metadata: languageName: node linkType: hard -"@types/codemirror@npm:^5.0.0, @types/codemirror@npm:^5.60.8": +"@types/codemirror@npm:^5.60.8": version: 5.60.15 resolution: "@types/codemirror@npm:5.60.15" dependencies: @@ -18253,31 +15211,6 @@ __metadata: languageName: node linkType: hard -"@types/color-convert@npm:*": - version: 2.0.0 - resolution: "@types/color-convert@npm:2.0.0" - dependencies: - "@types/color-name": "*" - checksum: 027b68665dc2278cc2d83e796ada0a05a08aa5a11297e227c48c7f9f6eac518dec98578ab0072bd211963d3e4b431da70b20ea28d6c3136d0badfd3f9913baee - languageName: node - linkType: hard - -"@types/color-name@npm:*": - version: 1.1.1 - resolution: "@types/color-name@npm:1.1.1" - checksum: b71fcad728cc68abcba1d405742134410c8f8eb3c2ef18113b047afca158ad23a4f2c229bcf71a38f4a818dead375c45b20db121d0e69259c2d81e97a740daa6 - languageName: node - linkType: hard - -"@types/color@npm:^3.0.1": - version: 3.0.6 - resolution: "@types/color@npm:3.0.6" - dependencies: - "@types/color-convert": "*" - checksum: 0f16dcf4e202896d5425019c44a1f99713fca998052ab2fd836cdd38048398a0caf5b79a2efe560e41fca4b9401e8d8f6f02ed541cfea30cca3a8cb1b50b80f7 - languageName: node - linkType: hard - "@types/command-exists@npm:^1.2.0": version: 1.2.3 resolution: "@types/command-exists@npm:1.2.3" @@ -18294,7 +15227,7 @@ __metadata: languageName: node linkType: hard -"@types/compression@npm:^1.7.0, @types/compression@npm:^1.7.2": +"@types/compression@npm:^1.7.0": version: 1.7.5 resolution: "@types/compression@npm:1.7.5" dependencies: @@ -18386,20 +15319,6 @@ __metadata: languageName: node linkType: hard -"@types/css-font-loading-module@npm:0.0.7": - version: 0.0.7 - resolution: "@types/css-font-loading-module@npm:0.0.7" - checksum: a074d3b824b2232160f2353daf1cc62937e4a24154d13607f14f93feaaac6abcf069c8ae02c1396840950fa02c1b3f19ce0f119321f9735905bfb3cd4b9b2021 - languageName: node - linkType: hard - -"@types/d3-array@npm:^3.0.3": - version: 3.0.4 - resolution: "@types/d3-array@npm:3.0.4" - checksum: b0e398365fc1f638d48442e865e036d671c731b2b18f7a92e5172db1f60f5a38d4cd992693a29ad64b38e7ba981eb8c63a2aef95fbdcfbc4bf8926a9cb9ca978 - languageName: node - linkType: hard - "@types/d3-color@npm:*": version: 3.0.2 resolution: "@types/d3-color@npm:3.0.2" @@ -18407,21 +15326,7 @@ __metadata: languageName: node linkType: hard -"@types/d3-ease@npm:^3.0.0": - version: 3.0.0 - resolution: "@types/d3-ease@npm:3.0.0" - checksum: 1be7c993643b5a08332e0ee146375a3845545d8deb423db5d152e0b061524385d2345ceccf968f75f605247b940dd3f9a144335fee2e7d935cddaf187afb7095 - languageName: node - linkType: hard - -"@types/d3-force@npm:^3.0.0": - version: 3.0.9 - resolution: "@types/d3-force@npm:3.0.9" - checksum: 6ec16109b5048cda0877931b5e60565436fee697ccbc223eae1562c4a8401dddacb25b0137da2babca2a810ad0471114444e08c8e395ce90758d768a05a23b4f - languageName: node - linkType: hard - -"@types/d3-interpolate@npm:*, @types/d3-interpolate@npm:^3.0.1": +"@types/d3-interpolate@npm:*": version: 3.0.1 resolution: "@types/d3-interpolate@npm:3.0.1" dependencies: @@ -18437,22 +15342,6 @@ __metadata: languageName: node linkType: hard -"@types/d3-path@npm:^1": - version: 1.0.9 - resolution: "@types/d3-path@npm:1.0.9" - checksum: acbf7376fd7bef61701bce915bf5a9cb5eaa9741b7919d3e644f841a65faf1aea3cf63ba949c21ddda8c9849221394856a2054805aa698d3bb5ac3fe7d029817 - languageName: node - linkType: hard - -"@types/d3-scale@npm:^4.0.2": - version: 4.0.3 - resolution: "@types/d3-scale@npm:4.0.3" - dependencies: - "@types/d3-time": "*" - checksum: 76684da8519ab5f2210e647f74f96ece9c6816dea4ad5d76131121703a5268cc65687a8bc9ebbf4a44039482247336d98811ecc3fbfeb7f0122fdce4bb295547 - languageName: node - linkType: hard - "@types/d3-selection@npm:*, @types/d3-selection@npm:^3.0.1": version: 3.0.10 resolution: "@types/d3-selection@npm:3.0.10" @@ -18460,16 +15349,7 @@ __metadata: languageName: node linkType: hard -"@types/d3-shape@npm:^1": - version: 1.3.12 - resolution: "@types/d3-shape@npm:1.3.12" - dependencies: - "@types/d3-path": ^1 - checksum: 3a62a0a20ef3f767ecd396b2331b836aeaba43a87926a33bb257e3bbe9c70013a2be60718dd94539e287d628da2c5b6f80675c12c0c3a086a3f4129b04ac2285 - languageName: node - linkType: hard - -"@types/d3-shape@npm:^3.0.1, @types/d3-shape@npm:^3.1.0": +"@types/d3-shape@npm:^3.0.1": version: 3.1.6 resolution: "@types/d3-shape@npm:3.1.6" dependencies: @@ -18478,20 +15358,6 @@ __metadata: languageName: node linkType: hard -"@types/d3-time@npm:*, @types/d3-time@npm:^3.0.0": - version: 3.0.0 - resolution: "@types/d3-time@npm:3.0.0" - checksum: e76adb056daccf80107f4db190ac6deb77e8774f00362bb6c76f178e67f2f217422fe502b654edbc9ac6451f6619045b9f6f5fe0db1ec5520e2ada377af7c72e - languageName: node - linkType: hard - -"@types/d3-timer@npm:^3.0.0": - version: 3.0.0 - resolution: "@types/d3-timer@npm:3.0.0" - checksum: 1ec86b3808de6ecfa93cfdf34254761069658af0cc1d9540e8353dbcba161cdf1296a0724187bd17433b2ff16563115fd20b85fc89d5e809ff28f9b1ab134b42 - languageName: node - linkType: hard - "@types/d3-zoom@npm:^3.0.1": version: 3.0.8 resolution: "@types/d3-zoom@npm:3.0.8" @@ -18671,13 +15537,6 @@ __metadata: languageName: node linkType: hard -"@types/gapi.client@npm:*": - version: 1.0.5 - resolution: "@types/gapi.client@npm:1.0.5" - checksum: 2e85b381b45e290de13052e108e4281c0966065db085c3b4294cd801c9425f8ad37b38f76f6a1f404a963fa326564bed953db3352c933c4f417fa209ff4d3c0c - languageName: node - linkType: hard - "@types/git-url-parse@npm:^9.0.0": version: 9.0.3 resolution: "@types/git-url-parse@npm:9.0.3" @@ -18720,15 +15579,6 @@ __metadata: languageName: node linkType: hard -"@types/highlightjs@npm:^10.1.0": - version: 10.1.0 - resolution: "@types/highlightjs@npm:10.1.0" - dependencies: - highlight.js: ^10.1.0 - checksum: 454606bd5ba7425a845abce0bc3aa5fa0575e1047c97a4b7930d76dfced4fcc1985270ec88632cf45cdb0e266f589c362bb1591573bea730eacd08d3cf169747 - languageName: node - linkType: hard - "@types/hoist-non-react-statics@npm:^3.3.0": version: 3.3.1 resolution: "@types/hoist-non-react-statics@npm:3.3.1" @@ -18778,7 +15628,7 @@ __metadata: languageName: node linkType: hard -"@types/humanize-duration@npm:^3.18.1, @types/humanize-duration@npm:^3.25.1, @types/humanize-duration@npm:^3.27.1": +"@types/humanize-duration@npm:^3.18.1": version: 3.27.4 resolution: "@types/humanize-duration@npm:3.27.4" checksum: aa7fa41af839021c846a1728d2f097b7885f80acbc5050623a9804d23fd8fee19d2654eaae331f000a4e551b88d99cd0b5f6cc97aa99f869b9205f6248066827 @@ -18827,26 +15677,7 @@ __metadata: languageName: node linkType: hard -"@types/jenkins@npm:^1.0.0": - version: 1.0.2 - resolution: "@types/jenkins@npm:1.0.2" - dependencies: - "@types/node": "*" - form-data: ^4.0.0 - checksum: c02895642c81a74cb40740117b5fce0af768ac7985028b6fd0c68d88b350261473db8c05681fc1de0c612579f905f283f0de33efe683ea9a716ae5264287bfba - languageName: node - linkType: hard - -"@types/jest-when@npm:^3.5.0": - version: 3.5.5 - resolution: "@types/jest-when@npm:3.5.5" - dependencies: - "@types/jest": "*" - checksum: 816c1ed5554182c43261d23c2902506c316bc0368f2ea1e632a0a93d05d8f6f2918afa6a406c2f5fdd4d277e042b8d2ba797993dc3c2fd2d5f53cda946696772 - languageName: node - linkType: hard - -"@types/jest@npm:*, @types/jest@npm:^29.0.0, @types/jest@npm:^29.5.11": +"@types/jest@npm:^29.5.11": version: 29.5.12 resolution: "@types/jest@npm:29.5.12" dependencies: @@ -18973,7 +15804,7 @@ __metadata: languageName: node linkType: hard -"@types/lodash@npm:^4.14.151, @types/lodash@npm:^4.14.173": +"@types/lodash@npm:^4.14.151": version: 4.17.0 resolution: "@types/lodash@npm:4.17.0" checksum: 3f98c0b67a93994cbc3403d4fa9dbaf52b0b6bb7f07a764d73875c2dcd5ef91222621bd5bcf8eee7b417a74d175c2f7191b9f595f8603956fd06f0674c0cba93 @@ -19103,7 +15934,7 @@ __metadata: languageName: node linkType: hard -"@types/node-fetch@npm:^2.5.0, @types/node-fetch@npm:^2.5.12, @types/node-fetch@npm:^2.5.7": +"@types/node-fetch@npm:^2.5.0, @types/node-fetch@npm:^2.5.12": version: 2.6.11 resolution: "@types/node-fetch@npm:2.6.11" dependencies: @@ -19205,13 +16036,6 @@ __metadata: languageName: node linkType: hard -"@types/parse-link-header@npm:^2.0.1": - version: 2.0.3 - resolution: "@types/parse-link-header@npm:2.0.3" - checksum: 600093cd66fcc3841e799837581ba9d33ae49c299c00ad3d55791a90f5baa876511cf39aecbf06bc07c60eb7ccd6766ecc8feff52ecae241621f7b1e6c6cdcbc - languageName: node - linkType: hard - "@types/passport-auth0@npm:^1.0.5": version: 1.0.9 resolution: "@types/passport-auth0@npm:1.0.9" @@ -19318,13 +16142,6 @@ __metadata: languageName: node linkType: hard -"@types/pluralize@npm:^0.0.33": - version: 0.0.33 - resolution: "@types/pluralize@npm:0.0.33" - checksum: 282d42dc0187e5e0912f9f36ee0f5615bfd273a08d40afe5bf5881cb28daf1977abe10564543032aa0f42352ebba739ff3d86bf5562ac4691c6d1761fcc7cf39 - languageName: node - linkType: hard - "@types/prettier@npm:^2.0.0": version: 2.7.3 resolution: "@types/prettier@npm:2.7.3" @@ -19446,7 +16263,7 @@ __metadata: languageName: node linkType: hard -"@types/react-transition-group@npm:^4.2.0, @types/react-transition-group@npm:^4.4.10, @types/react-transition-group@npm:^4.4.5": +"@types/react-transition-group@npm:^4.2.0, @types/react-transition-group@npm:^4.4.10": version: 4.4.10 resolution: "@types/react-transition-group@npm:4.4.10" dependencies: @@ -19493,16 +16310,6 @@ __metadata: languageName: node linkType: hard -"@types/recharts@npm:^1.8.14, @types/recharts@npm:^1.8.15": - version: 1.8.29 - resolution: "@types/recharts@npm:1.8.29" - dependencies: - "@types/d3-shape": ^1 - "@types/react": "*" - checksum: 091d018298d9c5e22b1a937e1229e721e2f6ac030fb73024717f6d20f3ff18575557560afd2247987f102f5981402b1fa1bf13362147aa0e89656ecc51ac3e2b - languageName: node - linkType: hard - "@types/recursive-readdir@npm:^2.2.0": version: 2.2.4 resolution: "@types/recursive-readdir@npm:2.2.4" @@ -19512,13 +16319,6 @@ __metadata: languageName: node linkType: hard -"@types/regression@npm:^2.0.0": - version: 2.0.6 - resolution: "@types/regression@npm:2.0.6" - checksum: c412ddd924efd53395f0011b38a6b1dbc94fc71adfa80efcb6657f0f1b6123fb27c101798dda8d0aa638c925900b4b4a9c5c03504a0d1255edd160e3090a5ce9 - languageName: node - linkType: hard - "@types/request@npm:^2.47.1, @types/request@npm:^2.48.8": version: 2.48.12 resolution: "@types/request@npm:2.48.12" @@ -19572,15 +16372,6 @@ __metadata: languageName: node linkType: hard -"@types/sanitize-html@npm:^2.6.2": - version: 2.11.0 - resolution: "@types/sanitize-html@npm:2.11.0" - dependencies: - htmlparser2: ^8.0.0 - checksum: a901d55d31cd946a7fce0130cc7cf6bcf56602af9c87291be77d8149c60e7afc47c83ca74c67c2d84e6ba029fe9bbd6f14f89a8cb30fbd185766eebc5722c251 - languageName: node - linkType: hard - "@types/sarif@npm:^2.1.4": version: 2.1.5 resolution: "@types/sarif@npm:2.1.5" @@ -19595,7 +16386,7 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:^7.3.12, @types/semver@npm:^7.3.8, @types/semver@npm:^7.5.0": +"@types/semver@npm:^7.3.12, @types/semver@npm:^7.5.0": version: 7.5.8 resolution: "@types/semver@npm:7.5.8" checksum: ea6f5276f5b84c55921785a3a27a3cd37afee0111dfe2bcb3e03c31819c197c782598f17f0b150a69d453c9584cd14c4c4d7b9a55d2c5e6cacd4d66fdb3b3663 @@ -19743,7 +16534,7 @@ __metadata: languageName: node linkType: hard -"@types/supertest@npm:^2.0.12, @types/supertest@npm:^2.0.8": +"@types/supertest@npm:^2.0.8": version: 2.0.16 resolution: "@types/supertest@npm:2.0.16" dependencies: @@ -19798,15 +16589,6 @@ __metadata: languageName: node linkType: hard -"@types/testing-library__jest-dom@npm:^6.0.0": - version: 6.0.0 - resolution: "@types/testing-library__jest-dom@npm:6.0.0" - dependencies: - "@testing-library/jest-dom": "*" - checksum: 1b4db1aa3c4225524203b4d1c3b36c7129e9d1e0547e46d2e5283c3ece226a3c16f5f20387cc71b33ab0eecd99d0cf91111bb327e8adb240388d99fb94af7a4d - languageName: node - linkType: hard - "@types/through@npm:*": version: 0.0.30 resolution: "@types/through@npm:0.0.30" @@ -19902,13 +16684,6 @@ __metadata: languageName: node linkType: hard -"@types/whatwg-mimetype@npm:^3.0.0": - version: 3.0.0 - resolution: "@types/whatwg-mimetype@npm:3.0.0" - checksum: 98254edcddb5b9580aa41c19e6c96d2bfb178285d5c2560e3a1f321f14da70192adc82950baecd2cad5876098b0677fbe813db1edf9ab9ba0a9996f0bf2bb703 - languageName: node - linkType: hard - "@types/wrap-ansi@npm:^3.0.0": version: 3.0.0 resolution: "@types/wrap-ansi@npm:3.0.0" @@ -19944,7 +16719,7 @@ __metadata: languageName: node linkType: hard -"@types/xml2js@npm:*, @types/xml2js@npm:^0.4.11, @types/xml2js@npm:^0.4.7": +"@types/xml2js@npm:^0.4.11, @types/xml2js@npm:^0.4.7": version: 0.4.14 resolution: "@types/xml2js@npm:0.4.14" dependencies: @@ -19994,7 +16769,7 @@ __metadata: languageName: node linkType: hard -"@types/zen-observable@npm:^0.8.0, @types/zen-observable@npm:^0.8.2": +"@types/zen-observable@npm:^0.8.0": version: 0.8.7 resolution: "@types/zen-observable@npm:0.8.7" checksum: 6d4cdccded97f8e21b18224a70524e559abe2568863ed21ea000580aa3446c6d583253e83e8ecc0c93b4060ef3fb7f9d14739a57ee18925cc30e0e7d79713a15 @@ -20620,13 +17395,6 @@ __metadata: languageName: node linkType: hard -"@xstate/fsm@npm:^1.4.0": - version: 1.6.5 - resolution: "@xstate/fsm@npm:1.6.5" - checksum: da24fa4f40479223da34714640cea64ec894bbfeb2281a0a870af68882ae1d6fb6d724d6e5c0d4e6929728c699b92858f7389ef7d6a5d00ac66ba8cde3934eed - languageName: node - linkType: hard - "@xtuc/ieee754@npm:^1.2.0": version: 1.2.0 resolution: "@xtuc/ieee754@npm:1.2.0" @@ -20951,22 +17719,6 @@ __metadata: languageName: node linkType: hard -"already@npm:^3.2.0": - version: 3.4.1 - resolution: "already@npm:3.4.1" - checksum: 4bc145ca4d3c0b92d8cdbd9c47590f5b1e52f7cb112d16961aeab35496cf4639b6f49c5c7bb9056cfdcf47f2c26ac9c9c09a86d11a5108d605e79628d9f64d93 - languageName: node - linkType: hard - -"anafanafo@npm:2.0.0": - version: 2.0.0 - resolution: "anafanafo@npm:2.0.0" - dependencies: - char-width-table-consumer: ^1.0.0 - checksum: c166fc5920ca83c321ecfecdaf7b8b6e09553ad8c6214da39cd82e77decb4b06da440bdcb978ba567c4ed34746e048d61901ff9ddedf52555aeba82642115ac8 - languageName: node - linkType: hard - "analytics-node@npm:^6.2.0": version: 6.2.0 resolution: "analytics-node@npm:6.2.0" @@ -21096,7 +17848,7 @@ __metadata: languageName: node linkType: hard -"app-next-example-plugin@workspace:^, app-next-example-plugin@workspace:packages/app-next-example-plugin": +"app-next-example-plugin@workspace:packages/app-next-example-plugin": version: 0.0.0-use.local resolution: "app-next-example-plugin@workspace:packages/app-next-example-plugin" dependencies: @@ -21573,7 +18325,7 @@ __metadata: languageName: node linkType: hard -"async@npm:^3.2.0, async@npm:^3.2.3, async@npm:^3.2.4": +"async@npm:^3.2.3, async@npm:^3.2.4": version: 3.2.4 resolution: "async@npm:3.2.4" checksum: 43d07459a4e1d09b84a20772414aa684ff4de085cbcaec6eea3c7a8f8150e8c62aa6cd4e699fe8ee93c3a5b324e777d34642531875a0817a35697522c1b02e89 @@ -21728,15 +18480,6 @@ __metadata: languageName: node linkType: hard -"axios@npm:^0.21.1": - version: 0.21.4 - resolution: "axios@npm:0.21.4" - dependencies: - follow-redirects: ^1.14.0 - checksum: 44245f24ac971e7458f3120c92f9d66d1fc695e8b97019139de5b0cc65d9b8104647db01e5f46917728edfc0cfd88eb30fc4c55e6053eef4ace76768ce95ff3c - languageName: node - linkType: hard - "axios@npm:^0.27.2": version: 0.27.2 resolution: "axios@npm:0.27.2" @@ -21984,18 +18727,6 @@ __metadata: languageName: node linkType: hard -"badge-maker@npm:^3.3.0": - version: 3.3.1 - resolution: "badge-maker@npm:3.3.1" - dependencies: - anafanafo: 2.0.0 - css-color-converter: ^2.0.0 - bin: - badge: lib/badge-cli.js - checksum: 17ddd409da395a5a58a4b984aa3224a26fec80a580f7b2f011cbfcf3d1ecc4b8daae879d0ff21b7bb78081eb03c703fd161bebc846018456edfa7e3544932e10 - languageName: node - linkType: hard - "bail@npm:^2.0.0": version: 2.0.1 resolution: "bail@npm:2.0.1" @@ -22059,13 +18790,6 @@ __metadata: languageName: node linkType: hard -"base64-arraybuffer@npm:^1.0.1": - version: 1.0.2 - resolution: "base64-arraybuffer@npm:1.0.2" - checksum: 15e6400d2d028bf18be4ed97702b11418f8f8779fb8c743251c863b726638d52f69571d4cc1843224da7838abef0949c670bde46936663c45ad078e89fee5c62 - languageName: node - linkType: hard - "base64-js@npm:^1.0.2, base64-js@npm:^1.3.0, base64-js@npm:^1.3.1, base64-js@npm:^1.5.1": version: 1.5.1 resolution: "base64-js@npm:1.5.1" @@ -22194,20 +18918,13 @@ __metadata: languageName: node linkType: hard -"binary-extensions@npm:^2.0.0, binary-extensions@npm:^2.2.0": +"binary-extensions@npm:^2.0.0": version: 2.2.0 resolution: "binary-extensions@npm:2.2.0" checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8 languageName: node linkType: hard -"binary-search@npm:^1.3.5": - version: 1.3.6 - resolution: "binary-search@npm:1.3.6" - checksum: 2e6b3459a9c1ba1bd674a6a855a5ef7505f70707422244430e3510e989c0df6074a49fe60784a98b93b51545c9bcace1db1defee06ff861b124c036a2f2836bf - languageName: node - linkType: hard - "binaryextensions@npm:^4.15.0, binaryextensions@npm:^4.16.0": version: 4.18.0 resolution: "binaryextensions@npm:4.18.0" @@ -22263,16 +18980,7 @@ __metadata: languageName: node linkType: hard -"body-parser-xml@npm:^2.0.5": - version: 2.0.5 - resolution: "body-parser-xml@npm:2.0.5" - dependencies: - xml2js: ^0.5.0 - checksum: 57133dbe6439f74f2ffb814b54ab806596a31c51e0d93e045b3068402ae184d4fcb799b2966414d1f393f8dcc8342529d4d3ce4cdeaa219c3af140d961c56dfd - languageName: node - linkType: hard - -"body-parser@npm:1.20.2, body-parser@npm:^1.15.2, body-parser@npm:^1.20.0": +"body-parser@npm:1.20.2, body-parser@npm:^1.15.2": version: 1.20.2 resolution: "body-parser@npm:1.20.2" dependencies: @@ -22960,15 +19668,6 @@ __metadata: languageName: node linkType: hard -"char-width-table-consumer@npm:^1.0.0": - version: 1.0.0 - resolution: "char-width-table-consumer@npm:1.0.0" - dependencies: - binary-search: ^1.3.5 - checksum: daffca7cf4201f55acb75c6f98967be6d8a7cbb5783f3e58d90930d83cadc367e63e62fcfa893ea3985c05d8c32557a1bfa2ea7e2f39b845cb2dea966cfbeccd - languageName: node - linkType: hard - "character-entities-legacy@npm:^1.0.0": version: 1.1.4 resolution: "character-entities-legacy@npm:1.1.4" @@ -23118,15 +19817,6 @@ __metadata: languageName: node linkType: hard -"circleci-api@npm:^4.0.0": - version: 4.1.4 - resolution: "circleci-api@npm:4.1.4" - dependencies: - axios: ^0.21.1 - checksum: b01df7a3361df93f447957abcefbf9d99041076de7c8a27da8c9ae27514ae3a9527c4d3677a6a13131cecb882efe18077e0665b6b34619a3c0678664ed94b4ed - languageName: node - linkType: hard - "cjs-module-lexer@npm:^1.0.0": version: 1.2.2 resolution: "cjs-module-lexer@npm:1.2.2" @@ -23134,7 +19824,7 @@ __metadata: languageName: node linkType: hard -"classnames@npm:*, classnames@npm:^2.2.5, classnames@npm:^2.2.6, classnames@npm:^2.3.1, classnames@npm:^2.5.1": +"classnames@npm:*, classnames@npm:^2.2.6, classnames@npm:^2.3.1, classnames@npm:^2.5.1": version: 2.5.1 resolution: "classnames@npm:2.5.1" checksum: da424a8a6f3a96a2e87d01a432ba19315503294ac7e025f9fece656db6b6a0f7b5003bb1fbb51cbb0d9624d964f1b9bb35a51c73af9b2434c7b292c42231c1e5 @@ -23337,7 +20027,7 @@ __metadata: languageName: node linkType: hard -"clone@npm:2.x, clone@npm:^2.1.1, clone@npm:^2.1.2": +"clone@npm:2.x, clone@npm:^2.1.1": version: 2.1.2 resolution: "clone@npm:2.1.2" checksum: aaf106e9bc025b21333e2f4c12da539b568db4925c0501a1bf4070836c9e848c892fa22c35548ce0d1132b08bbbfa17a00144fe58fccdab6fa900fec4250f67d @@ -23369,7 +20059,7 @@ __metadata: languageName: node linkType: hard -"clsx@npm:^2.0.0, clsx@npm:^2.1.0": +"clsx@npm:^2.1.0": version: 2.1.0 resolution: "clsx@npm:2.1.0" checksum: 43fefc29b6b49c9476fbce4f8b1cc75c27b67747738e598e6651dd40d63692135dc60b18fa1c5b78a2a9ba8ae6fd2055a068924b94e20b42039bd53b78b98e1d @@ -23406,7 +20096,7 @@ __metadata: languageName: node linkType: hard -"codemirror-graphql@npm:^2.0.10, codemirror-graphql@npm:^2.0.11": +"codemirror-graphql@npm:^2.0.10": version: 2.0.11 resolution: "codemirror-graphql@npm:2.0.11" dependencies: @@ -23461,13 +20151,6 @@ __metadata: languageName: node linkType: hard -"color-convert@npm:^0.5.2": - version: 0.5.3 - resolution: "color-convert@npm:0.5.3" - checksum: 1074989a2c216d0171a397b870a0d698ef802ab3f9ece72b35bd92c4d20aeab31f222ea525dd5d3fad175a3f256a750eadd14ab882caed0089efc1cb7ba74086 - languageName: node - linkType: hard - "color-convert@npm:^1.9.0, color-convert@npm:^1.9.1": version: 1.9.3 resolution: "color-convert@npm:1.9.3" @@ -23493,14 +20176,14 @@ __metadata: languageName: node linkType: hard -"color-name@npm:^1.0.0, color-name@npm:^1.1.4, color-name@npm:~1.1.4": +"color-name@npm:^1.0.0, color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 languageName: node linkType: hard -"color-string@npm:^1.5.2, color-string@npm:^1.9.0": +"color-string@npm:^1.5.2": version: 1.9.0 resolution: "color-string@npm:1.9.0" dependencies: @@ -23529,16 +20212,6 @@ __metadata: languageName: node linkType: hard -"color@npm:^4.0.1": - version: 4.2.3 - resolution: "color@npm:4.2.3" - dependencies: - color-convert: ^2.0.1 - color-string: ^1.9.0 - checksum: 0579629c02c631b426780038da929cca8e8d80a40158b09811a0112a107c62e10e4aad719843b791b1e658ab4e800558f2e87ca4522c8b32349d497ecb6adeb4 - languageName: node - linkType: hard - "colord@npm:^2.9.1": version: 2.9.1 resolution: "colord@npm:2.9.1" @@ -23677,13 +20350,6 @@ __metadata: languageName: node linkType: hard -"commander@npm:^9.5.0 <10": - version: 9.5.0 - resolution: "commander@npm:9.5.0" - checksum: c7a3e27aa59e913b54a1bafd366b88650bc41d6651f0cbe258d4ff09d43d6a7394232a4dadd0bf518b3e696fdf595db1028a0d82c785b88bd61f8a440cecfade - languageName: node - linkType: hard - "common-ancestor-path@npm:^1.0.1": version: 1.0.1 resolution: "common-ancestor-path@npm:1.0.1" @@ -23712,20 +20378,6 @@ __metadata: languageName: node linkType: hard -"commonmark@npm:0.30.0": - version: 0.30.0 - resolution: "commonmark@npm:0.30.0" - dependencies: - entities: ~2.0 - mdurl: ~1.0.1 - minimist: ">=1.2.2" - string.prototype.repeat: ^0.2.0 - bin: - commonmark: bin/commonmark - checksum: 39f05d6d0f471aa345487d45199809233f29f857630780fde23661356f1f31970f67328934895d3062e01524674785981837c3b6f4303b63d8c9bff8fa99ec83 - languageName: node - linkType: hard - "compare-versions@npm:4.1.4": version: 4.1.4 resolution: "compare-versions@npm:4.1.4" @@ -24118,7 +20770,7 @@ __metadata: languageName: node linkType: hard -"core-js@npm:^3.26.0, core-js@npm:^3.6.5": +"core-js@npm:^3.6.5": version: 3.37.0 resolution: "core-js@npm:3.37.0" checksum: 212c3e9b3fc277dbb63739ef58a61c5709ccd0b36f09c3ce6946aa91fa180c60f57f976d4a5fdb9cda0c6cb55417379ba5a008fc3a1384ec94ec8ec61826469d @@ -24351,7 +21003,7 @@ __metadata: languageName: node linkType: hard -"cross-fetch@npm:^3.1.3, cross-fetch@npm:^3.1.5, cross-fetch@npm:^3.1.8 <4": +"cross-fetch@npm:^3.1.5": version: 3.1.8 resolution: "cross-fetch@npm:3.1.8" dependencies: @@ -24464,17 +21116,6 @@ __metadata: languageName: node linkType: hard -"css-color-converter@npm:^2.0.0": - version: 2.0.0 - resolution: "css-color-converter@npm:2.0.0" - dependencies: - color-convert: ^0.5.2 - color-name: ^1.1.4 - css-unit-converter: ^1.1.2 - checksum: 87819fb3648bb433de49e534c5597d8021642f3199f8985f27b41dc5170c522f775db804fc4533ea78723f8cc70747c545c8f010f4a3ca0ba7bc4dd8f3eea532 - languageName: node - linkType: hard - "css-color-keywords@npm:^1.0.0": version: 1.0.0 resolution: "css-color-keywords@npm:1.0.0" @@ -24573,13 +21214,6 @@ __metadata: languageName: node linkType: hard -"css-unit-converter@npm:^1.1.2": - version: 1.1.2 - resolution: "css-unit-converter@npm:1.1.2" - checksum: 07888033346a5128f34dbe2f72884c966d24e9f29db24416dcde92860242490617ef9a178ac193a92f730834bbeea026cdc7027701d92ba9bbbe59db7a37eb2a - languageName: node - linkType: hard - "css-vendor@npm:^2.0.8": version: 2.0.8 resolution: "css-vendor@npm:2.0.8" @@ -24721,7 +21355,7 @@ __metadata: languageName: node linkType: hard -"csstype@npm:^3.0.2, csstype@npm:^3.1.1, csstype@npm:^3.1.2, csstype@npm:^3.1.3": +"csstype@npm:^3.0.2, csstype@npm:^3.1.2, csstype@npm:^3.1.3": version: 3.0.9 resolution: "csstype@npm:3.0.9" checksum: 199f9af7e673f9f188525c3102a329d637ff46c52f6385a4427ff5cb17adcb736189150170a7af7c5701d18d7704bdad130273f4aa7e44c6c4f9967e6115dc93 @@ -24768,15 +21402,6 @@ __metadata: languageName: node linkType: hard -"d3-array@npm:2 - 3, d3-array@npm:2.10.0 - 3, d3-array@npm:^3.1.6": - version: 3.2.3 - resolution: "d3-array@npm:3.2.3" - dependencies: - internmap: 1 - 2 - checksum: 41d6a4989b73e0d2649a880b2f29a7e7cc059db0eba36cd29a79e0118ebdf6b78922a84cde0733cd54cb4072f3442ec44f3563902e00ea42892442d60e99f961 - languageName: node - linkType: hard - "d3-color@npm:1 - 3": version: 3.1.0 resolution: "d3-color@npm:3.1.0" @@ -24801,32 +21426,14 @@ __metadata: languageName: node linkType: hard -"d3-ease@npm:1 - 3, d3-ease@npm:^3.0.1": +"d3-ease@npm:1 - 3": version: 3.0.1 resolution: "d3-ease@npm:3.0.1" checksum: 06e2ee5326d1e3545eab4e2c0f84046a123dcd3b612e68858219aa034da1160333d9ce3da20a1d3486d98cb5c2a06f7d233eee1bc19ce42d1533458bd85dedcd languageName: node linkType: hard -"d3-force@npm:^3.0.0": - version: 3.0.0 - resolution: "d3-force@npm:3.0.0" - dependencies: - d3-dispatch: 1 - 3 - d3-quadtree: 1 - 3 - d3-timer: 1 - 3 - checksum: 6c7e96438cab62fa32aeadb0ade3297b62b51f81b1b38b0a60a5ec9fd627d74090c1189654d92df2250775f31b06812342f089f1d5947de9960a635ee3581def - languageName: node - linkType: hard - -"d3-format@npm:1 - 3": - version: 3.1.0 - resolution: "d3-format@npm:3.1.0" - checksum: f345ec3b8ad3cab19bff5dead395bd9f5590628eb97a389b1dd89f0b204c7c4fc1d9520f13231c2c7cf14b7c9a8cf10f8ef15bde2befbab41454a569bd706ca2 - languageName: node - linkType: hard - -"d3-interpolate@npm:1 - 3, d3-interpolate@npm:1.2.0 - 3, d3-interpolate@npm:^3.0.1": +"d3-interpolate@npm:1 - 3": version: 3.0.1 resolution: "d3-interpolate@npm:3.0.1" dependencies: @@ -24842,26 +21449,6 @@ __metadata: languageName: node linkType: hard -"d3-quadtree@npm:1 - 3": - version: 3.0.1 - resolution: "d3-quadtree@npm:3.0.1" - checksum: 5469d462763811475f34a7294d984f3eb100515b0585ca5b249656f6b1a6e99b20056a2d2e463cc9944b888896d2b1d07859c50f9c0cf23438df9cd2e3146066 - languageName: node - linkType: hard - -"d3-scale@npm:^4.0.2": - version: 4.0.2 - resolution: "d3-scale@npm:4.0.2" - dependencies: - d3-array: 2.10.0 - 3 - d3-format: 1 - 3 - d3-interpolate: 1.2.0 - 3 - d3-time: 2.1.1 - 3 - d3-time-format: 2 - 4 - checksum: a9c770d283162c3bd11477c3d9d485d07f8db2071665f1a4ad23eec3e515e2cefbd369059ec677c9ac849877d1a765494e90e92051d4f21111aa56791c98729e - languageName: node - linkType: hard - "d3-selection@npm:2 - 3, d3-selection@npm:3, d3-selection@npm:^3.0.0": version: 3.0.0 resolution: "d3-selection@npm:3.0.0" @@ -24869,7 +21456,7 @@ __metadata: languageName: node linkType: hard -"d3-shape@npm:^3.0.0, d3-shape@npm:^3.1.0": +"d3-shape@npm:^3.0.0": version: 3.2.0 resolution: "d3-shape@npm:3.2.0" dependencies: @@ -24878,25 +21465,7 @@ __metadata: languageName: node linkType: hard -"d3-time-format@npm:2 - 4": - version: 4.1.0 - resolution: "d3-time-format@npm:4.1.0" - dependencies: - d3-time: 1 - 3 - checksum: 7342bce28355378152bbd4db4e275405439cabba082d9cd01946d40581140481c8328456d91740b0fe513c51ec4a467f4471ffa390c7e0e30ea30e9ec98fcdf4 - languageName: node - linkType: hard - -"d3-time@npm:1 - 3, d3-time@npm:2.1.1 - 3, d3-time@npm:^3.0.0": - version: 3.1.0 - resolution: "d3-time@npm:3.1.0" - dependencies: - d3-array: 2 - 3 - checksum: 613b435352a78d9f31b7f68540788186d8c331b63feca60ad21c88e9db1989fe888f97f242322ebd6365e45ec3fb206a4324cd4ca0dfffa1d9b5feb856ba00a7 - languageName: node - linkType: hard - -"d3-timer@npm:1 - 3, d3-timer@npm:^3.0.1": +"d3-timer@npm:1 - 3": version: 3.0.1 resolution: "d3-timer@npm:3.0.1" checksum: 1cfddf86d7bca22f73f2c427f52dfa35c49f50d64e187eb788dcad6e927625c636aa18ae4edd44d084eb9d1f81d8ca4ec305dae7f733c15846a824575b789d73 @@ -25043,7 +21612,7 @@ __metadata: languageName: node linkType: hard -"date-fns@npm:^2.16.1, date-fns@npm:^2.18.0": +"date-fns@npm:^2.16.1": version: 2.30.0 resolution: "date-fns@npm:2.30.0" dependencies: @@ -25052,13 +21621,6 @@ __metadata: languageName: node linkType: hard -"date-fns@npm:^3.0.0": - version: 3.6.0 - resolution: "date-fns@npm:3.6.0" - checksum: 0daa1e9a436cf99f9f2ae9232b55e11f3dd46132bee10987164f3eebd29f245b2e066d7d7db40782627411ecf18551d8f4c9fcdf2226e48bb66545407d448ab7 - languageName: node - linkType: hard - "dateformat@npm:^3.0.3": version: 3.0.3 resolution: "dateformat@npm:3.0.3" @@ -25143,13 +21705,6 @@ __metadata: languageName: node linkType: hard -"decimal.js-light@npm:^2.4.1": - version: 2.5.0 - resolution: "decimal.js-light@npm:2.5.0" - checksum: 89d4d301f72728b10ac5def610b9ccb072cd5fa1bf80c607236bbdd28a9ec9f806faad3159c5a0a82a80a81d84e39ae470f90b6bacecae2617525c8e58f7e201 - languageName: node - linkType: hard - "decimal.js@npm:^10.2.1, decimal.js@npm:^10.3.1": version: 10.4.1 resolution: "decimal.js@npm:10.4.1" @@ -25408,7 +21963,7 @@ __metadata: languageName: node linkType: hard -"dequal@npm:^2.0.0, dequal@npm:^2.0.2, dequal@npm:^2.0.3": +"dequal@npm:^2.0.0, dequal@npm:^2.0.3": version: 2.0.3 resolution: "dequal@npm:2.0.3" checksum: 8679b850e1a3d0ebbc46ee780d5df7b478c23f335887464023a631d1b9af051ad4a6595a44220f9ff8ff95a8ddccf019b5ad778a976fd7bbf77383d36f412f90 @@ -25760,7 +22315,7 @@ __metadata: languageName: node linkType: hard -"domhandler@npm:^5.0.1, domhandler@npm:^5.0.2, domhandler@npm:^5.0.3": +"domhandler@npm:^5.0.1, domhandler@npm:^5.0.2": version: 5.0.3 resolution: "domhandler@npm:5.0.3" dependencies: @@ -26166,13 +22721,6 @@ __metadata: languageName: node linkType: hard -"entities@npm:~2.0": - version: 2.0.3 - resolution: "entities@npm:2.0.3" - checksum: 5a7899fcc622e0d76afdeafe4c58a6b40ae3a8ee4772e5825a648c11a2ca324a9a02515386f512e466baac4aeb551f3d3b79eaece5cd98369b9f8601be336b1a - languageName: node - linkType: hard - "entities@npm:~2.1.0": version: 2.1.0 resolution: "entities@npm:2.1.0" @@ -26187,13 +22735,6 @@ __metadata: languageName: node linkType: hard -"eol@npm:^0.9.1": - version: 0.9.1 - resolution: "eol@npm:0.9.1" - checksum: ba9fa998bc8148b935dcf85585eacf049eeaf18d2ab6196710d4d1f59e7dfd0e87b18508dc67144ff8ba12f835a4a4989aeea64c98b13cca77b74b9d4b33bce5 - languageName: node - linkType: hard - "err-code@npm:^2.0.2": version: 2.0.3 resolution: "err-code@npm:2.0.3" @@ -27143,13 +23684,6 @@ __metadata: languageName: node linkType: hard -"eventemitter2@npm:^6.4.4": - version: 6.4.7 - resolution: "eventemitter2@npm:6.4.7" - checksum: 1b36a77e139d6965ebf3a36c01fa00c089ae6b80faa1911e52888f40b3a7057b36a2cc45dcd1ad87cda3798fe7b97a0aabcbb8175a8b96092a23bb7d0f039e66 - languageName: node - linkType: hard - "eventemitter3@npm:^3.1.0": version: 3.1.2 resolution: "eventemitter3@npm:3.1.2" @@ -27157,7 +23691,7 @@ __metadata: languageName: node linkType: hard -"eventemitter3@npm:^4.0.0, eventemitter3@npm:^4.0.1, eventemitter3@npm:^4.0.4": +"eventemitter3@npm:^4.0.0, eventemitter3@npm:^4.0.4": version: 4.0.7 resolution: "eventemitter3@npm:4.0.7" checksum: 1875311c42fcfe9c707b2712c32664a245629b42bb0a5a84439762dd0fd637fc54d078155ea83c2af9e0323c9ac13687e03cfba79b03af9f40c89b4960099374 @@ -27196,83 +23730,42 @@ __metadata: "@backstage/app-defaults": "workspace:^" "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" + "@backstage/config": "workspace:^" "@backstage/core-app-api": "workspace:^" - "@backstage/core-compat-api": "workspace:^" "@backstage/core-components": "workspace:^" "@backstage/core-plugin-api": "workspace:^" "@backstage/frontend-app-api": "workspace:^" - "@backstage/frontend-plugin-api": "workspace:^" "@backstage/integration-react": "workspace:^" - "@backstage/plugin-adr": "workspace:^" - "@backstage/plugin-airbrake": "workspace:^" - "@backstage/plugin-apache-airflow": "workspace:^" "@backstage/plugin-api-docs": "workspace:^" - "@backstage/plugin-app-visualizer": "workspace:^" - "@backstage/plugin-azure-devops": "workspace:^" - "@backstage/plugin-azure-sites": "workspace:^" - "@backstage/plugin-badges": "workspace:^" + "@backstage/plugin-auth-react": "workspace:^" "@backstage/plugin-catalog": "workspace:^" "@backstage/plugin-catalog-common": "workspace:^" "@backstage/plugin-catalog-graph": "workspace:^" "@backstage/plugin-catalog-import": "workspace:^" "@backstage/plugin-catalog-react": "workspace:^" "@backstage/plugin-catalog-unprocessed-entities": "workspace:^" - "@backstage/plugin-cloudbuild": "workspace:^" - "@backstage/plugin-code-coverage": "workspace:^" - "@backstage/plugin-cost-insights": "workspace:^" - "@backstage/plugin-devtools": "workspace:^" - "@backstage/plugin-dynatrace": "workspace:^" - "@backstage/plugin-entity-feedback": "workspace:^" - "@backstage/plugin-explore": "workspace:^" - "@backstage/plugin-gcalendar": "workspace:^" - "@backstage/plugin-gcp-projects": "workspace:^" - "@backstage/plugin-github-actions": "workspace:^" - "@backstage/plugin-gocd": "workspace:^" - "@backstage/plugin-graphiql": "workspace:^" "@backstage/plugin-home": "workspace:^" - "@backstage/plugin-jenkins": "workspace:^" - "@backstage/plugin-kafka": "workspace:^" "@backstage/plugin-kubernetes": "workspace:^" - "@backstage/plugin-lighthouse": "workspace:^" - "@backstage/plugin-linguist": "workspace:^" - "@backstage/plugin-linguist-common": "workspace:^" - "@backstage/plugin-microsoft-calendar": "workspace:^" - "@backstage/plugin-newrelic": "workspace:^" - "@backstage/plugin-newrelic-dashboard": "workspace:^" - "@backstage/plugin-octopus-deploy": "workspace:^" + "@backstage/plugin-kubernetes-cluster": "workspace:^" + "@backstage/plugin-notifications": "workspace:^" "@backstage/plugin-org": "workspace:^" - "@backstage/plugin-pagerduty": "workspace:^" "@backstage/plugin-permission-react": "workspace:^" - "@backstage/plugin-playlist": "workspace:^" - "@backstage/plugin-puppetdb": "workspace:^" - "@backstage/plugin-rollbar": "workspace:^" "@backstage/plugin-scaffolder": "workspace:^" "@backstage/plugin-scaffolder-react": "workspace:^" "@backstage/plugin-search": "workspace:^" "@backstage/plugin-search-common": "workspace:^" "@backstage/plugin-search-react": "workspace:^" - "@backstage/plugin-sentry": "workspace:^" - "@backstage/plugin-shortcuts": "workspace:^" - "@backstage/plugin-stackstorm": "workspace:^" - "@backstage/plugin-tech-insights": "workspace:^" - "@backstage/plugin-tech-radar": "workspace:^" + "@backstage/plugin-signals": "workspace:^" "@backstage/plugin-techdocs": "workspace:^" "@backstage/plugin-techdocs-module-addons-contrib": "workspace:^" "@backstage/plugin-techdocs-react": "workspace:^" - "@backstage/plugin-todo": "workspace:^" "@backstage/plugin-user-settings": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" - "@circleci/backstage-plugin": ^0.1.1 "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 "@octokit/rest": ^19.0.3 - "@oriflame/backstage-plugin-score-card": ^0.8.0 - "@roadiehq/backstage-plugin-buildkite": ^2.0.8 - "@roadiehq/backstage-plugin-github-insights": ^2.0.5 - "@roadiehq/backstage-plugin-github-pull-requests": ^2.2.7 - "@roadiehq/backstage-plugin-travis-ci": ^2.0.5 "@testing-library/dom": ^10.0.0 "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^15.0.0 @@ -27281,15 +23774,17 @@ __metadata: "@types/react": "*" "@types/react-dom": "*" "@types/zen-observable": ^0.8.0 - app-next-example-plugin: "workspace:^" + "@vitejs/plugin-react": ^4.0.4 cross-env: ^7.0.0 history: ^5.0.0 - lodash: ^4.17.21 react: ^18.0.2 react-dom: ^18.0.2 react-router: ^6.3.0 react-router-dom: ^6.3.0 react-use: ^17.2.4 + vite: ^4.4.9 + vite-plugin-html: ^3.2.0 + vite-plugin-node-polyfills: ^0.21.0 zen-observable: ^0.10.0 languageName: unknown linkType: soft @@ -27313,83 +23808,37 @@ __metadata: "@backstage/core-plugin-api": "workspace:^" "@backstage/frontend-app-api": "workspace:^" "@backstage/integration-react": "workspace:^" - "@backstage/plugin-adr": "workspace:^" - "@backstage/plugin-airbrake": "workspace:^" - "@backstage/plugin-apache-airflow": "workspace:^" "@backstage/plugin-api-docs": "workspace:^" "@backstage/plugin-auth-react": "workspace:^" - "@backstage/plugin-azure-devops": "workspace:^" - "@backstage/plugin-azure-sites": "workspace:^" - "@backstage/plugin-badges": "workspace:^" "@backstage/plugin-catalog": "workspace:^" "@backstage/plugin-catalog-common": "workspace:^" "@backstage/plugin-catalog-graph": "workspace:^" "@backstage/plugin-catalog-import": "workspace:^" "@backstage/plugin-catalog-react": "workspace:^" "@backstage/plugin-catalog-unprocessed-entities": "workspace:^" - "@backstage/plugin-cloudbuild": "workspace:^" - "@backstage/plugin-code-coverage": "workspace:^" - "@backstage/plugin-cost-insights": "workspace:^" - "@backstage/plugin-devtools": "workspace:^" - "@backstage/plugin-dynatrace": "workspace:^" - "@backstage/plugin-entity-feedback": "workspace:^" - "@backstage/plugin-explore": "workspace:^" - "@backstage/plugin-gcalendar": "workspace:^" - "@backstage/plugin-gcp-projects": "workspace:^" - "@backstage/plugin-github-actions": "workspace:^" - "@backstage/plugin-github-pull-requests-board": "workspace:^" - "@backstage/plugin-gocd": "workspace:^" - "@backstage/plugin-graphiql": "workspace:^" "@backstage/plugin-home": "workspace:^" - "@backstage/plugin-jenkins": "workspace:^" - "@backstage/plugin-kafka": "workspace:^" "@backstage/plugin-kubernetes": "workspace:^" "@backstage/plugin-kubernetes-cluster": "workspace:^" - "@backstage/plugin-lighthouse": "workspace:^" - "@backstage/plugin-linguist": "workspace:^" - "@backstage/plugin-linguist-common": "workspace:^" - "@backstage/plugin-microsoft-calendar": "workspace:^" - "@backstage/plugin-newrelic": "workspace:^" - "@backstage/plugin-newrelic-dashboard": "workspace:^" - "@backstage/plugin-nomad": "workspace:^" "@backstage/plugin-notifications": "workspace:^" - "@backstage/plugin-octopus-deploy": "workspace:^" "@backstage/plugin-org": "workspace:^" - "@backstage/plugin-pagerduty": "workspace:^" "@backstage/plugin-permission-react": "workspace:^" - "@backstage/plugin-playlist": "workspace:^" - "@backstage/plugin-puppetdb": "workspace:^" - "@backstage/plugin-rollbar": "workspace:^" "@backstage/plugin-scaffolder": "workspace:^" "@backstage/plugin-scaffolder-react": "workspace:^" "@backstage/plugin-search": "workspace:^" "@backstage/plugin-search-common": "workspace:^" "@backstage/plugin-search-react": "workspace:^" - "@backstage/plugin-sentry": "workspace:^" - "@backstage/plugin-shortcuts": "workspace:^" "@backstage/plugin-signals": "workspace:^" - "@backstage/plugin-stack-overflow": "workspace:^" - "@backstage/plugin-stackstorm": "workspace:^" - "@backstage/plugin-tech-insights": "workspace:^" - "@backstage/plugin-tech-radar": "workspace:^" "@backstage/plugin-techdocs": "workspace:^" "@backstage/plugin-techdocs-module-addons-contrib": "workspace:^" "@backstage/plugin-techdocs-react": "workspace:^" - "@backstage/plugin-todo": "workspace:^" "@backstage/plugin-user-settings": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" - "@circleci/backstage-plugin": ^0.1.1 "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 "@octokit/rest": ^19.0.3 - "@oriflame/backstage-plugin-score-card": ^0.8.0 "@playwright/test": ^1.32.3 - "@roadiehq/backstage-plugin-buildkite": ^2.0.8 - "@roadiehq/backstage-plugin-github-insights": ^2.0.5 - "@roadiehq/backstage-plugin-github-pull-requests": ^2.2.7 - "@roadiehq/backstage-plugin-travis-ci": ^2.0.5 "@testing-library/dom": ^10.0.0 "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^15.0.0 @@ -27422,32 +23871,23 @@ __metadata: "@backstage/backend-tasks": "workspace:^" "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" - "@backstage/plugin-adr-backend": "workspace:^" "@backstage/plugin-app-backend": "workspace:^" "@backstage/plugin-auth-backend": "workspace:^" "@backstage/plugin-auth-backend-module-github-provider": "workspace:^" "@backstage/plugin-auth-backend-module-guest-provider": "workspace:^" "@backstage/plugin-auth-node": "workspace:^" - "@backstage/plugin-azure-devops-backend": "workspace:^" - "@backstage/plugin-badges-backend": "workspace:^" "@backstage/plugin-catalog-backend": "workspace:^" "@backstage/plugin-catalog-backend-module-backstage-openapi": "workspace:^" "@backstage/plugin-catalog-backend-module-openapi": "workspace:^" "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "workspace:^" "@backstage/plugin-catalog-backend-module-unprocessed": "workspace:^" "@backstage/plugin-devtools-backend": "workspace:^" - "@backstage/plugin-entity-feedback-backend": "workspace:^" - "@backstage/plugin-jenkins-backend": "workspace:^" "@backstage/plugin-kubernetes-backend": "workspace:^" - "@backstage/plugin-lighthouse-backend": "workspace:^" - "@backstage/plugin-linguist-backend": "workspace:^" - "@backstage/plugin-nomad-backend": "workspace:^" "@backstage/plugin-notifications-backend": "workspace:^" "@backstage/plugin-permission-backend": "workspace:^" "@backstage/plugin-permission-backend-module-allow-all-policy": "workspace:^" "@backstage/plugin-permission-common": "workspace:^" "@backstage/plugin-permission-node": "workspace:^" - "@backstage/plugin-playlist-backend": "workspace:^" "@backstage/plugin-proxy-backend": "workspace:^" "@backstage/plugin-scaffolder-backend": "workspace:^" "@backstage/plugin-scaffolder-backend-module-github": "workspace:^" @@ -27457,9 +23897,7 @@ __metadata: "@backstage/plugin-search-backend-module-techdocs": "workspace:^" "@backstage/plugin-search-backend-node": "workspace:^" "@backstage/plugin-signals-backend": "workspace:^" - "@backstage/plugin-sonarqube-backend": "workspace:^" "@backstage/plugin-techdocs-backend": "workspace:^" - "@backstage/plugin-todo-backend": "workspace:^" languageName: unknown linkType: soft @@ -27474,35 +23912,21 @@ __metadata: "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" "@backstage/integration": "workspace:^" - "@backstage/plugin-adr-backend": "workspace:^" "@backstage/plugin-app-backend": "workspace:^" "@backstage/plugin-auth-backend": "workspace:^" "@backstage/plugin-auth-node": "workspace:^" - "@backstage/plugin-azure-devops-backend": "workspace:^" - "@backstage/plugin-azure-sites-common": "workspace:^" - "@backstage/plugin-badges-backend": "workspace:^" "@backstage/plugin-catalog-backend": "workspace:^" "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "workspace:^" "@backstage/plugin-catalog-backend-module-unprocessed": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" - "@backstage/plugin-code-coverage-backend": "workspace:^" "@backstage/plugin-devtools-backend": "workspace:^" - "@backstage/plugin-entity-feedback-backend": "workspace:^" "@backstage/plugin-events-backend": "workspace:^" "@backstage/plugin-events-node": "workspace:^" - "@backstage/plugin-explore-backend": "workspace:^" - "@backstage/plugin-jenkins-backend": "workspace:^" - "@backstage/plugin-kafka-backend": "workspace:^" "@backstage/plugin-kubernetes-backend": "workspace:^" - "@backstage/plugin-lighthouse-backend": "workspace:^" - "@backstage/plugin-linguist-backend": "workspace:^" - "@backstage/plugin-nomad-backend": "workspace:^" "@backstage/plugin-permission-backend": "workspace:^" "@backstage/plugin-permission-common": "workspace:^" "@backstage/plugin-permission-node": "workspace:^" - "@backstage/plugin-playlist-backend": "workspace:^" "@backstage/plugin-proxy-backend": "workspace:^" - "@backstage/plugin-rollbar-backend": "workspace:^" "@backstage/plugin-scaffolder-backend": "workspace:^" "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown": "workspace:^" "@backstage/plugin-scaffolder-backend-module-gitlab": "workspace:^" @@ -27516,11 +23940,7 @@ __metadata: "@backstage/plugin-search-backend-node": "workspace:^" "@backstage/plugin-signals-backend": "workspace:^" "@backstage/plugin-signals-node": "workspace:^" - "@backstage/plugin-tech-insights-backend": "workspace:^" - "@backstage/plugin-tech-insights-backend-module-jsonfc": "workspace:^" - "@backstage/plugin-tech-insights-node": "workspace:^" "@backstage/plugin-techdocs-backend": "workspace:^" - "@backstage/plugin-todo-backend": "workspace:^" "@gitbeaker/node": ^35.1.0 "@octokit/rest": ^19.0.3 "@opentelemetry/api": ^1.4.1 @@ -27852,13 +24272,6 @@ __metadata: languageName: node linkType: hard -"fast-equals@npm:^5.0.1": - version: 5.0.1 - resolution: "fast-equals@npm:5.0.1" - checksum: fbb3b6a74f3a0fa930afac151ff7d01639159b4fddd2678b5d50708e0ba38e9ec14602222d10dadb8398187342692c04fbef5a62b1cfcc7942fe03e754e064bc - languageName: node - linkType: hard - "fast-fifo@npm:^1.1.0, fast-fifo@npm:^1.2.0": version: 1.3.2 resolution: "fast-fifo@npm:1.3.2" @@ -28082,20 +24495,6 @@ __metadata: languageName: node linkType: hard -"fflate@npm:^0.4.4": - version: 0.4.8 - resolution: "fflate@npm:0.4.8" - checksum: 29d8cbe44d5e7f53e7f5a160ac7f9cc025480c7b3bfd85c5f898cbe20dfa2dad4732daa534982664bf30b35896a90af44ea33ede5d94c5ffd1b8b0c0a0a56ca2 - languageName: node - linkType: hard - -"fflate@npm:^0.7.4": - version: 0.7.4 - resolution: "fflate@npm:0.7.4" - checksum: b812ab26047432db70ff4c73eb45ad53bd0774575b4818b9c61c2921e89ec65d1259f06ec1618f2ac55e6a2f2e29b6dc09173d213b46580bc69efae5344bf8f1 - languageName: node - linkType: hard - "figures@npm:^3.0.0, figures@npm:^3.2.0": version: 3.2.0 resolution: "figures@npm:3.2.0" @@ -28358,7 +24757,7 @@ __metadata: languageName: node linkType: hard -"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.14.0, follow-redirects@npm:^1.14.9, follow-redirects@npm:^1.15.4, follow-redirects@npm:^1.15.6": +"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.14.9, follow-redirects@npm:^1.15.4, follow-redirects@npm:^1.15.6": version: 1.15.6 resolution: "follow-redirects@npm:1.15.6" peerDependenciesMeta: @@ -28579,15 +24978,6 @@ __metadata: languageName: node linkType: hard -"front-matter@npm:^4.0.2": - version: 4.0.2 - resolution: "front-matter@npm:4.0.2" - dependencies: - js-yaml: ^3.13.1 - checksum: a5b4c36d75a820301ebf31db0f677332d189c4561903ab6853eaa0504b43634f98557dbf87752e09043dbd2c9dcc14b4bcf9151cb319c8ad7e26edb203c0cd23 - languageName: node - linkType: hard - "fs-constants@npm:^1.0.0": version: 1.0.0 resolution: "fs-constants@npm:1.0.0" @@ -28893,13 +25283,6 @@ __metadata: languageName: node linkType: hard -"get-stdin@npm:^8.0.0": - version: 8.0.0 - resolution: "get-stdin@npm:8.0.0" - checksum: 40128b6cd25781ddbd233344f1a1e4006d4284906191ed0a7d55ec2c1a3e44d650f280b2c9eeab79c03ac3037da80257476c0e4e5af38ddfb902d6ff06282d77 - languageName: node - linkType: hard - "get-stdin@npm:^9.0.0": version: 9.0.0 resolution: "get-stdin@npm:9.0.0" @@ -29315,22 +25698,6 @@ __metadata: languageName: node linkType: hard -"graphiql@npm:^3.0.6": - version: 3.2.0 - resolution: "graphiql@npm:3.2.0" - dependencies: - "@graphiql/react": ^0.21.0 - "@graphiql/toolkit": ^0.9.1 - graphql-language-service: ^5.2.0 - markdown-it: ^14.1.0 - peerDependencies: - graphql: ^15.5.0 || ^16.0.0 - react: ^16.8.0 || ^17 || ^18 - react-dom: ^16.8.0 || ^17 || ^18 - checksum: 7e49324b97c21312cb7e646d90ef6cc69824c0caf9bc957d5dd42b88d8992472c82301664454cfa3327b3bdf331b524bfa1c6ee5cc02f0917e6a5daa79114dff - languageName: node - linkType: hard - "graphlib@npm:^2.1.8": version: 2.1.8 resolution: "graphlib@npm:2.1.8" @@ -29410,27 +25777,7 @@ __metadata: languageName: node linkType: hard -"graphql-voyager@npm:^1.0.0-rc.31": - version: 1.3.0 - resolution: "graphql-voyager@npm:1.3.0" - dependencies: - "@emotion/react": 11.10.5 - "@emotion/styled": 11.10.5 - "@mui/icons-material": 5.11.0 - "@mui/lab": 5.0.0-alpha.114 - "@mui/material": 5.11.2 - commonmark: 0.30.0 - lodash: 4.17.21 - svg-pan-zoom: 3.6.1 - peerDependencies: - graphql: ">=16.5.0" - react: ">=18.0.0" - react-dom: ">=18.0.0" - checksum: 664d8adb932e3d72189e24dfb09fe364cc0e2852ab615eddeac250d9b4a0e6130a5ea363aec87c516b3c134c070c4c15999ccedec89f57afd554e600c6d4ca34 - languageName: node - linkType: hard - -"graphql-ws@npm:^5.14.0, graphql-ws@npm:^5.4.1, graphql-ws@npm:^5.9.0": +"graphql-ws@npm:^5.14.0, graphql-ws@npm:^5.4.1": version: 5.16.0 resolution: "graphql-ws@npm:5.16.0" peerDependencies: @@ -29643,13 +25990,6 @@ __metadata: languageName: node linkType: hard -"hash-it@npm:^6.0.0": - version: 6.0.0 - resolution: "hash-it@npm:6.0.0" - checksum: 10ca948ff7902a752344c3975c1a5c76ba9e4aa0363032f347a7235cce98473dce60fe4399b05979596aedf649adaf5b3f792a55b9b64ad59ae686e43300c2d1 - languageName: node - linkType: hard - "hash.js@npm:^1.0.0, hash.js@npm:^1.0.3": version: 1.1.7 resolution: "hash.js@npm:1.1.7" @@ -29740,7 +26080,7 @@ __metadata: languageName: node linkType: hard -"highlight.js@npm:^10.1.0, highlight.js@npm:^10.4.1, highlight.js@npm:^10.6.0, highlight.js@npm:^10.7.2, highlight.js@npm:~10.7.0": +"highlight.js@npm:^10.4.1, highlight.js@npm:^10.7.2, highlight.js@npm:~10.7.0": version: 10.7.3 resolution: "highlight.js@npm:10.7.3" checksum: defeafcd546b535d710d8efb8e650af9e3b369ef53e28c3dc7893eacfe263200bba4c5fcf43524ae66d5c0c296b1af0870523ceae3e3104d24b7abf6374a4fea @@ -29916,18 +26256,6 @@ __metadata: languageName: node linkType: hard -"htmlparser2@npm:^8.0.0": - version: 8.0.2 - resolution: "htmlparser2@npm:8.0.2" - dependencies: - domelementtype: ^2.3.0 - domhandler: ^5.0.3 - domutils: ^3.0.1 - entities: ^4.4.0 - checksum: 29167a0f9282f181da8a6d0311b76820c8a59bc9e3c87009e21968264c2987d2723d6fde5a964d4b7b6cba663fca96ffb373c06d8223a85f52a6089ced942700 - languageName: node - linkType: hard - "http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.0, http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" @@ -30146,7 +26474,7 @@ __metadata: languageName: node linkType: hard -"humanize-duration@npm:^3.25.1, humanize-duration@npm:^3.26.0, humanize-duration@npm:^3.27.0, humanize-duration@npm:^3.27.1": +"humanize-duration@npm:^3.25.1": version: 3.32.0 resolution: "humanize-duration@npm:3.32.0" checksum: fd12af03045278c24542d2222d46831f74d21a2132bba053d4847ff8c8f6799840db6ff8a14ce24cc920f69633970fbde4f83d7cbcfed26806ed21804e72a03a @@ -30283,13 +26611,6 @@ __metadata: languageName: node linkType: hard -"immer@npm:9.0.7": - version: 9.0.7 - resolution: "immer@npm:9.0.7" - checksum: 3655ad64bf5ab5adf2854f7d2a9ad543f2cd995fcd169b6f10294f41fdb2cbcbd44d8beaa3e01b3c0b6149001190e57f6ab2cd735e6a929780b7462f2e973c9b - languageName: node - linkType: hard - "immer@npm:^9.0.6, immer@npm:^9.0.7": version: 9.0.21 resolution: "immer@npm:9.0.21" @@ -30489,13 +26810,6 @@ __metadata: languageName: node linkType: hard -"internmap@npm:1 - 2": - version: 2.0.3 - resolution: "internmap@npm:2.0.3" - checksum: 7ca41ec6aba8f0072fc32fa8a023450a9f44503e2d8e403583c55714b25efd6390c38a87161ec456bf42d7bc83aab62eb28f5aef34876b1ac4e60693d5e1d241 - languageName: node - linkType: hard - "interpret@npm:^1.0.0": version: 1.4.0 resolution: "interpret@npm:1.4.0" @@ -31345,7 +27659,7 @@ __metadata: languageName: node linkType: hard -"isbinaryfile@npm:^4.0.10, isbinaryfile@npm:^4.0.10 <5, isbinaryfile@npm:^4.0.8": +"isbinaryfile@npm:^4.0.10, isbinaryfile@npm:^4.0.8": version: 4.0.10 resolution: "isbinaryfile@npm:4.0.10" checksum: a6b28db7e23ac7a77d3707567cac81356ea18bd602a4f21f424f862a31d0e7ab4f250759c98a559ece35ffe4d99f0d339f1ab884ffa9795172f632ab8f88e686 @@ -31589,15 +27903,6 @@ __metadata: languageName: node linkType: hard -"jenkins@npm:^1.0.0": - version: 1.1.0 - resolution: "jenkins@npm:1.1.0" - dependencies: - papi: ^1.1.0 - checksum: 3aada79e2e081926f2d335320e3993a39605124a22c0429c2acd6d4dd3bd5ccded9c6e03fb84f120ebb0755f9e70d931a7ffb36aaa18bc73d7ca3b7f2a5391e6 - languageName: node - linkType: hard - "jest-changed-files@npm:^29.7.0": version: 29.7.0 resolution: "jest-changed-files@npm:29.7.0" @@ -32448,19 +28753,6 @@ __metadata: languageName: node linkType: hard -"json-rules-engine@npm:^6.1.2": - version: 6.5.0 - resolution: "json-rules-engine@npm:6.5.0" - dependencies: - clone: ^2.1.2 - eventemitter2: ^6.4.4 - hash-it: ^6.0.0 - jsonpath-plus: ^7.2.0 - lodash.isobjectlike: ^4.0.0 - checksum: c1a6fa2bb65743397c838c4e4a9157f184e0c24423031fa4bab6b83b5edbb64341f9197ccad9fdd44fcd6c58ac329c0c77882a64acf0d90ee1d856768a4154e3 - languageName: node - linkType: hard - "json-schema-compare@npm:^0.2.2": version: 0.2.2 resolution: "json-schema-compare@npm:0.2.2" @@ -32564,13 +28856,6 @@ __metadata: languageName: node linkType: hard -"json2xml@npm:^0.1.3": - version: 0.1.3 - resolution: "json2xml@npm:0.1.3" - checksum: 88954de67d88c5c1ea7ea99267da712aa5b78886df6db98ebbb63e3caa8310eb7c1c94fe72ba3a575f06813fd344725ddcb9cf1547e1223d1c141d3e24ad3cf9 - languageName: node - linkType: hard - "json5@npm:^1.0.1, json5@npm:^1.0.2": version: 1.0.2 resolution: "json5@npm:1.0.2" @@ -32887,13 +29172,6 @@ __metadata: languageName: node linkType: hard -"kafkajs@npm:^2.0.0": - version: 2.2.4 - resolution: "kafkajs@npm:2.2.4" - checksum: 83e9e8bc50a09b142f4ff79f6a2bd88ecc21b83bcefe6621ab1716118d624886befb7371731274f67812ce35dd50b53140ff3b49a06e5d9169fe6b164d72fea5 - languageName: node - linkType: hard - "keyv@npm:^3.0.0": version: 3.1.0 resolution: "keyv@npm:3.1.0" @@ -33036,13 +29314,6 @@ __metadata: languageName: node linkType: hard -"ky@npm:0.28.7": - version: 0.28.7 - resolution: "ky@npm:0.28.7" - checksum: ff38c9c5a5b9c0354b9db167662cdb1fc48c91803a580807a1d18a1fccc024953cba3708e7bcbd9c7a27670c68631d4806e2c5a169ebc586e573a7c5802a6086 - languageName: node - linkType: hard - "language-subtag-registry@npm:^0.3.20": version: 0.3.22 resolution: "language-subtag-registry@npm:0.3.22" @@ -33112,28 +29383,6 @@ __metadata: languageName: node linkType: hard -"leasot@npm:^12.0.0": - version: 12.5.0 - resolution: "leasot@npm:12.5.0" - dependencies: - async: ^3.2.0 - chalk: ^4.1.0 - commander: ^7.2.0 - eol: ^0.9.1 - get-stdin: ^8.0.0 - globby: ^11.0.3 - json2xml: ^0.1.3 - lodash: ^4.17.21 - log-symbols: ^4.1.0 - strip-ansi: ^6.0.0 - text-table: ^0.2.0 - bin: - leasot: bin/leasot - leasot-reporter: bin/leasot-reporter - checksum: 1f27381bafc226f4242ec4bd907229d68a45be79463f26a8b7b41179212841668f49b1ee8b675b48f9452f6222c91fafe6e4eccb01b5004ec1a806d75d372b7c - languageName: node - linkType: hard - "leven@npm:2.1.0": version: 2.1.0 resolution: "leven@npm:2.1.0" @@ -33221,25 +29470,6 @@ __metadata: languageName: node linkType: hard -"linguist-js@npm:^2.5.3": - version: 2.6.1 - resolution: "linguist-js@npm:2.6.1" - dependencies: - binary-extensions: ^2.2.0 - commander: ^9.5.0 <10 - common-path-prefix: ^3.0.0 - cross-fetch: ^3.1.8 <4 - ignore: ^5.2.4 - isbinaryfile: ^4.0.10 <5 - js-yaml: ^4.1.0 - node-cache: ^5.1.2 - bin: - linguist: bin/index.js - linguist-js: bin/index.js - checksum: 5eea5a0562e4a8958703833eef0377235fd34da1f12b7b8b8208934b877c9f36b7c140b25c66ab563ff229203cd8c224e84d840edbc4ee285ad051b8b8fdb5ae - languageName: node - linkType: hard - "linkify-it@npm:^3.0.1": version: 3.0.2 resolution: "linkify-it@npm:3.0.2" @@ -33249,15 +29479,6 @@ __metadata: languageName: node linkType: hard -"linkify-it@npm:^5.0.0": - version: 5.0.0 - resolution: "linkify-it@npm:5.0.0" - dependencies: - uc.micro: ^2.0.0 - checksum: b0b86cadaf816b64c947a83994ceaad1c15f9fe7e079776ab88699fb71afd7b8fc3fd3d0ae5ebec8c92c1d347be9ba257b8aef338c0ebf81b0d27dcf429a765a - languageName: node - linkType: hard - "linkify-react@npm:4.1.3": version: 4.1.3 resolution: "linkify-react@npm:4.1.3" @@ -33551,13 +29772,6 @@ __metadata: languageName: node linkType: hard -"lodash.isobjectlike@npm:^4.0.0": - version: 4.0.0 - resolution: "lodash.isobjectlike@npm:4.0.0" - checksum: eabcd968b1bd11208a90b27f9b167bd5ce30165a5b20d7886b94df95acfbc929dbe00cf16f2ce7a7779bdaf3f0ef4ee705e671782599ab73097307d2b8b488c5 - languageName: node - linkType: hard - "lodash.isplainobject@npm:^4.0.6": version: 4.0.6 resolution: "lodash.isplainobject@npm:4.0.6" @@ -33856,7 +30070,7 @@ __metadata: languageName: node linkType: hard -"luxon@npm:^3.0.0, luxon@npm:^3.3.0, luxon@npm:^3.4.3, luxon@npm:^3.4.4, luxon@npm:~3.4.0": +"luxon@npm:^3.0.0, luxon@npm:^3.4.3, luxon@npm:~3.4.0": version: 3.4.4 resolution: "luxon@npm:3.4.4" checksum: 36c1f99c4796ee4bfddf7dc94fa87815add43ebc44c8934c924946260a58512f0fd2743a629302885df7f35ccbd2d13f178c15df046d0e3b6eb71db178f1c60c @@ -34055,22 +30269,6 @@ __metadata: languageName: node linkType: hard -"markdown-it@npm:^14.1.0": - version: 14.1.0 - resolution: "markdown-it@npm:14.1.0" - dependencies: - argparse: ^2.0.1 - entities: ^4.4.0 - linkify-it: ^5.0.0 - mdurl: ^2.0.0 - punycode.js: ^2.3.1 - uc.micro: ^2.1.0 - bin: - markdown-it: bin/markdown-it.mjs - checksum: 07296b45ebd0b13a55611a24d1b1ad002c6729ec54f558f597846994b0b7b1de79d13cd99ff3e7b6e9e027f36b63125cdcf69174da294ecabdd4e6b9fff39e5d - languageName: node - linkType: hard - "markdown-table@npm:^3.0.0": version: 3.0.1 resolution: "markdown-table@npm:3.0.1" @@ -34087,15 +30285,6 @@ __metadata: languageName: node linkType: hard -"marked@npm:^12.0.0": - version: 12.0.1 - resolution: "marked@npm:12.0.1" - bin: - marked: bin/marked.js - checksum: 35ebc6c4612fcc028a1cd6419321e336be5b29d3feb68dfd5aaa7fcddb399c7873cd3291d60daf342db3eede747757e4e18515f349f0ee7b84ec24254f3a4190 - languageName: node - linkType: hard - "marked@npm:^4.0.14": version: 4.3.0 resolution: "marked@npm:4.3.0" @@ -34129,20 +30318,6 @@ __metadata: languageName: node linkType: hard -"material-ui-search-bar@npm:^1.0.0": - version: 1.0.1 - resolution: "material-ui-search-bar@npm:1.0.1" - dependencies: - classnames: ^2.2.5 - prop-types: ^15.5.8 - peerDependencies: - "@material-ui/core": ^4.0.0 - "@material-ui/icons": ^4.0.0 - react: ">=16.8.0" - checksum: f2bbc90471bdf3734d704b164857eb2b5c7f30dbe5ee362b448d8362fbfe152f1d1d5280fe4bf44624dc6135782ef58f63cf488ecb82f3392e0090757a767175 - languageName: node - linkType: hard - "md5.js@npm:^1.3.4": version: 1.3.5 resolution: "md5.js@npm:1.3.5" @@ -34320,20 +30495,13 @@ __metadata: languageName: node linkType: hard -"mdurl@npm:^1.0.0, mdurl@npm:^1.0.1, mdurl@npm:~1.0.1": +"mdurl@npm:^1.0.0, mdurl@npm:^1.0.1": version: 1.0.1 resolution: "mdurl@npm:1.0.1" checksum: 71731ecba943926bfbf9f9b51e28b5945f9411c4eda80894221b47cc105afa43ba2da820732b436f0798fd3edbbffcd1fc1415843c41a87fea08a41cc1e3d02b languageName: node linkType: hard -"mdurl@npm:^2.0.0": - version: 2.0.0 - resolution: "mdurl@npm:2.0.0" - checksum: 880bc289ef668df0bb34c5b2b5aaa7b6ea755052108cdaf4a5e5968ad01cf27e74927334acc9ebcc50a8628b65272ae6b1fd51fae1330c130e261c0466e1a3b2 - languageName: node - linkType: hard - "media-typer@npm:0.3.0": version: 0.3.0 resolution: "media-typer@npm:0.3.0" @@ -35084,7 +31252,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:1.2.8, minimist@npm:>=1.2.2, minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6": +"minimist@npm:1.2.8, minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 @@ -35233,7 +31401,7 @@ __metadata: languageName: node linkType: hard -"mitt@npm:3.0.1, mitt@npm:^3.0.0": +"mitt@npm:3.0.1": version: 3.0.1 resolution: "mitt@npm:3.0.1" checksum: b55a489ac9c2949ab166b7f060601d3b6d893a852515ae9eca4e11df01c013876df777ea109317622b5c1c60e8aae252558e33c8c94e14124db38f64a39614b1 @@ -35350,13 +31518,6 @@ __metadata: languageName: node linkType: hard -"moment@npm:^2.29.1": - version: 2.29.4 - resolution: "moment@npm:2.29.4" - checksum: 0ec3f9c2bcba38dc2451b1daed5daded747f17610b92427bebe1d08d48d8b7bdd8d9197500b072d14e326dd0ccf3e326b9e3d07c5895d3d49e39b6803b76e80e - languageName: node - linkType: hard - "moo@npm:^0.5.0": version: 0.5.2 resolution: "moo@npm:0.5.2" @@ -35412,7 +31573,7 @@ __metadata: languageName: node linkType: hard -"msw@npm:^1.0.0, msw@npm:^1.0.1, msw@npm:^1.2.1, msw@npm:^1.2.3, msw@npm:^1.3.0, msw@npm:^1.3.1": +"msw@npm:^1.0.0, msw@npm:^1.2.1, msw@npm:^1.3.0, msw@npm:^1.3.1": version: 1.3.3 resolution: "msw@npm:1.3.3" dependencies: @@ -35810,7 +31971,7 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.5, node-fetch@npm:^2.6.7, node-fetch@npm:^2.6.9, node-fetch@npm:^2.7.0": +"node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.7, node-fetch@npm:^2.6.9, node-fetch@npm:^2.7.0": version: 2.7.0 resolution: "node-fetch@npm:2.7.0" dependencies: @@ -37030,13 +33191,6 @@ __metadata: languageName: node linkType: hard -"papi@npm:^1.1.0": - version: 1.1.0 - resolution: "papi@npm:1.1.0" - checksum: f7c566fa10c27ff1820e76bf83035dab7db4f62a84e4ed1bdd1117bd6a1d796a2b4340fa8df34d19997e33be9306de0147065eeaafc1622964aa94b3073d50c4 - languageName: node - linkType: hard - "param-case@npm:^3.0.4": version: 3.0.4 resolution: "param-case@npm:3.0.4" @@ -37120,15 +33274,6 @@ __metadata: languageName: node linkType: hard -"parse-link-header@npm:^2.0.0": - version: 2.0.0 - resolution: "parse-link-header@npm:2.0.0" - dependencies: - xtend: ~4.0.1 - checksum: 0e96c6af9910e8f92084b49b8dc6a10dd58db470847d1499f562576180c1ac5e49d18007697f0d538e5f3efdc8ce1d8777641f3ae225302b74af0dd0578b628e - languageName: node - linkType: hard - "parse-ms@npm:^4.0.0": version: 4.0.0 resolution: "parse-ms@npm:4.0.0" @@ -38688,7 +34833,7 @@ __metadata: languageName: node linkType: hard -"prop-types@npm:15.x, prop-types@npm:^15.0.0, prop-types@npm:^15.5.10, prop-types@npm:^15.5.7, prop-types@npm:^15.5.8, prop-types@npm:^15.6.2, prop-types@npm:^15.7.2, prop-types@npm:^15.8.1": +"prop-types@npm:15.x, prop-types@npm:^15.0.0, prop-types@npm:^15.5.10, prop-types@npm:^15.5.7, prop-types@npm:^15.6.2, prop-types@npm:^15.7.2, prop-types@npm:^15.8.1": version: 15.8.1 resolution: "prop-types@npm:15.8.1" dependencies: @@ -38876,13 +35021,6 @@ __metadata: languageName: node linkType: hard -"punycode.js@npm:^2.3.1": - version: 2.3.1 - resolution: "punycode.js@npm:2.3.1" - checksum: 13466d7ed5e8dacdab8c4cc03837e7dd14218a59a40eb14a837f1f53ca396e18ef2c4ee6d7766b8ed2fc391d6a3ac489eebf2de83b3596f5a54e86df4a251b72 - languageName: node - linkType: hard - "punycode@npm:1.3.2": version: 1.3.2 resolution: "punycode@npm:1.3.2" @@ -38963,7 +35101,7 @@ __metadata: languageName: node linkType: hard -"qs@npm:^6.10.1, qs@npm:^6.10.2, qs@npm:^6.11.0, qs@npm:^6.11.2, qs@npm:^6.9.1, qs@npm:^6.9.4, qs@npm:^6.9.6": +"qs@npm:^6.10.1, qs@npm:^6.10.2, qs@npm:^6.11.0, qs@npm:^6.11.2, qs@npm:^6.9.1, qs@npm:^6.9.4": version: 6.12.1 resolution: "qs@npm:6.12.1" dependencies: @@ -39364,23 +35502,6 @@ __metadata: languageName: node linkType: hard -"react-ga4@npm:^2.0.0": - version: 2.1.0 - resolution: "react-ga4@npm:2.1.0" - checksum: f7fb41141418d4ad14756f1126a1e9958db37d4d84ae6cd798043dc03a390b6dba74d69311af0349f0b9580a43bda8930138194ccc29c4100efe446e2d6eb057 - languageName: node - linkType: hard - -"react-ga@npm:^3.3.0": - version: 3.3.1 - resolution: "react-ga@npm:3.3.1" - peerDependencies: - prop-types: ^15.6.0 - react: ^15.6.2 || ^16.0 || ^17 || ^18 - checksum: 3026976d0249fbf80e7b5dad7707964198064d7ac460f3397de40524e76dd6c29dead0900f850e2bd3135a86a9b083af8cda9cfa087f195852bf8d2b17c1fcfb - languageName: node - linkType: hard - "react-grid-layout@npm:1.3.4": version: 1.3.4 resolution: "react-grid-layout@npm:1.3.4" @@ -39411,7 +35532,7 @@ __metadata: languageName: node linkType: hard -"react-hook-form@npm:^7.12.2, react-hook-form@npm:^7.13.0": +"react-hook-form@npm:^7.12.2": version: 7.51.3 resolution: "react-hook-form@npm:7.51.3" peerDependencies: @@ -39471,7 +35592,7 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^16.10.2, react-is@npm:^16.12.0, react-is@npm:^16.13.1, react-is@npm:^16.7.0, react-is@npm:^16.8.0, react-is@npm:^16.8.6": +"react-is@npm:^16.12.0, react-is@npm:^16.13.1, react-is@npm:^16.7.0, react-is@npm:^16.8.0, react-is@npm:^16.8.6": version: 16.13.1 resolution: "react-is@npm:16.13.1" checksum: f7a19ac3496de32ca9ae12aa030f00f14a3d45374f1ceca0af707c831b2a6098ef0d6bdae51bd437b0a306d7f01d4677fcc8de7c0d331eb47ad0f46130e53c5f @@ -39729,20 +35850,6 @@ __metadata: languageName: node linkType: hard -"react-smooth@npm:^4.0.0": - version: 4.0.0 - resolution: "react-smooth@npm:4.0.0" - dependencies: - fast-equals: ^5.0.1 - prop-types: ^15.8.1 - react-transition-group: ^4.4.5 - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 0b4859593d4e24c500aab3a6660b23ca458a3cb7f3e74a00864fbdceafbdef93c8962d606bd97fff13f6075f4f5429b3826276b261e54577f7326511e3cb812b - languageName: node - linkType: hard - "react-sparklines@npm:^1.7.0": version: 1.7.0 resolution: "react-sparklines@npm:1.7.0" @@ -39851,7 +35958,7 @@ __metadata: languageName: node linkType: hard -"react-use@npm:^17.2.4, react-use@npm:^17.3.1, react-use@npm:^17.3.2, react-use@npm:^17.4.0, react-use@npm:^17.5.0": +"react-use@npm:^17.2.4, react-use@npm:^17.3.2, react-use@npm:^17.4.0": version: 17.5.0 resolution: "react-use@npm:17.5.0" dependencies: @@ -40082,34 +36189,6 @@ __metadata: languageName: node linkType: hard -"recharts-scale@npm:^0.4.4": - version: 0.4.5 - resolution: "recharts-scale@npm:0.4.5" - dependencies: - decimal.js-light: ^2.4.1 - checksum: e970377190a610e684a32c7461c7684ac3603c2e0ac0020bbba1eea9d099b38138143a8e80bf769bb49c0b7cecf22a2f5c6854885efed2d56f4540d4aa7052bd - languageName: node - linkType: hard - -"recharts@npm:^2.5.0": - version: 2.12.5 - resolution: "recharts@npm:2.12.5" - dependencies: - clsx: ^2.0.0 - eventemitter3: ^4.0.1 - lodash: ^4.17.21 - react-is: ^16.10.2 - react-smooth: ^4.0.0 - recharts-scale: ^0.4.4 - tiny-invariant: ^1.3.1 - victory-vendor: ^36.6.8 - peerDependencies: - react: ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 - checksum: b6fda724ed514e6901c8d620cf984483ec7809d7aa018ce50f5ec316673c26c5bdea1e2fa6f54a9f9a78947c50c8e7771dbc53bc4936d83d4da81c43ff9a5a38 - languageName: node - linkType: hard - "rechoir@npm:^0.6.2": version: 0.6.2 resolution: "rechoir@npm:0.6.2" @@ -40321,13 +36400,6 @@ __metadata: languageName: node linkType: hard -"regression@npm:^2.0.1": - version: 2.0.1 - resolution: "regression@npm:2.0.1" - checksum: 2afb76ed65c87f22ef25dffb19fa95d70cded586ee9fcd5239f61d40993f5904bab0aae8fece73a8dddd35e19956a027004e727385ee4b4e7f800229a50edfb5 - languageName: node - linkType: hard - "relateurl@npm:^0.2.7": version: 0.2.7 resolution: "relateurl@npm:0.2.7" @@ -41039,38 +37111,6 @@ __metadata: languageName: unknown linkType: soft -"rrdom@npm:^2.0.0-alpha.11": - version: 2.0.0-alpha.11 - resolution: "rrdom@npm:2.0.0-alpha.11" - dependencies: - rrweb-snapshot: ^2.0.0-alpha.11 - checksum: cfc8f18698902224bd4b666586497b2682d3d11e30946c2b9fe374b8209d977c0d6c4157231a2a4bfed12761a79db1cbc9a139741a9b3d7c943536cd9eb3bb50 - languageName: node - linkType: hard - -"rrweb-snapshot@npm:^2.0.0-alpha.11": - version: 2.0.0-alpha.11 - resolution: "rrweb-snapshot@npm:2.0.0-alpha.11" - checksum: 8b5e40ebe17d61546f9c93b4cc266156be0fc28b7452e4fea6ea4c24a35a857c021e15503d218f10d3fc8c478c793450f1f2ebf9c751c1d7a24e25322b9d1677 - languageName: node - linkType: hard - -"rrweb@npm:2.0.0-alpha.11": - version: 2.0.0-alpha.11 - resolution: "rrweb@npm:2.0.0-alpha.11" - dependencies: - "@rrweb/types": ^2.0.0-alpha.11 - "@types/css-font-loading-module": 0.0.7 - "@xstate/fsm": ^1.4.0 - base64-arraybuffer: ^1.0.1 - fflate: ^0.4.4 - mitt: ^3.0.0 - rrdom: ^2.0.0-alpha.11 - rrweb-snapshot: ^2.0.0-alpha.11 - checksum: f601d1b96f3a3622551b5f12f08d53cee272ebc23a61ed722a8687b2b8cb89ff6f7813a44eaa905afcaadd3e37e6055201474de0bd010720f45ecaaf2a0b4d01 - languageName: node - linkType: hard - "rtl-css-js@npm:^1.16.1": version: 1.16.1 resolution: "rtl-css-js@npm:1.16.1" @@ -41861,13 +37901,6 @@ __metadata: languageName: node linkType: hard -"slugify@npm:^1.6.4": - version: 1.6.6 - resolution: "slugify@npm:1.6.6" - checksum: 04773c2d3b7aea8d2a61fa47cc7e5d29ce04e1a96cbaec409da57139df906acb3a449fac30b167d203212c806e73690abd4ff94fbad0a9a7b7ea109a2a638ae9 - languageName: node - linkType: hard - "smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" @@ -42630,13 +38663,6 @@ __metadata: languageName: node linkType: hard -"string.prototype.repeat@npm:^0.2.0": - version: 0.2.0 - resolution: "string.prototype.repeat@npm:0.2.0" - checksum: 5127ce1b5bce45258905877048ac28bae71be18f1c3421011bd3979cfbcacf9c16f6b7f42daa3b999c9d90f5da39bd7136982c8e64439f02666dd6c0778ed262 - languageName: node - linkType: hard - "string.prototype.trim@npm:^1.2.8": version: 1.2.8 resolution: "string.prototype.trim@npm:1.2.8" @@ -42922,21 +38948,6 @@ __metadata: languageName: node linkType: hard -"subscriptions-transport-ws@npm:^0.11.0": - version: 0.11.0 - resolution: "subscriptions-transport-ws@npm:0.11.0" - dependencies: - backo2: ^1.0.2 - eventemitter3: ^3.1.0 - iterall: ^1.2.1 - symbol-observable: ^1.0.4 - ws: ^5.2.0 || ^6.0.0 || ^7.0.0 - peerDependencies: - graphql: ^15.7.2 || ^16.0.0 - checksum: cc2e98d5c9d89c44d2e15eca188781c6ebae13d1661c42a99cee9d2897aebe2a22bc118eefff83244a79c88ee4ea24d46973ebf26ae7cb47ac1857fb8ee2c947 - languageName: node - linkType: hard - "sucrase@npm:^3.20.2": version: 3.35.0 resolution: "sucrase@npm:3.35.0" @@ -43033,13 +39044,6 @@ __metadata: languageName: node linkType: hard -"svg-pan-zoom@npm:3.6.1": - version: 3.6.1 - resolution: "svg-pan-zoom@npm:3.6.1" - checksum: 500b99378d321315e1668067ef6a73af3f61f9adfab75a575b21d2d216cb446def61d60ad12265203463cca9bef56b090f00e48118fa9b7f0ffa1c691e4c1621 - languageName: node - linkType: hard - "svg-parser@npm:^2.0.4": version: 2.0.4 resolution: "svg-parser@npm:2.0.4" @@ -43534,7 +39538,7 @@ __metadata: languageName: node linkType: hard -"tiny-invariant@npm:^1.0.6, tiny-invariant@npm:^1.3.1": +"tiny-invariant@npm:^1.0.6": version: 1.3.1 resolution: "tiny-invariant@npm:1.3.1" checksum: 872dbd1ff20a21303a2fd20ce3a15602cfa7fcf9b228bd694a52e2938224313b5385a1078cb667ed7375d1612194feaca81c4ecbe93121ca1baebe344de4f84c @@ -43940,7 +39944,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^1.10.0, tslib@npm:^1.11.1, tslib@npm:^1.14.1, tslib@npm:^1.8.1, tslib@npm:^1.9.0": +"tslib@npm:^1.11.1, tslib@npm:^1.14.1, tslib@npm:^1.8.1, tslib@npm:^1.9.0": version: 1.14.1 resolution: "tslib@npm:1.14.1" checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd @@ -44284,13 +40288,6 @@ __metadata: languageName: node linkType: hard -"uc.micro@npm:^2.0.0, uc.micro@npm:^2.1.0": - version: 2.1.0 - resolution: "uc.micro@npm:2.1.0" - checksum: 37197358242eb9afe367502d4638ac8c5838b78792ab218eafe48287b0ed28aaca268ec0392cc5729f6c90266744de32c06ae938549aee041fc93b0f9672d6b2 - languageName: node - linkType: hard - "uglify-js@npm:^3.1.4": version: 3.17.0 resolution: "uglify-js@npm:3.17.0" @@ -44789,18 +40786,6 @@ __metadata: languageName: node linkType: hard -"use-deep-compare-effect@npm:^1.8.1": - version: 1.8.1 - resolution: "use-deep-compare-effect@npm:1.8.1" - dependencies: - "@babel/runtime": ^7.12.5 - dequal: ^2.0.2 - peerDependencies: - react: ">=16.13" - checksum: 2b9b6291df3f772f44d259b352e5d998963ccee0db2efeb76bb05525d928064aeeb69bb0dee5a5e428fea7cf3db67c097a770ebd30caa080662b565f6ef02b2e - languageName: node - linkType: hard - "use-immer@npm:^0.9.0": version: 0.9.0 resolution: "use-immer@npm:0.9.0" @@ -45164,28 +41149,6 @@ __metadata: languageName: node linkType: hard -"victory-vendor@npm:^36.6.8": - version: 36.6.8 - resolution: "victory-vendor@npm:36.6.8" - dependencies: - "@types/d3-array": ^3.0.3 - "@types/d3-ease": ^3.0.0 - "@types/d3-interpolate": ^3.0.1 - "@types/d3-scale": ^4.0.2 - "@types/d3-shape": ^3.1.0 - "@types/d3-time": ^3.0.0 - "@types/d3-timer": ^3.0.0 - d3-array: ^3.1.6 - d3-ease: ^3.0.1 - d3-interpolate: ^3.0.1 - d3-scale: ^4.0.2 - d3-shape: ^3.1.0 - d3-time: ^3.0.0 - d3-timer: ^3.0.1 - checksum: 6411f7c19a776cef3919946d429293cfe33c93a6e4dcfdfa2ba1edecad3a28ed2cd6b0d117169b8917ab6a7679e2bade5e7bfc1fed3fc8b464b842f21dac5f49 - languageName: node - linkType: hard - "vinyl-file@npm:^3.0.0": version: 3.0.0 resolution: "vinyl-file@npm:3.0.0" @@ -45420,13 +41383,6 @@ __metadata: languageName: node linkType: hard -"web-vitals@npm:^3.1.0": - version: 3.3.2 - resolution: "web-vitals@npm:3.3.2" - checksum: 76e832341d213d5de6f6767fef7f8c02163ab94326912a6355bbf6e194d930196ca5094b0d0d493b4c194acaaabcc96f0adc87870b913a7b9a51b225807abccf - languageName: node - linkType: hard - "webidl-conversions@npm:^3.0.0": version: 3.0.1 resolution: "webidl-conversions@npm:3.0.1" @@ -45947,7 +41903,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^5.2.0 || ^6.0.0 || ^7.0.0, ws@npm:^7.4.6": +"ws@npm:^7.4.6": version: 7.5.9 resolution: "ws@npm:7.5.9" peerDependencies: @@ -46030,16 +41986,6 @@ __metadata: languageName: node linkType: hard -"xml2js@npm:^0.6.0": - version: 0.6.2 - resolution: "xml2js@npm:0.6.2" - dependencies: - sax: ">=0.6.0" - xmlbuilder: ~11.0.0 - checksum: 458a83806193008edff44562c0bdb982801d61ee7867ae58fd35fab781e69e17f40dfeb8fc05391a4648c9c54012066d3955fe5d993ffbe4dc63399023f32ac2 - languageName: node - linkType: hard - "xml@npm:=1.0.1": version: 1.0.1 resolution: "xml@npm:1.0.1" @@ -46082,7 +42028,7 @@ __metadata: languageName: node linkType: hard -"xtend@npm:^4.0.0, xtend@npm:^4.0.2, xtend@npm:~4.0.1": +"xtend@npm:^4.0.0, xtend@npm:^4.0.2": version: 4.0.2 resolution: "xtend@npm:4.0.2" checksum: ac5dfa738b21f6e7f0dd6e65e1b3155036d68104e67e5d5d1bde74892e327d7e5636a076f625599dc394330a731861e87343ff184b0047fef1360a7ec0a5a36a @@ -46358,13 +42304,6 @@ __metadata: languageName: node linkType: hard -"yn@npm:^5.0.0": - version: 5.0.0 - resolution: "yn@npm:5.0.0" - checksum: f0ec7710d3d697e88a67a46e8072542448f04677a7e6580c56b1b78da202fa5cd73fabba94957d58ee306e4ce6366c5c38c1a9fb7fd76d07ad77a4d1908b66b0 - languageName: node - linkType: hard - "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0" @@ -46401,22 +42340,6 @@ __metadata: languageName: node linkType: hard -"zen-observable-ts@npm:^1.1.0": - version: 1.2.5 - resolution: "zen-observable-ts@npm:1.2.5" - dependencies: - zen-observable: 0.8.15 - checksum: 3b707b7a0239a9bc40f73ba71b27733a689a957c1f364fabb9fa9cbd7d04b7c2faf0d517bf17004e3ed3f4330ac613e84c0d32313e450ddaa046f3350af44541 - languageName: node - linkType: hard - -"zen-observable@npm:0.8.15": - version: 0.8.15 - resolution: "zen-observable@npm:0.8.15" - checksum: b7289084bc1fc74a559b7259faa23d3214b14b538a8843d2b001a35e27147833f4107590b1b44bf5bc7f6dfe6f488660d3a3725f268e09b3925b3476153b7821 - languageName: node - linkType: hard - "zen-observable@npm:^0.10.0": version: 0.10.0 resolution: "zen-observable@npm:0.10.0" @@ -46485,18 +42408,6 @@ __metadata: languageName: node linkType: hard -"zustand@npm:3.6.9": - version: 3.6.9 - resolution: "zustand@npm:3.6.9" - peerDependencies: - react: ">=16.8" - peerDependenciesMeta: - react: - optional: true - checksum: a553cca3d96450fbc3433df8c562d737d00e7183516c1b7538bfd575055b3b9cfb141041505f211d1ee5975d60789bdfd45cdc7d6efe6dfde1fa718279cf5568 - languageName: node - linkType: hard - "zwitch@npm:^2.0.0": version: 2.0.2 resolution: "zwitch@npm:2.0.2"