From b551349b40e22cda0a9a5dc5ab93343c55ec8b1f Mon Sep 17 00:00:00 2001 From: Axel Hecht Date: Thu, 24 Aug 2023 12:21:09 +0200 Subject: [PATCH 01/82] Make test-utils not depend on testing-library directly This should help transition to React 18 Signed-off-by: Axel Hecht --- packages/test-utils/package.json | 6 ++---- yarn.lock | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 1ba9c0229e..7ca8b36098 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -55,21 +55,19 @@ "@backstage/types": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@testing-library/dom": "^8.0.0", - "@testing-library/jest-dom": "^5.10.1", - "@testing-library/react": "^12.1.3", - "@testing-library/user-event": "^14.0.0", "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "zen-observable": "^0.10.0" }, "peerDependencies": { + "@testing-library/react": "^12.1.3", "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" }, "devDependencies": { "@backstage/cli": "workspace:^", + "@testing-library/jest-dom": "^5.10.1", "msw": "^1.0.0" }, "files": [ diff --git a/yarn.lock b/yarn.lock index fd7e43d30c..fb9e9e34aa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10049,7 +10049,6 @@ __metadata: "@backstage/types": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -10058,6 +10057,7 @@ __metadata: msw: ^1.0.0 zen-observable: ^0.10.0 peerDependencies: + "@testing-library/react": ^12.1.3 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 From 80a76accf5c8223f967eef3b88c02f9790ead8fb Mon Sep 17 00:00:00 2001 From: Axel Hecht Date: Fri, 25 Aug 2023 18:05:29 +0200 Subject: [PATCH 02/82] Expand version ranges of peer dependencies to include React 18 and the corresponding testing libraries Signed-off-by: Axel Hecht --- packages/test-utils/package.json | 6 +++--- yarn.lock | 8 +++----- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 7ca8b36098..88985f4bdb 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -60,9 +60,9 @@ "zen-observable": "^0.10.0" }, "peerDependencies": { - "@testing-library/react": "^12.1.3", - "react": "^16.13.1 || ^17.0.0", - "react-dom": "^16.13.1 || ^17.0.0", + "@testing-library/react": "^12.1.3 || ^13.0.0 || ^14.0.0", + "react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index fb9e9e34aa..3815966168 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10050,16 +10050,14 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@testing-library/jest-dom": ^5.10.1 - "@testing-library/react": ^12.1.3 - "@testing-library/user-event": ^14.0.0 "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 msw: ^1.0.0 zen-observable: ^0.10.0 peerDependencies: - "@testing-library/react": ^12.1.3 - react: ^16.13.1 || ^17.0.0 - react-dom: ^16.13.1 || ^17.0.0 + "@testing-library/react": ^12.1.3 || ^13.0.0 || ^14.0.0 + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft From 9ceb6195275af2c75608de1cc0e1bceec0e51f6a Mon Sep 17 00:00:00 2001 From: Axel Hecht Date: Mon, 4 Sep 2023 09:39:02 +0200 Subject: [PATCH 03/82] Add legacyRoot option, add changeset Signed-off-by: Axel Hecht --- .changeset/three-nails-remember.md | 7 +++++++ packages/test-utils/api-report.md | 9 +++++++-- packages/test-utils/src/testUtils/appWrappers.tsx | 6 ++++-- packages/test-utils/src/testUtils/testingLibrary.ts | 9 ++++++++- 4 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 .changeset/three-nails-remember.md diff --git a/.changeset/three-nails-remember.md b/.changeset/three-nails-remember.md new file mode 100644 index 0000000000..e5bc83b9d3 --- /dev/null +++ b/.changeset/three-nails-remember.md @@ -0,0 +1,7 @@ +--- +'@backstage/test-utils': patch +--- + +Add support for React Testing Library 13+, and thus React 18. + +We're exposing an additional option to the `render*` methods to enable the [legacyRoot](https://testing-library.com/docs/react-testing-library/api/#legacyroot) flow. diff --git a/packages/test-utils/api-report.md b/packages/test-utils/api-report.md index fe4edd627a..60bd352726 100644 --- a/packages/test-utils/api-report.md +++ b/packages/test-utils/api-report.md @@ -55,6 +55,11 @@ export type ErrorWithContext = { context?: ErrorApiErrorContext; }; +// @public +export type LegacyRootOption = { + legacyRoot?: boolean; +}; + // @public export type LogCollector = AsyncLogCollector | SyncLogCollector; @@ -194,13 +199,13 @@ export type MockStorageBucket = { // @public export function renderInTestApp( Component: ComponentType> | ReactNode, - options?: TestAppOptions, + options?: TestAppOptions & LegacyRootOption, ): Promise; // @public export function renderWithEffects( nodes: ReactElement, - options?: Pick, + options?: Pick & LegacyRootOption, ): Promise; // @public diff --git a/packages/test-utils/src/testUtils/appWrappers.tsx b/packages/test-utils/src/testUtils/appWrappers.tsx index a95fdf6d8f..ebded4d813 100644 --- a/packages/test-utils/src/testUtils/appWrappers.tsx +++ b/packages/test-utils/src/testUtils/appWrappers.tsx @@ -33,7 +33,7 @@ import { createRouteRef, } from '@backstage/core-plugin-api'; import { MatcherFunction, RenderResult } from '@testing-library/react'; -import { renderWithEffects } from './testingLibrary'; +import { renderWithEffects, LegacyRootOption } from './testingLibrary'; import { defaultApis } from './defaultApis'; import { mockApis } from './mockApis'; @@ -232,7 +232,7 @@ export function wrapInTestApp( */ export async function renderInTestApp( Component: ComponentType> | ReactNode, - options: TestAppOptions = {}, + options: TestAppOptions & LegacyRootOption = {}, ): Promise { let wrappedElement: React.ReactElement; if (Component instanceof Function) { @@ -240,9 +240,11 @@ export async function renderInTestApp( } else { wrappedElement = Component as React.ReactElement; } + const { legacyRoot } = options; return renderWithEffects(wrappedElement, { wrapper: createTestAppWrapper(options), + legacyRoot, }); } diff --git a/packages/test-utils/src/testUtils/testingLibrary.ts b/packages/test-utils/src/testUtils/testingLibrary.ts index adb9867de8..c5dbd99eb0 100644 --- a/packages/test-utils/src/testUtils/testingLibrary.ts +++ b/packages/test-utils/src/testUtils/testingLibrary.ts @@ -22,6 +22,13 @@ import { RenderResult, } from '@testing-library/react'; +/** + * @public + * Set legacy mode when using React 18/RTL 13+. + * Mock this option while we're working against React 17 or lower. + */ +export type LegacyRootOption = { legacyRoot?: boolean }; + /** * @public * Simplifies rendering of async components in by taking care of the wrapping inside act @@ -36,7 +43,7 @@ import { */ export async function renderWithEffects( nodes: ReactElement, - options?: Pick, + options?: Pick & LegacyRootOption, ): Promise { let value: RenderResult; await act(async () => { From 3419e2ec54d4dc6c65f4403c9ca32aad87847a3f Mon Sep 17 00:00:00 2001 From: Axel Hecht Date: Mon, 4 Sep 2023 13:37:23 +0200 Subject: [PATCH 04/82] Fix vale Signed-off-by: Axel Hecht --- .changeset/three-nails-remember.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/three-nails-remember.md b/.changeset/three-nails-remember.md index e5bc83b9d3..6df9b43801 100644 --- a/.changeset/three-nails-remember.md +++ b/.changeset/three-nails-remember.md @@ -4,4 +4,4 @@ Add support for React Testing Library 13+, and thus React 18. -We're exposing an additional option to the `render*` methods to enable the [legacyRoot](https://testing-library.com/docs/react-testing-library/api/#legacyroot) flow. +We're exposing an additional option to the `render*` methods to enable the [`legacyRoot`](https://testing-library.com/docs/react-testing-library/api/#legacyroot) flow. From bc4ff45ab4ec703a84ea48abb503196f1ff64a04 Mon Sep 17 00:00:00 2001 From: rui ma Date: Tue, 12 Sep 2023 20:50:59 +0800 Subject: [PATCH 05/82] fix: add i18n doc to nav config Signed-off-by: rui ma --- microsite/sidebars.json | 1 + 1 file changed, 1 insertion(+) diff --git a/microsite/sidebars.json b/microsite/sidebars.json index 0e73bd94f2..87e9b995ed 100644 --- a/microsite/sidebars.json +++ b/microsite/sidebars.json @@ -243,6 +243,7 @@ "plugins/integrating-search-into-plugins", "plugins/composability", "plugins/customization", + "plugins/internationalization", "plugins/analytics", "plugins/feature-flags", { From 296bfded987c00736f173e7707d4bff0fdba0352 Mon Sep 17 00:00:00 2001 From: Florian JUDITH Date: Fri, 15 Sep 2023 17:09:20 -0400 Subject: [PATCH 06/82] Bump Docker base image from 'node:16-bullseye-slim' to 'node:18-bullseye-slim' Signed-off-by: Florian JUDITH --- docs/deployment/docker.md | 8 ++++---- docs/local-dev/cli-build-system.md | 2 +- packages/backend/Dockerfile | 2 +- .../templates/default-app/packages/backend/Dockerfile | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/deployment/docker.md b/docs/deployment/docker.md index 3bbf06d614..a117d39f9a 100644 --- a/docs/deployment/docker.md +++ b/docs/deployment/docker.md @@ -54,7 +54,7 @@ Once the host build is complete, we are ready to build our image. The following `Dockerfile` is included when creating a new app with `@backstage/create-app`: ```Dockerfile -FROM node:16-bullseye-slim +FROM node:18-bullseye-slim # Install isolate-vm dependencies, these are needed by the @backstage/plugin-scaffolder-backend. RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ @@ -160,7 +160,7 @@ the repo root: ```Dockerfile # Stage 1 - Create yarn install skeleton layer -FROM node:16-bullseye-slim AS packages +FROM node:18-bullseye-slim AS packages WORKDIR /app COPY package.json yarn.lock ./ @@ -173,7 +173,7 @@ COPY plugins plugins RUN find packages \! -name "package.json" -mindepth 2 -maxdepth 2 -exec rm -rf {} \+ # Stage 2 - Install dependencies and build packages -FROM node:16-bullseye-slim AS build +FROM node:18-bullseye-slim AS build # Install isolate-vm dependencies, these are needed by the @backstage/plugin-scaffolder-backend. RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ @@ -211,7 +211,7 @@ RUN mkdir packages/backend/dist/skeleton packages/backend/dist/bundle \ && tar xzf packages/backend/dist/bundle.tar.gz -C packages/backend/dist/bundle # Stage 3 - Build the actual backend image and install production dependencies -FROM node:16-bullseye-slim +FROM node:18-bullseye-slim # Install isolate-vm dependencies, these are needed by the @backstage/plugin-scaffolder-backend. RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ diff --git a/docs/local-dev/cli-build-system.md b/docs/local-dev/cli-build-system.md index b22b6dd284..94244de6fa 100644 --- a/docs/local-dev/cli-build-system.md +++ b/docs/local-dev/cli-build-system.md @@ -418,7 +418,7 @@ The following is an example of a `Dockerfile` that can be used to package the output of building a package with role `'backend'` into an image: ```Dockerfile -FROM node:16-bullseye-slim +FROM node:18-bullseye-slim WORKDIR /app COPY yarn.lock package.json packages/backend/dist/skeleton.tar.gz ./ diff --git a/packages/backend/Dockerfile b/packages/backend/Dockerfile index da25f9736c..24ede0e866 100644 --- a/packages/backend/Dockerfile +++ b/packages/backend/Dockerfile @@ -9,7 +9,7 @@ # # Once the commands have been run, you can build the image using `yarn build-image` -FROM node:16-bullseye-slim +FROM node:18-bullseye-slim # Install sqlite3 dependencies. You can skip this if you don't use sqlite3 in the image, # in which case you should also move better-sqlite3 to "devDependencies" in package.json. diff --git a/packages/create-app/templates/default-app/packages/backend/Dockerfile b/packages/create-app/templates/default-app/packages/backend/Dockerfile index a60fee7a9c..373ee7f40a 100644 --- a/packages/create-app/templates/default-app/packages/backend/Dockerfile +++ b/packages/create-app/templates/default-app/packages/backend/Dockerfile @@ -9,7 +9,7 @@ # # Once the commands have been run, you can build the image using `yarn build-image` -FROM node:16-bullseye-slim +FROM node:18-bullseye-slim # Install isolate-vm dependencies, these are needed by the @backstage/plugin-scaffolder-backend. RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ From 04a3f65e1555a7ef7061871c9cb204db2bcde427 Mon Sep 17 00:00:00 2001 From: Florian JUDITH Date: Fri, 15 Sep 2023 23:16:13 -0400 Subject: [PATCH 07/82] Added changeset Signed-off-by: Florian JUDITH --- .changeset/small-pugs-build.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/small-pugs-build.md diff --git a/.changeset/small-pugs-build.md b/.changeset/small-pugs-build.md new file mode 100644 index 0000000000..5071ef850d --- /dev/null +++ b/.changeset/small-pugs-build.md @@ -0,0 +1,6 @@ +--- +'@backstage/create-app': major +'example-backend': major +--- + +- [#19974](https://github.com/backstage/backstage/issues/19974) Bump Docker base images to "node:18-bullseye-slim" in order to resolve compatiblity issue raised when running `yarn build-image` with Node.JS 16.x. This update follows the Docker CI update to Node 18x [#19563](https://github.com/backstage/backstage/pull/19563). From 3d2d3c4c153bd3169552bb157b25d0fadb858b97 Mon Sep 17 00:00:00 2001 From: Florian JUDITH Date: Sat, 16 Sep 2023 08:11:14 -0400 Subject: [PATCH 08/82] Fixed typos in change set Signed-off-by: Florian JUDITH --- .changeset/small-pugs-build.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.changeset/small-pugs-build.md b/.changeset/small-pugs-build.md index 5071ef850d..f610db0bbd 100644 --- a/.changeset/small-pugs-build.md +++ b/.changeset/small-pugs-build.md @@ -1,6 +1,6 @@ --- -'@backstage/create-app': major -'example-backend': major +'@backstage/create-app': patch +'example-backend': patch --- -- [#19974](https://github.com/backstage/backstage/issues/19974) Bump Docker base images to "node:18-bullseye-slim" in order to resolve compatiblity issue raised when running `yarn build-image` with Node.JS 16.x. This update follows the Docker CI update to Node 18x [#19563](https://github.com/backstage/backstage/pull/19563). +Bump Docker base images to `node:18-bullseye-slim` to fix compatibility issues raised during image build. This update aligns with the recent Github Actions update to Node 18x [#19563](https://github.com/backstage/backstage/pull/19563). From 842b920f1baa095a262a459801ef4412c658ee5e Mon Sep 17 00:00:00 2001 From: Florian JUDITH Date: Sat, 16 Sep 2023 08:20:06 -0400 Subject: [PATCH 09/82] Removed unpublished package from changeset Signed-off-by: Florian JUDITH --- .changeset/small-pugs-build.md | 1 - 1 file changed, 1 deletion(-) diff --git a/.changeset/small-pugs-build.md b/.changeset/small-pugs-build.md index f610db0bbd..4ec40a8181 100644 --- a/.changeset/small-pugs-build.md +++ b/.changeset/small-pugs-build.md @@ -1,6 +1,5 @@ --- '@backstage/create-app': patch -'example-backend': patch --- Bump Docker base images to `node:18-bullseye-slim` to fix compatibility issues raised during image build. This update aligns with the recent Github Actions update to Node 18x [#19563](https://github.com/backstage/backstage/pull/19563). From 6847cd6225d6ebbab2c5e12470049de9883f4fca Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 17 Sep 2023 15:02:02 +0200 Subject: [PATCH 10/82] backend-common: avoid starting keepalive loop in tests Signed-off-by: Patrik Oldsberg --- .changeset/four-parents-visit.md | 5 +++++ .github/vale/Vocab/Backstage/accept.txt | 1 + packages/backend-common/src/database/DatabaseManager.ts | 4 +++- 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 .changeset/four-parents-visit.md diff --git a/.changeset/four-parents-visit.md b/.changeset/four-parents-visit.md new file mode 100644 index 0000000000..041380ce1e --- /dev/null +++ b/.changeset/four-parents-visit.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-common': patch +--- + +Avoid starting database keepalive loop in tests. diff --git a/.github/vale/Vocab/Backstage/accept.txt b/.github/vale/Vocab/Backstage/accept.txt index 0229ed8e12..e120198ba9 100644 --- a/.github/vale/Vocab/Backstage/accept.txt +++ b/.github/vale/Vocab/Backstage/accept.txt @@ -180,6 +180,7 @@ jsx JWTs Kaewkasi Kaswell +keepalive Keyv Knex Koyeb diff --git a/packages/backend-common/src/database/DatabaseManager.ts b/packages/backend-common/src/database/DatabaseManager.ts index 4b655512bb..c1c9e56257 100644 --- a/packages/backend-common/src/database/DatabaseManager.ts +++ b/packages/backend-common/src/database/DatabaseManager.ts @@ -377,7 +377,9 @@ export class DatabaseManager { databaseClientOverrides, deps, ); - this.startKeepaliveLoop(pluginId, client); + if (process.env.NODE_ENV !== 'test') { + this.startKeepaliveLoop(pluginId, client); + } return client; }); From 74604806aae8aa6388852a02eabd69037ca25189 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 17 Sep 2023 15:02:57 +0200 Subject: [PATCH 11/82] backend-tasks: avoid starting task janitor in tests Signed-off-by: Patrik Oldsberg --- .changeset/rich-fishes-deny.md | 5 +++++ packages/backend-tasks/src/tasks/TaskScheduler.ts | 14 ++++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) create mode 100644 .changeset/rich-fishes-deny.md diff --git a/.changeset/rich-fishes-deny.md b/.changeset/rich-fishes-deny.md new file mode 100644 index 0000000000..c90d76f20d --- /dev/null +++ b/.changeset/rich-fishes-deny.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-tasks': patch +--- + +Avoid starting task janitor in tests. diff --git a/packages/backend-tasks/src/tasks/TaskScheduler.ts b/packages/backend-tasks/src/tasks/TaskScheduler.ts index fe81a0054e..6b6436e52a 100644 --- a/packages/backend-tasks/src/tasks/TaskScheduler.ts +++ b/packages/backend-tasks/src/tasks/TaskScheduler.ts @@ -80,12 +80,14 @@ export class TaskScheduler { await migrateBackendTasks(knex); } - const janitor = new PluginTaskSchedulerJanitor({ - knex, - waitBetweenRuns: Duration.fromObject({ minutes: 1 }), - logger: opts.logger, - }); - janitor.start(); + if (process.env.NODE_ENV !== 'test') { + const janitor = new PluginTaskSchedulerJanitor({ + knex, + waitBetweenRuns: Duration.fromObject({ minutes: 1 }), + logger: opts.logger, + }); + janitor.start(); + } return knex; }); From 6440e758c0fbec5d4f1a1867f555bad528ad857f Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 17 Sep 2023 15:03:24 +0200 Subject: [PATCH 12/82] backend-taske: make sure all handles are cleaned up in tests Signed-off-by: Patrik Oldsberg --- .../src/tasks/LocalTaskWorker.test.ts | 17 +++++++---- .../tasks/PluginTaskSchedulerJanitor.test.ts | 7 ++--- .../src/tasks/TaskScheduler.test.ts | 4 +++ .../src/tasks/TaskWorker.test.ts | 8 ++++-- .../__testUtils__/createTestScopedSignal.ts | 28 +++++++++++++++++++ 5 files changed, 51 insertions(+), 13 deletions(-) create mode 100644 packages/backend-tasks/src/tasks/__testUtils__/createTestScopedSignal.ts diff --git a/packages/backend-tasks/src/tasks/LocalTaskWorker.test.ts b/packages/backend-tasks/src/tasks/LocalTaskWorker.test.ts index c46743ae59..4fd4949478 100644 --- a/packages/backend-tasks/src/tasks/LocalTaskWorker.test.ts +++ b/packages/backend-tasks/src/tasks/LocalTaskWorker.test.ts @@ -82,14 +82,18 @@ describe('LocalTaskWorker', () => { it('can trigger to abort wait', async () => { const fn = jest.fn(); + const controller = new AbortController(); const worker = new LocalTaskWorker('a', fn, logger); - worker.start({ - version: 2, - initialDelayDuration: 'PT0.2S', - cadence: 'PT0.2S', - timeoutAfterDuration: 'PT1S', - }); + worker.start( + { + version: 2, + initialDelayDuration: 'PT0.2S', + cadence: 'PT0.2S', + timeoutAfterDuration: 'PT1S', + }, + { signal: controller.signal }, + ); // TODO(freben): Rewrite to fake timers - tried, but it wouldn't work expect(fn).toHaveBeenCalledTimes(0); @@ -100,5 +104,6 @@ describe('LocalTaskWorker', () => { worker.trigger(); await new Promise(r => setTimeout(r, 10)); expect(fn).toHaveBeenCalledTimes(2); + controller.abort(); }); }); diff --git a/packages/backend-tasks/src/tasks/PluginTaskSchedulerJanitor.test.ts b/packages/backend-tasks/src/tasks/PluginTaskSchedulerJanitor.test.ts index efbad2e8b6..50bea27d27 100644 --- a/packages/backend-tasks/src/tasks/PluginTaskSchedulerJanitor.test.ts +++ b/packages/backend-tasks/src/tasks/PluginTaskSchedulerJanitor.test.ts @@ -22,6 +22,7 @@ import waitForExpect from 'wait-for-expect'; import { migrateBackendTasks } from '../database/migrateBackendTasks'; import { DbTasksRow, DB_TASKS_TABLE } from '../database/tables'; import { PluginTaskSchedulerJanitor } from './PluginTaskSchedulerJanitor'; +import { createTestScopedSignal } from './__testUtils__/createTestScopedSignal'; const insertTask = async (knex: Knex, task: DbTasksRow) => { return knex(DB_TASKS_TABLE) @@ -45,6 +46,7 @@ describe('PluginTaskSchedulerJanitor', () => { 'MYSQL_8', ], }); + const testScopedSignal = createTestScopedSignal(); jest.setTimeout(60_000); @@ -77,8 +79,7 @@ describe('PluginTaskSchedulerJanitor', () => { logger, }); - const abortController = new AbortController(); - worker.start(abortController.signal); + worker.start(testScopedSignal()); await waitForExpect(async () => { await expect(getTask(knex)).resolves.toEqual( @@ -90,8 +91,6 @@ describe('PluginTaskSchedulerJanitor', () => { }), ); }); - - abortController.abort(); }, ); }); diff --git a/packages/backend-tasks/src/tasks/TaskScheduler.test.ts b/packages/backend-tasks/src/tasks/TaskScheduler.test.ts index 6aa77dd7fe..8e419437bc 100644 --- a/packages/backend-tasks/src/tasks/TaskScheduler.test.ts +++ b/packages/backend-tasks/src/tasks/TaskScheduler.test.ts @@ -19,6 +19,7 @@ import { TestDatabaseId, TestDatabases } from '@backstage/backend-test-utils'; import { Duration } from 'luxon'; import waitForExpect from 'wait-for-expect'; import { TaskScheduler } from './TaskScheduler'; +import { createTestScopedSignal } from './__testUtils__/createTestScopedSignal'; jest.setTimeout(60_000); @@ -27,6 +28,7 @@ describe('TaskScheduler', () => { const databases = TestDatabases.create({ ids: ['POSTGRES_13', 'POSTGRES_9', 'SQLITE_3', 'MYSQL_8'], }); + const testScopedSignal = createTestScopedSignal(); async function createDatabase( databaseId: TestDatabaseId, @@ -51,6 +53,7 @@ describe('TaskScheduler', () => { id: 'task1', timeout: Duration.fromMillis(5000), frequency: Duration.fromMillis(5000), + signal: testScopedSignal(), fn, }); @@ -71,6 +74,7 @@ describe('TaskScheduler', () => { id: 'task2', timeout: Duration.fromMillis(5000), frequency: { cron: '* * * * * *' }, + signal: testScopedSignal(), fn, }); diff --git a/packages/backend-tasks/src/tasks/TaskWorker.test.ts b/packages/backend-tasks/src/tasks/TaskWorker.test.ts index 71d02274e2..3022f59060 100644 --- a/packages/backend-tasks/src/tasks/TaskWorker.test.ts +++ b/packages/backend-tasks/src/tasks/TaskWorker.test.ts @@ -22,6 +22,7 @@ import { migrateBackendTasks } from '../database/migrateBackendTasks'; import { DbTasksRow, DB_TASKS_TABLE } from '../database/tables'; import { TaskWorker } from './TaskWorker'; import { TaskSettingsV2 } from './types'; +import { createTestScopedSignal } from './__testUtils__/createTestScopedSignal'; jest.setTimeout(60_000); @@ -30,6 +31,7 @@ describe('TaskWorker', () => { const databases = TestDatabases.create({ ids: ['POSTGRES_13', 'POSTGRES_9', 'SQLITE_3', 'MYSQL_8'], }); + const testScopedSignal = createTestScopedSignal(); beforeEach(() => { jest.resetAllMocks(); @@ -135,7 +137,7 @@ describe('TaskWorker', () => { }; const checkFrequency = Duration.fromObject({ milliseconds: 100 }); const worker = new TaskWorker('task1', fn, knex, logger, checkFrequency); - worker.start(settings); + worker.start(settings, { signal: testScopedSignal() }); await waitForExpect(() => { expect(logger.error).toHaveBeenCalled(); @@ -158,7 +160,7 @@ describe('TaskWorker', () => { }; const checkFrequency = Duration.fromObject({ milliseconds: 100 }); const worker = new TaskWorker('task1', fn, knex, logger, checkFrequency); - worker.start(settings); + worker.start(settings, { signal: testScopedSignal() }); await waitForExpect(() => { expect(fn).toHaveBeenCalledTimes(3); @@ -321,7 +323,7 @@ describe('TaskWorker', () => { logger, Duration.fromMillis(10), ); - await worker2.start(settings); + await worker2.start(settings, { signal: testScopedSignal() }); // We eventually abort the first worker just to make sure that the second // one for sure will get a go at running the task diff --git a/packages/backend-tasks/src/tasks/__testUtils__/createTestScopedSignal.ts b/packages/backend-tasks/src/tasks/__testUtils__/createTestScopedSignal.ts new file mode 100644 index 0000000000..6a497ea266 --- /dev/null +++ b/packages/backend-tasks/src/tasks/__testUtils__/createTestScopedSignal.ts @@ -0,0 +1,28 @@ +/* + * 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 function createTestScopedSignal(): () => AbortSignal { + let testAbortController = new AbortController(); + + beforeEach(() => { + testAbortController = new AbortController(); + }); + afterEach(() => { + testAbortController.abort(); + }); + + return () => testAbortController.signal; +} From 19a140418cc85c5233faa474640248c7a0cee254 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 18 Sep 2023 10:04:41 +0200 Subject: [PATCH 13/82] backend-common: added DB creation retries and lowered pool limits Signed-off-by: Patrik Oldsberg --- .changeset/sour-rules-press.md | 5 +++++ .../src/database/connectors/mysql.ts | 22 ++++++++++++++++++- .../src/database/connectors/postgres.ts | 22 ++++++++++++++++++- 3 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 .changeset/sour-rules-press.md diff --git a/.changeset/sour-rules-press.md b/.changeset/sour-rules-press.md new file mode 100644 index 0000000000..a47194d176 --- /dev/null +++ b/.changeset/sour-rules-press.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-common': patch +--- + +Added retries for initial database creation, as well as set minimum connection pool size for the database creation client to 0 and lowered the connection acquisition timeout. diff --git a/packages/backend-common/src/database/connectors/mysql.ts b/packages/backend-common/src/database/connectors/mysql.ts index 4283ff42bd..16610dd920 100644 --- a/packages/backend-common/src/database/connectors/mysql.ts +++ b/packages/backend-common/src/database/connectors/mysql.ts @@ -151,13 +151,33 @@ export async function ensureMysqlDatabaseExists( connection: { database: null as unknown as string, }, + pool: { + min: 0, + acquireTimeoutMillis: 10000, + }, }); try { const ensureDatabase = async (database: string) => { await admin.raw(`CREATE DATABASE IF NOT EXISTS ??`, [database]); }; - await Promise.all(databases.map(ensureDatabase)); + await Promise.all( + databases.map(async database => { + // For initial setup we use a smaller timeout but several retries. Given that this + // is a separate connection pool we should never really run into issues with connection + // acquisition timeouts, but we do anyway. This might be a bug in knex or some other dependency. + let lastErr: Error | undefined = undefined; + for (let i = 0; i < 3; i++) { + try { + return await ensureDatabase(database); + } catch (err) { + lastErr = err; + } + await new Promise(resolve => setTimeout(resolve, 100)); + } + throw lastErr; + }), + ); } finally { await admin.destroy(); } diff --git a/packages/backend-common/src/database/connectors/postgres.ts b/packages/backend-common/src/database/connectors/postgres.ts index afc8c207be..f132488e29 100644 --- a/packages/backend-common/src/database/connectors/postgres.ts +++ b/packages/backend-common/src/database/connectors/postgres.ts @@ -126,6 +126,10 @@ export async function ensurePgDatabaseExists( connection: { database: 'postgres', }, + pool: { + min: 0, + acquireTimeoutMillis: 10000, + }, }); try { @@ -142,7 +146,23 @@ export async function ensurePgDatabaseExists( await admin.raw(`CREATE DATABASE ??`, [database]); }; - await Promise.all(databases.map(ensureDatabase)); + await Promise.all( + databases.map(async database => { + // For initial setup we use a smaller timeout but several retries. Given that this + // is a separate connection pool we should never really run into issues with connection + // acquisition timeouts, but we do anyway. This might be a bug in knex or some other dependency. + let lastErr: Error | undefined = undefined; + for (let i = 0; i < 3; i++) { + try { + return await ensureDatabase(database); + } catch (err) { + lastErr = err; + } + await new Promise(resolve => setTimeout(resolve, 100)); + } + throw lastErr; + }), + ); } finally { await admin.destroy(); } From 9b74166d11a167a6ea1aa1abfbd2805e5367ae52 Mon Sep 17 00:00:00 2001 From: Manuel Scurti Date: Sat, 10 Jun 2023 20:07:57 +0200 Subject: [PATCH 14/82] added AutoLogoutProvider Signed-off-by: Manuel Scurti --- .changeset/many-panthers-wink.md | 5 + docs/assets/auth/autologout-preview.png | Bin 0 -> 726293 bytes docs/auth/autologout.md | 96 ++++++++ packages/core-components/config.d.ts | 67 ++++++ packages/core-components/package.json | 15 +- .../AutoLogoutProvider/AutoLogoutProvider.tsx | 207 ++++++++++++++++++ .../AutologoutProvider.test.tsx | 85 +++++++ .../ConfigBasedAutoLogoutProvider.tsx | 63 ++++++ .../AutoLogoutProvider/StillTherePrompt.tsx | 89 ++++++++ .../disconnectedUsers.test.ts | 110 ++++++++++ .../AutoLogoutProvider/disconnectedUsers.ts | 72 ++++++ .../components/AutoLogoutProvider/index.ts | 22 ++ .../AutoLogoutProvider/timestampStore.test.ts | 55 +++++ .../AutoLogoutProvider/timestampStore.ts | 39 ++++ .../core-components/src/components/index.ts | 1 + .../src/layout/SignInPage/providers.tsx | 2 + yarn.lock | 20 ++ 17 files changed, 946 insertions(+), 2 deletions(-) create mode 100644 .changeset/many-panthers-wink.md create mode 100644 docs/assets/auth/autologout-preview.png create mode 100644 docs/auth/autologout.md create mode 100644 packages/core-components/config.d.ts create mode 100644 packages/core-components/src/components/AutoLogoutProvider/AutoLogoutProvider.tsx create mode 100644 packages/core-components/src/components/AutoLogoutProvider/AutologoutProvider.test.tsx create mode 100644 packages/core-components/src/components/AutoLogoutProvider/ConfigBasedAutoLogoutProvider.tsx create mode 100644 packages/core-components/src/components/AutoLogoutProvider/StillTherePrompt.tsx create mode 100644 packages/core-components/src/components/AutoLogoutProvider/disconnectedUsers.test.ts create mode 100644 packages/core-components/src/components/AutoLogoutProvider/disconnectedUsers.ts create mode 100644 packages/core-components/src/components/AutoLogoutProvider/index.ts create mode 100644 packages/core-components/src/components/AutoLogoutProvider/timestampStore.test.ts create mode 100644 packages/core-components/src/components/AutoLogoutProvider/timestampStore.ts diff --git a/.changeset/many-panthers-wink.md b/.changeset/many-panthers-wink.md new file mode 100644 index 0000000000..1a7c5c1331 --- /dev/null +++ b/.changeset/many-panthers-wink.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Added AutoLogoutProvider which introduces an optional automatic logout mechanism on user inactivity diff --git a/docs/assets/auth/autologout-preview.png b/docs/assets/auth/autologout-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..642c5f8aa65b3707e2d227f4a1c469e7ae713637 GIT binary patch literal 726293 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

Z^zM~(&@tyHiJ1*?%WHo8GWqH6 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

BPFHQRCxo#e0e}4(+>#zHoh-p*iv+c; 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%0Akbo1U)`ZNuGS^Yp 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

E)NFajQ2qH5;EKM%XOs*OC!~Z?+$CeJ(Qso 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�$lsy&xi%*|R*wBn6w+S4N|rT)rmx%$Bj~;-No> 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

l3N*)in!F9z4bbloxk7vv{Zyea_U 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%0D3*L#j07=9||WBoGJN$BWM+wqd`yomWIC6o<= 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 component to your Backstage's instance entry point, located at `App.tsx`. + +Here's how to add it: + +```ts +import { AutoLogoutProvider } from '@backstage/core-components'; + +// ... App.tsx contents + +export default app.createRoot( + <> + // ... + + {routes} + + // ... + , +); +``` + +## Configuration + +You can further adjust the Autologout settings by tweaking the available `` properties: + +```ts + + {routes} + +``` + +If you prefer to have different settings for each Backstage instance deployed at your infrastructure, you can instead leverage the `` which reads the Autologout settings from `app-config`. + +To do so, adjust your `App.tsx` as follows: + +```ts +import { ConfigBasedAutoLogoutProvider } from '@backstage/core-components'; + +// ... App.tsx contents + +export default app.createRoot( + <> + // ... + + {routes} + + // ... + , +); +``` + +And add these lines into your `app-config`: + +```yaml +auth: + autologout: + enabled: true +``` + +You will now be able to configure the AutoLogoutProvider through your `app-config`. These are the available settings: + +| Configuration Key | Component Property | Description | Allowed Values | Default Value | +| ----------------------------------------- | ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `auth.autologout.enabled` | `enabled` | Enable/disable the Autologout feature. | `true`/`false` | `false` | +| `auth.autologout.idleTimeoutMinutes` | `idleTimeoutMinutes` | Sets the idle time (in minutes) after which the user will be logged out. | `>= 0.5` minutes | `60` | +| `auth.autologout.promptBeforeIdleSeconds` | `promptBeforeIdleSeconds` | Determines the time (in seconds) prior to idle state when a prompt will appear. A value of 0 disables the prompt. This must be less than the value of `idleTimeoutMinutes`. | `>= 0` seconds | `10` | +| `auth.autologout.events` | `events` | Specifies the list of events used to detect user activity. | Allowed values are standard [DOM events](https://developer.mozilla.org/en-US/docs/Web/Events) | `'mousemove', 'keydown', 'wheel', 'DOMMouseScroll', 'mousewheel', 'mousedown', 'touchstart' 'touchmove', 'MSPointerDown', 'MSPointerMove', 'visibilitychange'` | +| `auth.autologout.useWorkerTimers` | `useWorkerTimers` | Enables or disables the use of Node's worker thread timers instead of main thread timers. This can be beneficial if the browser is terminating timers in inactive tabs, like those used by Autologout. In case of browser incompatibility, try setting this to false. | `true`/`false` | `true` | +| `auth.autologout.logoutIfDisconnected` | `logoutIfDisconnected` | Enable/disable autologout for disconnected users. Disconnected users are those who are logged in but do not have any active Backstage tabs open in their browsers. If enabled, such users will be automatically logged out after `idleTimeoutMinutes`. | `true`/`false` | `true` | diff --git a/packages/core-components/config.d.ts b/packages/core-components/config.d.ts new file mode 100644 index 0000000000..a10d84f232 --- /dev/null +++ b/packages/core-components/config.d.ts @@ -0,0 +1,67 @@ +/* + * 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 interface Config { + auth?: { + /** + * Autologout feature configuration + */ + autologout?: { + /** + * Enable or disable the autologout feature + * @visibility frontend + */ + enabled?: boolean; + + /** + * Number of minutes after which the inactive user is logged out automatically. + * Default is 60 minutes (1 hour) + * @visibility frontend + */ + idleTimeoutMinutes?: number; + + /** + * Number of seconds before the idle timeout where the user will be asked if it's still active. + * A dialog will be shown. + * Default is 10 seconds. + * Set to 0 seconds to disable the prompt. + * @visibility frontend + */ + promptBeforeIdleSeconds?: number; + + /** + * Enable/disable the usage of worker thread timers instead of main thread timers. + * Default is true. + * If you experience some browser incompatibility, you may try to set this to false. + * @visibility frontend + */ + useWorkerTimers?: boolean; + + /** + * List of events that the autologout event listener will catch to detect if the user is active + * These events are standard DOM events. + * @visibility frontend + */ + events?: string[]; + + /** + * Enable/disable the automatic logout also on users that are logged in but with no Backstage tabs open. + * Default is true. + * @visibility frontend + */ + logoutIfDisconnected?: boolean; + }; + }; +} diff --git a/packages/core-components/package.json b/packages/core-components/package.json index 31d0dfb005..a25999c2b3 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -64,6 +64,7 @@ "rc-progress": "3.5.1", "react-helmet": "6.1.0", "react-hook-form": "^7.12.2", + "react-idle-timer": "5.6.2", "react-markdown": "^8.0.0", "react-sparklines": "^1.7.0", "react-syntax-highlighter": "^15.4.5", @@ -101,9 +102,19 @@ "@types/react-virtualized-auto-sizer": "^1.0.1", "@types/react-window": "^1.8.5", "@types/zen-observable": "^0.8.0", + "cross-fetch": "^3.1.5", + "jest-localstorage-mock": "^2.4.26", "msw": "^1.0.0" }, "files": [ - "dist" - ] + "dist", + "config.d.ts" + ], + "configSchema": "config.d.ts", + "jest": { + "resetMocks": false, + "setupFiles": [ + "jest-localstorage-mock" + ] + } } diff --git a/packages/core-components/src/components/AutoLogoutProvider/AutoLogoutProvider.tsx b/packages/core-components/src/components/AutoLogoutProvider/AutoLogoutProvider.tsx new file mode 100644 index 0000000000..4457cab565 --- /dev/null +++ b/packages/core-components/src/components/AutoLogoutProvider/AutoLogoutProvider.tsx @@ -0,0 +1,207 @@ +/* + * 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 { identityApiRef, useApi } from '@backstage/core-plugin-api'; +import React, { PropsWithChildren, useEffect, useMemo, useState } from 'react'; +import { + EventsType, + IdleTimerProvider, + IIdleTimer, + workerTimers, +} from 'react-idle-timer'; + +import { + LAST_SEEN_ONLINE_STORAGE_KEY, + useLogoutDisconnectedUserEffect, +} from './disconnectedUsers'; +import { StillTherePrompt } from './StillTherePrompt'; +import { DefaultTimestampStore, TimestampStore } from './timestampStore'; + +export type AutoLogoutTrackableEvent = EventsType; + +export type AutoLogoutProviderProps = { + /** + * Enable/disable the AutoLogoutMechanism. + * @default true + */ + enabled?: boolean; + /** + * The amount of time (in minutes) of inactivity + * after which the user is automatically logged out. + * @default 60 minutes. + */ + idleTimeoutMinutes?: number; + /** + * The number of seconds before the idleTimeout expires, + * at which the user will be alerted by a Dialog that + * they are about to be logged out. + * @default 10 seconds + */ + promptBeforeIdleSeconds?: number; + /** + * Enable/disable the usage of Node's worker thread timers instead of main thread timers. + * This is helpful if you notice that the your browser is killing inactive tab's timers, like the one used by AutoLogoutProvider. + * If you experience some browser incompatibility, you may try to set this to false. + * @default true. + */ + useWorkerTimers?: boolean; + /** + * List of DOM events that the AutoLogoutProvider will track to determine if the user is active or not. + * @default the default list includes all the needed events for keyboard/pointers/mouse devices. + */ + events?: AutoLogoutTrackableEvent[]; + /** + * Enable/disable the autologout for disconnected users. + * disconnected users are the ones that are logged in but have no Backstage tab open in their browsers. + * If enabled, disconnected users will be automatically logged out after `idleTimeoutMinutes` + * @default true + */ + logoutIfDisconnected?: boolean; +}; + +/** + * The Autologout feature enables platform engineers to add a mechanism to log out users after a configurable amount of time of inactivity. + * When enabled, the mechanism will track user actions (mouse movement, mouse click, key pressing, taps, etc.) in order to determine if they are active or not. + * After a certain amount of inactivity/idle time, the user session is invalidated and they are required to sign in again. + */ +export const AutoLogoutProvider = ({ + children, + enabled = true, + idleTimeoutMinutes = 60, + promptBeforeIdleSeconds = 10, + useWorkerTimers = true, + events = [ + 'mousemove', + 'keydown', + 'wheel', + 'DOMMouseScroll', + 'mousewheel', + 'mousedown', + 'touchstart', + 'touchmove', + 'MSPointerDown', + 'MSPointerMove', + 'visibilitychange', + ], + logoutIfDisconnected = true, +}: PropsWithChildren): JSX.Element => { + const identityApi = useApi(identityApiRef); + + useEffect(() => { + if (idleTimeoutMinutes < 0.5) { + throw new Error( + '❌ idleTimeoutMinutes property should be >= 0.5 minutes (30 seconds).', + ); + } + + if (promptBeforeIdleSeconds < 0) { + throw new Error( + '❌ promptBeforeIdleSeconds property should be >= 0 seconds. Set to 0 to disable the prompt.', + ); + } + + if (idleTimeoutMinutes * 60 <= promptBeforeIdleSeconds) { + throw new Error( + `❌ promptBeforeIdleSeconds should be smaller than idleTimeoutMinutes`, + ); + } + }, [idleTimeoutMinutes, promptBeforeIdleSeconds]); + + const lastSeenOnlineStore: TimestampStore = useMemo( + () => new DefaultTimestampStore(LAST_SEEN_ONLINE_STORAGE_KEY), + [], + ); + const [promptOpen, setPromptOpen] = useState(false); + + const [remainingTimeCountdown, setRemainingTimeCountdown] = + useState(0); + + useLogoutDisconnectedUserEffect({ + enableEffect: logoutIfDisconnected, + autologoutIsEnabled: enabled, + idleTimeoutSeconds: idleTimeoutMinutes * 60, + lastSeenOnlineStore, + identityApi, + }); + + if (!enabled) { + return <>{children}; + } + + const promptBeforeIdleMillis = promptBeforeIdleSeconds * 1000; + const promptBeforeIdle = promptBeforeIdleMillis > 0 ? true : false; + + const onPrompt = () => { + // onPrompt will be called `promptBeforeIdle` milliseconds before `timeout`. + // All events are disabled while the prompt is active. + // If the user wishes to stay active, call the `activate()` method. + // You can get the remaining prompt time with the `getRemainingTime()` method, + setPromptOpen(true); + setRemainingTimeCountdown(promptBeforeIdleMillis); + }; + + const onIdle = () => { + // onIdle will be called after the timeout is reached. + // Events will be rebound as long as `stopOnMount` is not set. + setPromptOpen(false); + setRemainingTimeCountdown(0); + identityApi.signOut(); + }; + + const onActive = () => { + // onActive will only be called if `activate()` is called while `isPrompted()` + // is true. Here you will also want to close your modal and perform + // any active actions. + setPromptOpen(false); + setRemainingTimeCountdown(0); + }; + + const onAction = ( + _event?: Event | undefined, + _idleTimer?: IIdleTimer | null, + ) => { + // onAction will be called if any user event is detected. The list of events that triggers a user event detection is the list of configured events + // If any user event is detected we update the Last seen online in storage + lastSeenOnlineStore.save(new Date()); + }; + + return ( + + {promptBeforeIdle && ( + + )} + {children} + + ); +}; diff --git a/packages/core-components/src/components/AutoLogoutProvider/AutologoutProvider.test.tsx b/packages/core-components/src/components/AutoLogoutProvider/AutologoutProvider.test.tsx new file mode 100644 index 0000000000..204a8ab2cc --- /dev/null +++ b/packages/core-components/src/components/AutoLogoutProvider/AutologoutProvider.test.tsx @@ -0,0 +1,85 @@ +/* + * 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 { createMocks } from 'react-idle-timer'; +// eslint-disable-next-line no-restricted-imports +import { MessageChannel } from 'worker_threads'; +import { ApiProvider } from '@backstage/core-app-api'; +import { identityApiRef } from '@backstage/core-plugin-api'; +import { renderWithEffects, TestApiRegistry } from '@backstage/test-utils'; +import React from 'react'; + +import { AutoLogoutProvider } from './AutoLogoutProvider'; +import { cleanup, render } from '@testing-library/react'; + +// Mock the signOut function of identityApiRef +const mockSignOut = jest.fn(); +const mockIdentityApi = { signOut: mockSignOut }; + +const apis = TestApiRegistry.from([identityApiRef, mockIdentityApi]); + +describe('AutoLogoutProvider', () => { + beforeAll(() => { + createMocks(); + // @ts-ignore + global.MessageChannel = MessageChannel; + }); + + afterAll(cleanup); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('renders children even when enabled is false', async () => { + const { queryByText } = await renderWithEffects( + + +
Test Child
+
+
, + ); + + expect(queryByText('Test Child')).not.toBeNull(); + expect(mockSignOut).not.toHaveBeenCalled(); + }); + + it('should throw error if idleTimeoutMinutes is smaller than promptBeforeSeconds', async () => { + expect(() => + render( + + +
Test Child
+
+
, + ), + ).toThrow(); + }); + + it('should throw error if idleTimeoutMinutes is smaller than 30 seconds', async () => { + expect(() => + render( + + +
Test Child
+
+
, + ), + ).toThrow(); + }); +}); diff --git a/packages/core-components/src/components/AutoLogoutProvider/ConfigBasedAutoLogoutProvider.tsx b/packages/core-components/src/components/AutoLogoutProvider/ConfigBasedAutoLogoutProvider.tsx new file mode 100644 index 0000000000..711cd8f6a3 --- /dev/null +++ b/packages/core-components/src/components/AutoLogoutProvider/ConfigBasedAutoLogoutProvider.tsx @@ -0,0 +1,63 @@ +/* + * 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 { configApiRef, useApi } from '@backstage/core-plugin-api'; +import { PropsWithChildren, useMemo } from 'react'; +import { + AutoLogoutProvider, + AutoLogoutProviderProps, + AutoLogoutTrackableEvent, +} from './AutoLogoutProvider'; +import React from 'react'; + +export type ConfigBasedAutoLogoutProviderProps = {}; + +/** + * A config based flavour of the AutoLogoutProvider. + * It allows to configure Autologout settings through `app-config` + */ +export const ConfigBasedAutoLogoutProvider = ({ + children, +}: PropsWithChildren): JSX.Element => { + const configApi = useApi(configApiRef); + + const props: AutoLogoutProviderProps = useMemo(() => { + return { + enabled: configApi.getOptionalBoolean('auth.autologout.enabled'), + idleTimeoutMinutes: configApi.getOptionalNumber( + 'auth.autologout.idleTimeoutMinutes', + ), + promptBeforeIdleSeconds: configApi.getOptionalNumber( + 'auth.autologout.promptBeforeIdleSeconds', + ), + useWorkerTimers: configApi.getOptionalBoolean( + 'auth.autologout.useWorkerTimers', + ), + events: configApi + .getOptionalStringArray('auth.autologout.events') + ?.map(event => event as AutoLogoutTrackableEvent), + logoutIfDisconnected: configApi.getOptionalBoolean( + 'auth.autologout.logoutIfDisconnected', + ), + }; + }, [configApi]); + + return ( + + {children} + + ); +}; diff --git a/packages/core-components/src/components/AutoLogoutProvider/StillTherePrompt.tsx b/packages/core-components/src/components/AutoLogoutProvider/StillTherePrompt.tsx new file mode 100644 index 0000000000..bbe5759a62 --- /dev/null +++ b/packages/core-components/src/components/AutoLogoutProvider/StillTherePrompt.tsx @@ -0,0 +1,89 @@ +/* + * 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 Button from '@material-ui/core/Button'; +import Dialog from '@material-ui/core/Dialog'; +import DialogActions from '@material-ui/core/DialogActions'; +import DialogContent from '@material-ui/core/DialogContent'; +import DialogContentText from '@material-ui/core/DialogContentText'; +import DialogTitle from '@material-ui/core/DialogTitle'; +import React, { useEffect } from 'react'; +import { useIdleTimerContext } from 'react-idle-timer'; + +export interface StillTherePromptProps { + promptTimeoutMillis: number; + remainingTime: number; + setRemainingTime: (amount: number) => void; + open: boolean; + setOpen: (value: boolean) => void; +} + +export const StillTherePrompt = (props: StillTherePromptProps) => { + const { + setOpen, + open, + promptTimeoutMillis, + remainingTime, + setRemainingTime, + } = props; + const idleTimer = useIdleTimerContext(); + + useEffect(() => { + const interval = setInterval(() => { + setRemainingTime(Math.ceil(idleTimer.getRemainingTime())); + }, 500); + + return () => { + clearInterval(interval); + }; + }, [idleTimer, setRemainingTime]); + + const handleStillHere = () => { + setOpen(false); + idleTimer.activate(); + }; + + const timeTillPrompt = Math.max( + remainingTime - promptTimeoutMillis / 1000, + 0, + ); + const seconds = timeTillPrompt > 1 ? 'seconds' : 'second'; + + return ( + + Logging out due to inactivity + + + You are about to be disconnected in{' '} + + {Math.ceil(remainingTime / 1000)} {seconds} + + . Are you still there? + + + + + + + ); +}; diff --git a/packages/core-components/src/components/AutoLogoutProvider/disconnectedUsers.test.ts b/packages/core-components/src/components/AutoLogoutProvider/disconnectedUsers.test.ts new file mode 100644 index 0000000000..87d6369eda --- /dev/null +++ b/packages/core-components/src/components/AutoLogoutProvider/disconnectedUsers.test.ts @@ -0,0 +1,110 @@ +/* + * 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 { renderHook } from '@testing-library/react-hooks'; +import { act } from 'react-dom/test-utils'; + +import { + useLogoutDisconnectedUserEffect, + UseLogoutDisconnectedUserEffectProps, +} from './disconnectedUsers'; + +const mockIdentityApi = { + signOut: jest.fn(), + getProfileInfo: jest.fn(), + getBackstageIdentity: jest.fn(), + getCredentials: jest.fn(), +}; + +const mockTimestampStore = { + get: jest.fn(), + save: jest.fn(), + delete: jest.fn(), +}; + +describe('useLogoutDisconnectedUserEffect', () => { + it('should not do anything if effect is not enabled', () => { + const props: UseLogoutDisconnectedUserEffectProps = { + enableEffect: false, + autologoutIsEnabled: true, + idleTimeoutSeconds: 300, + lastSeenOnlineStore: mockTimestampStore, + identityApi: mockIdentityApi, + }; + + renderHook(() => useLogoutDisconnectedUserEffect(props)); + + expect(mockTimestampStore.get).not.toHaveBeenCalled(); + expect(mockIdentityApi.signOut).not.toHaveBeenCalled(); + }); + + it('should delete the store if autologout is not enabled', () => { + const props: UseLogoutDisconnectedUserEffectProps = { + enableEffect: true, + autologoutIsEnabled: false, + idleTimeoutSeconds: 300, + lastSeenOnlineStore: mockTimestampStore, + identityApi: mockIdentityApi, + }; + + renderHook(() => useLogoutDisconnectedUserEffect(props)); + + expect(mockTimestampStore.delete).toHaveBeenCalled(); + }); + + it('should call signOut if idle timeout passed', () => { + jest.useFakeTimers(); + + const props: UseLogoutDisconnectedUserEffectProps = { + enableEffect: true, + autologoutIsEnabled: true, + idleTimeoutSeconds: 1, + lastSeenOnlineStore: { + ...mockTimestampStore, + get: jest.fn().mockReturnValue(new Date(Date.now() - 2000)), // 2 seconds before now + }, + identityApi: mockIdentityApi, + }; + + renderHook(() => useLogoutDisconnectedUserEffect(props)); + + act(() => { + jest.advanceTimersByTime(2000); + }); + + expect(mockIdentityApi.signOut).toHaveBeenCalled(); + + jest.useRealTimers(); + }); + + it('should save the current time to the store when app is loaded', () => { + const props: UseLogoutDisconnectedUserEffectProps = { + enableEffect: true, + autologoutIsEnabled: true, + idleTimeoutSeconds: 300, + lastSeenOnlineStore: mockTimestampStore, + identityApi: mockIdentityApi, + }; + + renderHook(() => useLogoutDisconnectedUserEffect(props)); + + expect(mockTimestampStore.get).toHaveBeenCalled(); + expect(mockTimestampStore.save).toHaveBeenCalled(); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); +}); diff --git a/packages/core-components/src/components/AutoLogoutProvider/disconnectedUsers.ts b/packages/core-components/src/components/AutoLogoutProvider/disconnectedUsers.ts new file mode 100644 index 0000000000..c09e272eaa --- /dev/null +++ b/packages/core-components/src/components/AutoLogoutProvider/disconnectedUsers.ts @@ -0,0 +1,72 @@ +/* + * 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 { IdentityApi } from '@backstage/core-plugin-api'; +import { useEffect } from 'react'; + +import { TimestampStore } from './timestampStore'; + +export const LAST_SEEN_ONLINE_STORAGE_KEY = + '@backstage/autologout:lastSeenOnline'; + +export type UseLogoutDisconnectedUserEffectProps = { + enableEffect: boolean; + autologoutIsEnabled: boolean; + idleTimeoutSeconds: number; + lastSeenOnlineStore: TimestampStore; + identityApi: IdentityApi; +}; + +export const useLogoutDisconnectedUserEffect = ({ + enableEffect, + autologoutIsEnabled, + idleTimeoutSeconds, + lastSeenOnlineStore, + identityApi, +}: UseLogoutDisconnectedUserEffectProps) => { + useEffect(() => { + /** + * Considers disconnected users as inactive users. + * If all Backstage tabs are closed and idleTimeoutMinutes are passed then logout the user anyway. + */ + if (autologoutIsEnabled && enableEffect) { + const lastSeenOnline = lastSeenOnlineStore.get(); + if (lastSeenOnline) { + const now = new Date(); + const nowSeconds = Math.ceil(now.getTime() / 1000); + const lastSeenOnlineSeconds = Math.ceil( + lastSeenOnline.getTime() / 1000, + ); + if (nowSeconds - lastSeenOnlineSeconds > idleTimeoutSeconds) { + identityApi.signOut(); + } + } + /** + * save for the first time when app is loaded, so that + * if user logs in and does nothing we still have a + * lastSeenOnline value in store + */ + lastSeenOnlineStore.save(new Date()); + } else { + lastSeenOnlineStore.delete(); + } + }, [ + autologoutIsEnabled, + enableEffect, + identityApi, + idleTimeoutSeconds, + lastSeenOnlineStore, + ]); +}; diff --git a/packages/core-components/src/components/AutoLogoutProvider/index.ts b/packages/core-components/src/components/AutoLogoutProvider/index.ts new file mode 100644 index 0000000000..e80ed7aae0 --- /dev/null +++ b/packages/core-components/src/components/AutoLogoutProvider/index.ts @@ -0,0 +1,22 @@ +import { LAST_SEEN_ONLINE_STORAGE_KEY } from './disconnectedUsers'; + +/* + * 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 './AutoLogoutProvider'; +export * from './ConfigBasedAutoLogoutProvider'; + +export const AUTOLOGOUT_LAST_SEEN_ONLINE_STORAGE_KEY = + LAST_SEEN_ONLINE_STORAGE_KEY; diff --git a/packages/core-components/src/components/AutoLogoutProvider/timestampStore.test.ts b/packages/core-components/src/components/AutoLogoutProvider/timestampStore.test.ts new file mode 100644 index 0000000000..67708b16d9 --- /dev/null +++ b/packages/core-components/src/components/AutoLogoutProvider/timestampStore.test.ts @@ -0,0 +1,55 @@ +/* + * 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 { DefaultTimestampStore, TimestampStore } from './timestampStore'; + +describe('DefaultTimestampStore', () => { + let timestampStore: TimestampStore; + const key = 'test-key'; + const date = new Date(); + + beforeEach(() => { + timestampStore = new DefaultTimestampStore(key); + // Clear the mock storage before each test + localStorage.clear(); + }); + + it('should save the date into the localStorage', () => { + timestampStore.save(date); + expect(localStorage.setItem).toHaveBeenCalledWith(key, date.toJSON()); + expect(localStorage.__STORE__[key]).toBe(date.toJSON()); + }); + + it('should get the date from the localStorage', () => { + localStorage.setItem(key, date.toJSON()); + const retrievedDate = timestampStore.get(); + expect(localStorage.getItem).toHaveBeenCalledWith(key); + expect(retrievedDate).toEqual(date); + }); + + it('should return null if no date is set in the localStorage', () => { + const retrievedDate = timestampStore.get(); + expect(localStorage.getItem).toHaveBeenCalledWith(key); + expect(retrievedDate).toBeNull(); + }); + + it('should delete the date from the localStorage', () => { + localStorage.setItem(key, date.toJSON()); + timestampStore.delete(); + expect(localStorage.removeItem).toHaveBeenCalledWith(key); + expect(localStorage.__STORE__[key]).toBeUndefined(); + }); +}); diff --git a/packages/core-components/src/components/AutoLogoutProvider/timestampStore.ts b/packages/core-components/src/components/AutoLogoutProvider/timestampStore.ts new file mode 100644 index 0000000000..124d44f8e6 --- /dev/null +++ b/packages/core-components/src/components/AutoLogoutProvider/timestampStore.ts @@ -0,0 +1,39 @@ +/* + * 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 interface TimestampStore { + save(date: Date): void; + delete(): void; + get(): Date | null; +} + +export class DefaultTimestampStore implements TimestampStore { + constructor(private readonly key: string) {} + + save(date: Date): void { + localStorage.setItem(this.key, date.toJSON()); + } + + delete(): void { + localStorage.removeItem(this.key); + } + + get(): Date | null { + const timestamp = localStorage.getItem(this.key); + + return timestamp !== null ? new Date(Date.parse(timestamp)) : null; + } +} diff --git a/packages/core-components/src/components/index.ts b/packages/core-components/src/components/index.ts index 0222b82aa4..62bc99ad53 100644 --- a/packages/core-components/src/components/index.ts +++ b/packages/core-components/src/components/index.ts @@ -15,6 +15,7 @@ */ export * from './AlertDisplay'; +export * from './AutoLogoutProvider'; export * from './Avatar'; export * from './LinkButton'; export * from './CodeSnippet'; diff --git a/packages/core-components/src/layout/SignInPage/providers.tsx b/packages/core-components/src/layout/SignInPage/providers.tsx index e456a6948b..3698f4cc4f 100644 --- a/packages/core-components/src/layout/SignInPage/providers.tsx +++ b/packages/core-components/src/layout/SignInPage/providers.tsx @@ -31,6 +31,7 @@ import { commonProvider } from './commonProvider'; import { guestProvider } from './guestProvider'; import { customProvider } from './customProvider'; import { IdentityApiSignOutProxy } from './IdentityApiSignOutProxy'; +import { AUTOLOGOUT_LAST_SEEN_ONLINE_STORAGE_KEY } from '../../components'; const PROVIDER_STORAGE_KEY = '@backstage/core:SignInPage:provider'; @@ -95,6 +96,7 @@ export const useSignInProviders = ( IdentityApiSignOutProxy.from({ identityApi, signOut: async () => { + localStorage.removeItem(AUTOLOGOUT_LAST_SEEN_ONLINE_STORAGE_KEY); localStorage.removeItem(PROVIDER_STORAGE_KEY); await identityApi.signOut?.(); }, diff --git a/yarn.lock b/yarn.lock index 84ad190c8a..726596bb24 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4148,12 +4148,14 @@ __metadata: "@types/zen-observable": ^0.8.0 ansi-regex: ^6.0.1 classnames: ^2.2.6 + cross-fetch: ^3.1.5 d3-selection: ^3.0.0 d3-shape: ^3.0.0 d3-zoom: ^3.0.0 dagre: ^0.8.5 history: ^5.0.0 immer: ^9.0.1 + jest-localstorage-mock: ^2.4.26 linkify-react: 4.1.1 linkifyjs: 4.1.1 lodash: ^4.17.21 @@ -4164,6 +4166,7 @@ __metadata: rc-progress: 3.5.1 react-helmet: 6.1.0 react-hook-form: ^7.12.2 + react-idle-timer: 5.6.2 react-markdown: ^8.0.0 react-sparklines: ^1.7.0 react-syntax-highlighter: ^15.4.5 @@ -30115,6 +30118,13 @@ __metadata: languageName: node linkType: hard +"jest-localstorage-mock@npm:^2.4.26": + version: 2.4.26 + resolution: "jest-localstorage-mock@npm:2.4.26" + checksum: d6871dd030f04bb59c9ef71ce22e98e15e2bc0d77755f5ed466839b891a7a7aae64b6cfc8f942cbef515981c4ff2ae26ad2ccc2f9d1b426c198d0b812ab1831f + languageName: node + linkType: hard + "jest-matcher-utils@npm:^28.1.3": version: 28.1.3 resolution: "jest-matcher-utils@npm:28.1.3" @@ -37367,6 +37377,16 @@ __metadata: languageName: node linkType: hard +"react-idle-timer@npm:5.6.2": + version: 5.6.2 + resolution: "react-idle-timer@npm:5.6.2" + peerDependencies: + react: ">=16" + react-dom: ">=16" + checksum: 23c31be5490be8b22f21ba374e01b751eb845a0e37d077e6369d9a95cf45625ca43b7402f46c53dffaae9e55866920c30f2b1a316e0a9500f73ed91155dd0041 + languageName: node + linkType: hard + "react-immutable-proptypes@npm:2.2.0": version: 2.2.0 resolution: "react-immutable-proptypes@npm:2.2.0" From c00749f921ddd2365862823ec475a4a5342a93d8 Mon Sep 17 00:00:00 2001 From: Manuel Scurti Date: Sun, 11 Jun 2023 00:24:21 +0200 Subject: [PATCH 15/82] fix docs spelling issues Signed-off-by: Manuel Scurti --- docs/auth/autologout.md | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/auth/autologout.md b/docs/auth/autologout.md index 7c1a7468be..dd8efabe10 100644 --- a/docs/auth/autologout.md +++ b/docs/auth/autologout.md @@ -1,28 +1,28 @@ --- id: autologout -title: Autologout +title: Auto Logout # prettier-ignore -description: This section describes how to setup the Autologout mechanism in Backstage +description: This section describes how to setup the Auto Logout mechanism in Backstage --- -This section describes how to setup the Autologout mechanism in Backstage in case your organization needs it. +This section describes how to setup the Auto Logout mechanism in Backstage in case your organization needs it. ## Summary -The Autologout feature is an optional added security to Backstage, designed to automatically log out users after a preconfigured duration of inactivity. This capability helps to effectively mitigate the risks associated with unauthorized access through abandoned sessions, especially in shared device scenarios. +The Auto Logout feature is an optional added security to Backstage, designed to automatically log out users after a preconfigured duration of inactivity. This capability helps to effectively mitigate the risks associated with unauthorized access through abandoned sessions, especially in shared device scenarios. -The Autologout mechanism actively tracks user activity such as mouse movements, clicks, key pressing, and taps. If the system detects no activity over a set time span (idle timeout), it invalidates the user session and redirects to the login page. +The Auto Logout mechanism actively tracks user activity such as mouse movements, clicks, key pressing, and taps. If the system detects no activity over a set time span (idle timeout), it invalidates the user session and redirects to the login page. _Inactive users_ are the ones that don't perform any action on the Backstage app or that are logged in but no Backstage tab is open in the browser. This feature is particularly beneficial if your application should comply with internal policies within your organization that may require automatic logout after a specific period of inactivity. This is how it looks like: -![Autologout Preview](../assets/auth/autologout-preview.png) +![Auto logout Preview](../assets/auth/autologout-preview.png) ## Quick start -To enable and configure Autologout, you will need to add the `` component to your Backstage's instance entry point, located at `App.tsx`. +To enable and configure Auto Logout, you will need to add the `` component to your Backstage's instance entry point, located at `App.tsx`. Here's how to add it: @@ -44,7 +44,7 @@ export default app.createRoot( ## Configuration -You can further adjust the Autologout settings by tweaking the available `` properties: +You can further adjust the Auto Logout settings by tweaking the available `` properties: ```ts ``` -If you prefer to have different settings for each Backstage instance deployed at your infrastructure, you can instead leverage the `` which reads the Autologout settings from `app-config`. +If you prefer to have different settings for each Backstage instance deployed at your infrastructure, you can instead leverage the `` which reads the Auto Logout settings from `app-config`. To do so, adjust your `App.tsx` as follows: @@ -86,11 +86,11 @@ auth: You will now be able to configure the AutoLogoutProvider through your `app-config`. These are the available settings: -| Configuration Key | Component Property | Description | Allowed Values | Default Value | -| ----------------------------------------- | ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `auth.autologout.enabled` | `enabled` | Enable/disable the Autologout feature. | `true`/`false` | `false` | -| `auth.autologout.idleTimeoutMinutes` | `idleTimeoutMinutes` | Sets the idle time (in minutes) after which the user will be logged out. | `>= 0.5` minutes | `60` | -| `auth.autologout.promptBeforeIdleSeconds` | `promptBeforeIdleSeconds` | Determines the time (in seconds) prior to idle state when a prompt will appear. A value of 0 disables the prompt. This must be less than the value of `idleTimeoutMinutes`. | `>= 0` seconds | `10` | -| `auth.autologout.events` | `events` | Specifies the list of events used to detect user activity. | Allowed values are standard [DOM events](https://developer.mozilla.org/en-US/docs/Web/Events) | `'mousemove', 'keydown', 'wheel', 'DOMMouseScroll', 'mousewheel', 'mousedown', 'touchstart' 'touchmove', 'MSPointerDown', 'MSPointerMove', 'visibilitychange'` | -| `auth.autologout.useWorkerTimers` | `useWorkerTimers` | Enables or disables the use of Node's worker thread timers instead of main thread timers. This can be beneficial if the browser is terminating timers in inactive tabs, like those used by Autologout. In case of browser incompatibility, try setting this to false. | `true`/`false` | `true` | -| `auth.autologout.logoutIfDisconnected` | `logoutIfDisconnected` | Enable/disable autologout for disconnected users. Disconnected users are those who are logged in but do not have any active Backstage tabs open in their browsers. If enabled, such users will be automatically logged out after `idleTimeoutMinutes`. | `true`/`false` | `true` | +| Configuration Key | Component Property | Description | Allowed Values | Default Value | +| ----------------------------------------- | ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `auth.autologout.enabled` | `enabled` | Enable/disable the Auto Logout feature. | `true`/`false` | `false` | +| `auth.autologout.idleTimeoutMinutes` | `idleTimeoutMinutes` | Sets the idle time (in minutes) after which the user will be logged out. | `>= 0.5` minutes | `60` | +| `auth.autologout.promptBeforeIdleSeconds` | `promptBeforeIdleSeconds` | Determines the time (in seconds) prior to idle state when a prompt will appear. A value of 0 disables the prompt. This must be less than the value of `idleTimeoutMinutes`. | `>= 0` seconds | `10` | +| `auth.autologout.events` | `events` | Specifies the list of events used to detect user activity. | Allowed values are standard [DOM events](https://developer.mozilla.org/en-US/docs/Web/Events) | `'mousemove', 'keydown', 'wheel', 'DOMMouseScroll', 'mousewheel', 'mousedown', 'touchstart' 'touchmove', 'MSPointerDown', 'MSPointerMove', 'visibilitychange'` | +| `auth.autologout.useWorkerTimers` | `useWorkerTimers` | Enables or disables the use of Node's worker thread timers instead of main thread timers. This can be beneficial if the browser is terminating timers in inactive tabs, like those used by auto logout. In case of browser incompatibility, try setting this to false. | `true`/`false` | `true` | +| `auth.autologout.logoutIfDisconnected` | `logoutIfDisconnected` | Enable/disable auto logout for disconnected users. Disconnected users are those who are logged in but do not have any active Backstage tabs open in their browsers. If enabled, such users will be automatically logged out after `idleTimeoutMinutes`. | `true`/`false` | `true` | From f801c58d3b7c09d2071231d69abfbacac7822f67 Mon Sep 17 00:00:00 2001 From: Manuel Scurti Date: Sun, 11 Jun 2023 00:36:43 +0200 Subject: [PATCH 16/82] updated api-report Signed-off-by: Manuel Scurti --- packages/core-components/api-report.md | 55 ++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/packages/core-components/api-report.md b/packages/core-components/api-report.md index 0aade4549e..daaa640c3a 100644 --- a/packages/core-components/api-report.md +++ b/packages/core-components/api-report.md @@ -20,6 +20,7 @@ import { default as CSS_2 } from 'csstype'; import { CSSProperties } from 'react'; import { ElementType } from 'react'; import { ErrorInfo } from 'react'; +import { EventsType } from 'react-idle-timer'; import { IconComponent } from '@backstage/core-plugin-api'; import { Icons } from '@material-table/core'; import { IdentityApi } from '@backstage/core-plugin-api'; @@ -67,6 +68,42 @@ export type AlertDisplayProps = { transientTimeoutMs?: number; }; +// Warning: (ae-missing-release-tag) "AUTOLOGOUT_LAST_SEEN_ONLINE_STORAGE_KEY" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const AUTOLOGOUT_LAST_SEEN_ONLINE_STORAGE_KEY = + '@backstage/autologout:lastSeenOnline'; + +// Warning: (ae-missing-release-tag) "AutoLogoutProvider" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public +export const AutoLogoutProvider: ({ + children, + enabled, + idleTimeoutMinutes, + promptBeforeIdleSeconds, + useWorkerTimers, + events, + logoutIfDisconnected, +}: PropsWithChildren) => JSX.Element; + +// Warning: (ae-missing-release-tag) "AutoLogoutProviderProps" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type AutoLogoutProviderProps = { + enabled?: boolean; + idleTimeoutMinutes?: number; + promptBeforeIdleSeconds?: number; + useWorkerTimers?: boolean; + events?: AutoLogoutTrackableEvent[]; + logoutIfDisconnected?: boolean; +}; + +// Warning: (ae-missing-release-tag) "AutoLogoutTrackableEvent" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type AutoLogoutTrackableEvent = EventsType; + // @public export function Avatar(props: AvatarProps): React_2.JSX.Element; @@ -165,6 +202,18 @@ export interface CodeSnippetProps { text: string; } +// Warning: (ae-missing-release-tag) "ConfigBasedAutoLogoutProvider" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public +export const ConfigBasedAutoLogoutProvider: ({ + children, +}: PropsWithChildren) => JSX.Element; + +// Warning: (ae-missing-release-tag) "ConfigBasedAutoLogoutProviderProps" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type ConfigBasedAutoLogoutProviderProps = {}; + // Warning: (ae-forgotten-export) The symbol "Props_13" needs to be exported by the entry point index.d.ts // // @public @@ -1501,6 +1550,12 @@ export type WarningPanelClassKey = // Warnings were encountered during analysis: // +// src/components/AutoLogoutProvider/AutoLogoutProvider.d.ts:7:8 - (tsdoc-undefined-tag) The TSDoc tag "@default" is not defined in this configuration +// src/components/AutoLogoutProvider/AutoLogoutProvider.d.ts:13:8 - (tsdoc-undefined-tag) The TSDoc tag "@default" is not defined in this configuration +// src/components/AutoLogoutProvider/AutoLogoutProvider.d.ts:20:8 - (tsdoc-undefined-tag) The TSDoc tag "@default" is not defined in this configuration +// src/components/AutoLogoutProvider/AutoLogoutProvider.d.ts:27:8 - (tsdoc-undefined-tag) The TSDoc tag "@default" is not defined in this configuration +// src/components/AutoLogoutProvider/AutoLogoutProvider.d.ts:32:8 - (tsdoc-undefined-tag) The TSDoc tag "@default" is not defined in this configuration +// src/components/AutoLogoutProvider/AutoLogoutProvider.d.ts:39:8 - (tsdoc-undefined-tag) The TSDoc tag "@default" is not defined in this configuration // src/components/DependencyGraph/types.d.ts:22:9 - (ae-unresolved-link) The @link reference could not be resolved: The package "@backstage/core-components" does not have an export "DependencyNode" // src/components/DependencyGraph/types.d.ts:26:9 - (ae-unresolved-link) The @link reference could not be resolved: The package "@backstage/core-components" does not have an export "DependencyNode" // src/components/TabbedLayout/RoutedTabs.d.ts:9:5 - (ae-forgotten-export) The symbol "SubRoute_2" needs to be exported by the entry point index.d.ts From 5d1f0957f916f3107e8200bc4815db1cf9e8a172 Mon Sep 17 00:00:00 2001 From: Manuel Scurti Date: Sun, 11 Jun 2023 01:14:16 +0200 Subject: [PATCH 17/82] updated docs for exported members Signed-off-by: Manuel Scurti --- .../AutoLogoutProvider/AutoLogoutProvider.tsx | 16 ++++++++++------ .../ConfigBasedAutoLogoutProvider.tsx | 2 ++ .../AutoLogoutProvider/disconnectedUsers.ts | 1 + 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/core-components/src/components/AutoLogoutProvider/AutoLogoutProvider.tsx b/packages/core-components/src/components/AutoLogoutProvider/AutoLogoutProvider.tsx index 4457cab565..073dbb9283 100644 --- a/packages/core-components/src/components/AutoLogoutProvider/AutoLogoutProvider.tsx +++ b/packages/core-components/src/components/AutoLogoutProvider/AutoLogoutProvider.tsx @@ -32,42 +32,45 @@ import { DefaultTimestampStore, TimestampStore } from './timestampStore'; export type AutoLogoutTrackableEvent = EventsType; +/** + * @public + */ export type AutoLogoutProviderProps = { /** * Enable/disable the AutoLogoutMechanism. - * @default true + * defaults to true */ enabled?: boolean; /** * The amount of time (in minutes) of inactivity * after which the user is automatically logged out. - * @default 60 minutes. + * defaults to 60 minutes. */ idleTimeoutMinutes?: number; /** * The number of seconds before the idleTimeout expires, * at which the user will be alerted by a Dialog that * they are about to be logged out. - * @default 10 seconds + * defaults to 10 seconds */ promptBeforeIdleSeconds?: number; /** * Enable/disable the usage of Node's worker thread timers instead of main thread timers. * This is helpful if you notice that the your browser is killing inactive tab's timers, like the one used by AutoLogoutProvider. * If you experience some browser incompatibility, you may try to set this to false. - * @default true. + * defaults to true. */ useWorkerTimers?: boolean; /** * List of DOM events that the AutoLogoutProvider will track to determine if the user is active or not. - * @default the default list includes all the needed events for keyboard/pointers/mouse devices. + * default list includes all the needed events for keyboard/pointers/mouse devices. */ events?: AutoLogoutTrackableEvent[]; /** * Enable/disable the autologout for disconnected users. * disconnected users are the ones that are logged in but have no Backstage tab open in their browsers. * If enabled, disconnected users will be automatically logged out after `idleTimeoutMinutes` - * @default true + * defaults to true */ logoutIfDisconnected?: boolean; }; @@ -76,6 +79,7 @@ export type AutoLogoutProviderProps = { * The Autologout feature enables platform engineers to add a mechanism to log out users after a configurable amount of time of inactivity. * When enabled, the mechanism will track user actions (mouse movement, mouse click, key pressing, taps, etc.) in order to determine if they are active or not. * After a certain amount of inactivity/idle time, the user session is invalidated and they are required to sign in again. + * @public */ export const AutoLogoutProvider = ({ children, diff --git a/packages/core-components/src/components/AutoLogoutProvider/ConfigBasedAutoLogoutProvider.tsx b/packages/core-components/src/components/AutoLogoutProvider/ConfigBasedAutoLogoutProvider.tsx index 711cd8f6a3..af40efcf1c 100644 --- a/packages/core-components/src/components/AutoLogoutProvider/ConfigBasedAutoLogoutProvider.tsx +++ b/packages/core-components/src/components/AutoLogoutProvider/ConfigBasedAutoLogoutProvider.tsx @@ -23,11 +23,13 @@ import { } from './AutoLogoutProvider'; import React from 'react'; +/** @public */ export type ConfigBasedAutoLogoutProviderProps = {}; /** * A config based flavour of the AutoLogoutProvider. * It allows to configure Autologout settings through `app-config` + * @public */ export const ConfigBasedAutoLogoutProvider = ({ children, diff --git a/packages/core-components/src/components/AutoLogoutProvider/disconnectedUsers.ts b/packages/core-components/src/components/AutoLogoutProvider/disconnectedUsers.ts index c09e272eaa..9920612794 100644 --- a/packages/core-components/src/components/AutoLogoutProvider/disconnectedUsers.ts +++ b/packages/core-components/src/components/AutoLogoutProvider/disconnectedUsers.ts @@ -18,6 +18,7 @@ import { useEffect } from 'react'; import { TimestampStore } from './timestampStore'; +/** @public */ export const LAST_SEEN_ONLINE_STORAGE_KEY = '@backstage/autologout:lastSeenOnline'; From 926a65b611240bd0af5ef19f9b421bedfc5b6480 Mon Sep 17 00:00:00 2001 From: Manuel Scurti Date: Sun, 11 Jun 2023 01:29:57 +0200 Subject: [PATCH 18/82] fixed api-report Signed-off-by: Manuel Scurti --- packages/core-components/api-report.md | 18 ------------------ .../AutoLogoutProvider/AutoLogoutProvider.tsx | 6 +++--- .../ConfigBasedAutoLogoutProvider.tsx | 1 + .../src/components/AutoLogoutProvider/index.ts | 1 + 4 files changed, 5 insertions(+), 21 deletions(-) diff --git a/packages/core-components/api-report.md b/packages/core-components/api-report.md index daaa640c3a..fa4d440031 100644 --- a/packages/core-components/api-report.md +++ b/packages/core-components/api-report.md @@ -68,14 +68,10 @@ export type AlertDisplayProps = { transientTimeoutMs?: number; }; -// Warning: (ae-missing-release-tag) "AUTOLOGOUT_LAST_SEEN_ONLINE_STORAGE_KEY" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export const AUTOLOGOUT_LAST_SEEN_ONLINE_STORAGE_KEY = '@backstage/autologout:lastSeenOnline'; -// Warning: (ae-missing-release-tag) "AutoLogoutProvider" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public export const AutoLogoutProvider: ({ children, @@ -87,8 +83,6 @@ export const AutoLogoutProvider: ({ logoutIfDisconnected, }: PropsWithChildren) => JSX.Element; -// Warning: (ae-missing-release-tag) "AutoLogoutProviderProps" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export type AutoLogoutProviderProps = { enabled?: boolean; @@ -99,8 +93,6 @@ export type AutoLogoutProviderProps = { logoutIfDisconnected?: boolean; }; -// Warning: (ae-missing-release-tag) "AutoLogoutTrackableEvent" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export type AutoLogoutTrackableEvent = EventsType; @@ -202,15 +194,11 @@ export interface CodeSnippetProps { text: string; } -// Warning: (ae-missing-release-tag) "ConfigBasedAutoLogoutProvider" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public export const ConfigBasedAutoLogoutProvider: ({ children, }: PropsWithChildren) => JSX.Element; -// Warning: (ae-missing-release-tag) "ConfigBasedAutoLogoutProviderProps" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export type ConfigBasedAutoLogoutProviderProps = {}; @@ -1550,12 +1538,6 @@ export type WarningPanelClassKey = // Warnings were encountered during analysis: // -// src/components/AutoLogoutProvider/AutoLogoutProvider.d.ts:7:8 - (tsdoc-undefined-tag) The TSDoc tag "@default" is not defined in this configuration -// src/components/AutoLogoutProvider/AutoLogoutProvider.d.ts:13:8 - (tsdoc-undefined-tag) The TSDoc tag "@default" is not defined in this configuration -// src/components/AutoLogoutProvider/AutoLogoutProvider.d.ts:20:8 - (tsdoc-undefined-tag) The TSDoc tag "@default" is not defined in this configuration -// src/components/AutoLogoutProvider/AutoLogoutProvider.d.ts:27:8 - (tsdoc-undefined-tag) The TSDoc tag "@default" is not defined in this configuration -// src/components/AutoLogoutProvider/AutoLogoutProvider.d.ts:32:8 - (tsdoc-undefined-tag) The TSDoc tag "@default" is not defined in this configuration -// src/components/AutoLogoutProvider/AutoLogoutProvider.d.ts:39:8 - (tsdoc-undefined-tag) The TSDoc tag "@default" is not defined in this configuration // src/components/DependencyGraph/types.d.ts:22:9 - (ae-unresolved-link) The @link reference could not be resolved: The package "@backstage/core-components" does not have an export "DependencyNode" // src/components/DependencyGraph/types.d.ts:26:9 - (ae-unresolved-link) The @link reference could not be resolved: The package "@backstage/core-components" does not have an export "DependencyNode" // src/components/TabbedLayout/RoutedTabs.d.ts:9:5 - (ae-forgotten-export) The symbol "SubRoute_2" needs to be exported by the entry point index.d.ts diff --git a/packages/core-components/src/components/AutoLogoutProvider/AutoLogoutProvider.tsx b/packages/core-components/src/components/AutoLogoutProvider/AutoLogoutProvider.tsx index 073dbb9283..44c79cc4d7 100644 --- a/packages/core-components/src/components/AutoLogoutProvider/AutoLogoutProvider.tsx +++ b/packages/core-components/src/components/AutoLogoutProvider/AutoLogoutProvider.tsx @@ -30,11 +30,10 @@ import { import { StillTherePrompt } from './StillTherePrompt'; import { DefaultTimestampStore, TimestampStore } from './timestampStore'; +/** @public */ export type AutoLogoutTrackableEvent = EventsType; -/** - * @public - */ +/** @public */ export type AutoLogoutProviderProps = { /** * Enable/disable the AutoLogoutMechanism. @@ -79,6 +78,7 @@ export type AutoLogoutProviderProps = { * The Autologout feature enables platform engineers to add a mechanism to log out users after a configurable amount of time of inactivity. * When enabled, the mechanism will track user actions (mouse movement, mouse click, key pressing, taps, etc.) in order to determine if they are active or not. * After a certain amount of inactivity/idle time, the user session is invalidated and they are required to sign in again. + * * @public */ export const AutoLogoutProvider = ({ diff --git a/packages/core-components/src/components/AutoLogoutProvider/ConfigBasedAutoLogoutProvider.tsx b/packages/core-components/src/components/AutoLogoutProvider/ConfigBasedAutoLogoutProvider.tsx index af40efcf1c..1eceedaa3b 100644 --- a/packages/core-components/src/components/AutoLogoutProvider/ConfigBasedAutoLogoutProvider.tsx +++ b/packages/core-components/src/components/AutoLogoutProvider/ConfigBasedAutoLogoutProvider.tsx @@ -29,6 +29,7 @@ export type ConfigBasedAutoLogoutProviderProps = {}; /** * A config based flavour of the AutoLogoutProvider. * It allows to configure Autologout settings through `app-config` + * * @public */ export const ConfigBasedAutoLogoutProvider = ({ diff --git a/packages/core-components/src/components/AutoLogoutProvider/index.ts b/packages/core-components/src/components/AutoLogoutProvider/index.ts index e80ed7aae0..158c6a0ea4 100644 --- a/packages/core-components/src/components/AutoLogoutProvider/index.ts +++ b/packages/core-components/src/components/AutoLogoutProvider/index.ts @@ -18,5 +18,6 @@ import { LAST_SEEN_ONLINE_STORAGE_KEY } from './disconnectedUsers'; export * from './AutoLogoutProvider'; export * from './ConfigBasedAutoLogoutProvider'; +/** @public */ export const AUTOLOGOUT_LAST_SEEN_ONLINE_STORAGE_KEY = LAST_SEEN_ONLINE_STORAGE_KEY; From 8a453e15bb6b712eb1f8bc82bbbc8795b903acd9 Mon Sep 17 00:00:00 2001 From: Manuel Scurti Date: Tue, 13 Jun 2023 12:45:01 +0200 Subject: [PATCH 19/82] autologout docs fixes Signed-off-by: Manuel Scurti --- docs/auth/autologout.md | 2 +- microsite/sidebars.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/auth/autologout.md b/docs/auth/autologout.md index dd8efabe10..2ba42fa1dc 100644 --- a/docs/auth/autologout.md +++ b/docs/auth/autologout.md @@ -88,7 +88,7 @@ You will now be able to configure the AutoLogoutProvider through your `app-confi | Configuration Key | Component Property | Description | Allowed Values | Default Value | | ----------------------------------------- | ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `auth.autologout.enabled` | `enabled` | Enable/disable the Auto Logout feature. | `true`/`false` | `false` | +| `auth.autologout.enabled` | `enabled` | Enable/disable the Auto Logout feature. | `true`/`false` | With `` default is enabled (`true`). With `` default is disabled (`false`) | | `auth.autologout.idleTimeoutMinutes` | `idleTimeoutMinutes` | Sets the idle time (in minutes) after which the user will be logged out. | `>= 0.5` minutes | `60` | | `auth.autologout.promptBeforeIdleSeconds` | `promptBeforeIdleSeconds` | Determines the time (in seconds) prior to idle state when a prompt will appear. A value of 0 disables the prompt. This must be less than the value of `idleTimeoutMinutes`. | `>= 0` seconds | `10` | | `auth.autologout.events` | `events` | Specifies the list of events used to detect user activity. | Allowed values are standard [DOM events](https://developer.mozilla.org/en-US/docs/Web/Events) | `'mousemove', 'keydown', 'wheel', 'DOMMouseScroll', 'mousewheel', 'mousedown', 'touchstart' 'touchmove', 'MSPointerDown', 'MSPointerMove', 'visibilitychange'` | diff --git a/microsite/sidebars.json b/microsite/sidebars.json index 0e73bd94f2..ea7f9f5f5f 100644 --- a/microsite/sidebars.json +++ b/microsite/sidebars.json @@ -303,6 +303,7 @@ "auth/oidc", "auth/add-auth-provider", "auth/service-to-service-auth", + "auth/autologout", "auth/troubleshooting", "auth/glossary" ], From 212db9bb6c48b9b83ece061f9a6b51a17de6ff0f Mon Sep 17 00:00:00 2001 From: Manuel Scurti Date: Tue, 13 Jun 2023 12:46:02 +0200 Subject: [PATCH 20/82] lastSeenOnline storage key is internal Signed-off-by: Manuel Scurti --- packages/core-components/api-report.md | 4 ---- .../src/components/AutoLogoutProvider/disconnectedUsers.ts | 1 - .../src/components/AutoLogoutProvider/index.ts | 7 ++----- .../core-components/src/layout/SignInPage/providers.tsx | 4 ++-- 4 files changed, 4 insertions(+), 12 deletions(-) diff --git a/packages/core-components/api-report.md b/packages/core-components/api-report.md index fa4d440031..388282a854 100644 --- a/packages/core-components/api-report.md +++ b/packages/core-components/api-report.md @@ -68,10 +68,6 @@ export type AlertDisplayProps = { transientTimeoutMs?: number; }; -// @public (undocumented) -export const AUTOLOGOUT_LAST_SEEN_ONLINE_STORAGE_KEY = - '@backstage/autologout:lastSeenOnline'; - // @public export const AutoLogoutProvider: ({ children, diff --git a/packages/core-components/src/components/AutoLogoutProvider/disconnectedUsers.ts b/packages/core-components/src/components/AutoLogoutProvider/disconnectedUsers.ts index 9920612794..c09e272eaa 100644 --- a/packages/core-components/src/components/AutoLogoutProvider/disconnectedUsers.ts +++ b/packages/core-components/src/components/AutoLogoutProvider/disconnectedUsers.ts @@ -18,7 +18,6 @@ import { useEffect } from 'react'; import { TimestampStore } from './timestampStore'; -/** @public */ export const LAST_SEEN_ONLINE_STORAGE_KEY = '@backstage/autologout:lastSeenOnline'; diff --git a/packages/core-components/src/components/AutoLogoutProvider/index.ts b/packages/core-components/src/components/AutoLogoutProvider/index.ts index 158c6a0ea4..600e3566d1 100644 --- a/packages/core-components/src/components/AutoLogoutProvider/index.ts +++ b/packages/core-components/src/components/AutoLogoutProvider/index.ts @@ -1,5 +1,3 @@ -import { LAST_SEEN_ONLINE_STORAGE_KEY } from './disconnectedUsers'; - /* * Copyright 2023 The Backstage Authors * @@ -18,6 +16,5 @@ import { LAST_SEEN_ONLINE_STORAGE_KEY } from './disconnectedUsers'; export * from './AutoLogoutProvider'; export * from './ConfigBasedAutoLogoutProvider'; -/** @public */ -export const AUTOLOGOUT_LAST_SEEN_ONLINE_STORAGE_KEY = - LAST_SEEN_ONLINE_STORAGE_KEY; +/** @internal */ +export { LAST_SEEN_ONLINE_STORAGE_KEY } from './disconnectedUsers'; diff --git a/packages/core-components/src/layout/SignInPage/providers.tsx b/packages/core-components/src/layout/SignInPage/providers.tsx index 3698f4cc4f..b4f3fa386f 100644 --- a/packages/core-components/src/layout/SignInPage/providers.tsx +++ b/packages/core-components/src/layout/SignInPage/providers.tsx @@ -31,7 +31,7 @@ import { commonProvider } from './commonProvider'; import { guestProvider } from './guestProvider'; import { customProvider } from './customProvider'; import { IdentityApiSignOutProxy } from './IdentityApiSignOutProxy'; -import { AUTOLOGOUT_LAST_SEEN_ONLINE_STORAGE_KEY } from '../../components'; +import { LAST_SEEN_ONLINE_STORAGE_KEY } from '../../components'; const PROVIDER_STORAGE_KEY = '@backstage/core:SignInPage:provider'; @@ -96,7 +96,7 @@ export const useSignInProviders = ( IdentityApiSignOutProxy.from({ identityApi, signOut: async () => { - localStorage.removeItem(AUTOLOGOUT_LAST_SEEN_ONLINE_STORAGE_KEY); + localStorage.removeItem(LAST_SEEN_ONLINE_STORAGE_KEY); localStorage.removeItem(PROVIDER_STORAGE_KEY); await identityApi.signOut?.(); }, From 60a19896f0903cfc64617a3fc23ddab1a5d13926 Mon Sep 17 00:00:00 2001 From: Manuel Scurti Date: Fri, 16 Jun 2023 14:38:05 +0200 Subject: [PATCH 21/82] removed useless export of autologout storage key Signed-off-by: Manuel Scurti --- .../core-components/src/components/AutoLogoutProvider/index.ts | 3 --- packages/core-components/src/layout/SignInPage/providers.tsx | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/core-components/src/components/AutoLogoutProvider/index.ts b/packages/core-components/src/components/AutoLogoutProvider/index.ts index 600e3566d1..2b9d0e9738 100644 --- a/packages/core-components/src/components/AutoLogoutProvider/index.ts +++ b/packages/core-components/src/components/AutoLogoutProvider/index.ts @@ -15,6 +15,3 @@ */ export * from './AutoLogoutProvider'; export * from './ConfigBasedAutoLogoutProvider'; - -/** @internal */ -export { LAST_SEEN_ONLINE_STORAGE_KEY } from './disconnectedUsers'; diff --git a/packages/core-components/src/layout/SignInPage/providers.tsx b/packages/core-components/src/layout/SignInPage/providers.tsx index b4f3fa386f..d72f26e53f 100644 --- a/packages/core-components/src/layout/SignInPage/providers.tsx +++ b/packages/core-components/src/layout/SignInPage/providers.tsx @@ -31,7 +31,7 @@ import { commonProvider } from './commonProvider'; import { guestProvider } from './guestProvider'; import { customProvider } from './customProvider'; import { IdentityApiSignOutProxy } from './IdentityApiSignOutProxy'; -import { LAST_SEEN_ONLINE_STORAGE_KEY } from '../../components'; +import { LAST_SEEN_ONLINE_STORAGE_KEY } from '../../components/AutoLogoutProvider/disconnectedUsers'; const PROVIDER_STORAGE_KEY = '@backstage/core:SignInPage:provider'; From 1bfb54bbaade23fa32b1cf98c785c47945731d8a Mon Sep 17 00:00:00 2001 From: Manuel Scurti Date: Wed, 6 Sep 2023 18:25:29 +0200 Subject: [PATCH 22/82] removed ConfigBasedAutoLogoutProvider Signed-off-by: Manuel Scurti --- docs/auth/autologout.md | 53 +--- packages/core-components/config.d.ts | 7 - packages/core-components/package.json | 8 +- .../AutoLogout.tsx} | 277 ++++++++++++------ .../Autologout.test.tsx} | 29 +- .../StillTherePrompt.tsx | 7 +- .../disconnectedUsers.test.ts | 0 .../disconnectedUsers.ts | 0 .../index.ts | 3 +- .../timestampStore.test.ts | 0 .../timestampStore.ts | 0 .../ConfigBasedAutoLogoutProvider.tsx | 66 ----- .../core-components/src/components/index.ts | 2 +- .../src/layout/SignInPage/providers.tsx | 2 +- packages/core-components/src/setupTests.ts | 1 + 15 files changed, 216 insertions(+), 239 deletions(-) rename packages/core-components/src/components/{AutoLogoutProvider/AutoLogoutProvider.tsx => AutoLogout/AutoLogout.tsx} (57%) rename packages/core-components/src/components/{AutoLogoutProvider/AutologoutProvider.test.tsx => AutoLogout/Autologout.test.tsx} (72%) rename packages/core-components/src/components/{AutoLogoutProvider => AutoLogout}/StillTherePrompt.tsx (94%) rename packages/core-components/src/components/{AutoLogoutProvider => AutoLogout}/disconnectedUsers.test.ts (100%) rename packages/core-components/src/components/{AutoLogoutProvider => AutoLogout}/disconnectedUsers.ts (100%) rename packages/core-components/src/components/{AutoLogoutProvider => AutoLogout}/index.ts (87%) rename packages/core-components/src/components/{AutoLogoutProvider => AutoLogout}/timestampStore.test.ts (100%) rename packages/core-components/src/components/{AutoLogoutProvider => AutoLogout}/timestampStore.ts (100%) delete mode 100644 packages/core-components/src/components/AutoLogoutProvider/ConfigBasedAutoLogoutProvider.tsx diff --git a/docs/auth/autologout.md b/docs/auth/autologout.md index 2ba42fa1dc..1c20f3f613 100644 --- a/docs/auth/autologout.md +++ b/docs/auth/autologout.md @@ -22,7 +22,7 @@ This is how it looks like: ## Quick start -To enable and configure Auto Logout, you will need to add the `` component to your Backstage's instance entry point, located at `App.tsx`. +To enable and configure Auto Logout, you will need to add the `` component to your Backstage's instance entry point, located at `App.tsx`. Here's how to add it: @@ -34,9 +34,10 @@ import { AutoLogoutProvider } from '@backstage/core-components'; export default app.createRoot( <> // ... - + + {routes} - + // ... , ); @@ -44,39 +45,17 @@ export default app.createRoot( ## Configuration -You can further adjust the Auto Logout settings by tweaking the available `` properties: +You can further adjust the Auto Logout settings by tweaking the available `` properties: ```ts - - {routes} - +/> ``` -If you prefer to have different settings for each Backstage instance deployed at your infrastructure, you can instead leverage the `` which reads the Auto Logout settings from `app-config`. - -To do so, adjust your `App.tsx` as follows: - -```ts -import { ConfigBasedAutoLogoutProvider } from '@backstage/core-components'; - -// ... App.tsx contents - -export default app.createRoot( - <> - // ... - - {routes} - - // ... - , -); -``` - -And add these lines into your `app-config`: +If you prefer to have different settings for each Backstage instance deployed at your infrastructure, you can instead leverage your `app-config` and place some configuration properties: ```yaml auth: @@ -84,13 +63,13 @@ auth: enabled: true ``` +Bear in mind that, in case the same property is found both in the `` component and the `app-config` file then the properties set in the React component take precedence over configuration properties found inside your `app-config`. You will now be able to configure the AutoLogoutProvider through your `app-config`. These are the available settings: -| Configuration Key | Component Property | Description | Allowed Values | Default Value | -| ----------------------------------------- | ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `auth.autologout.enabled` | `enabled` | Enable/disable the Auto Logout feature. | `true`/`false` | With `` default is enabled (`true`). With `` default is disabled (`false`) | -| `auth.autologout.idleTimeoutMinutes` | `idleTimeoutMinutes` | Sets the idle time (in minutes) after which the user will be logged out. | `>= 0.5` minutes | `60` | -| `auth.autologout.promptBeforeIdleSeconds` | `promptBeforeIdleSeconds` | Determines the time (in seconds) prior to idle state when a prompt will appear. A value of 0 disables the prompt. This must be less than the value of `idleTimeoutMinutes`. | `>= 0` seconds | `10` | -| `auth.autologout.events` | `events` | Specifies the list of events used to detect user activity. | Allowed values are standard [DOM events](https://developer.mozilla.org/en-US/docs/Web/Events) | `'mousemove', 'keydown', 'wheel', 'DOMMouseScroll', 'mousewheel', 'mousedown', 'touchstart' 'touchmove', 'MSPointerDown', 'MSPointerMove', 'visibilitychange'` | -| `auth.autologout.useWorkerTimers` | `useWorkerTimers` | Enables or disables the use of Node's worker thread timers instead of main thread timers. This can be beneficial if the browser is terminating timers in inactive tabs, like those used by auto logout. In case of browser incompatibility, try setting this to false. | `true`/`false` | `true` | -| `auth.autologout.logoutIfDisconnected` | `logoutIfDisconnected` | Enable/disable auto logout for disconnected users. Disconnected users are those who are logged in but do not have any active Backstage tabs open in their browsers. If enabled, such users will be automatically logged out after `idleTimeoutMinutes`. | `true`/`false` | `true` | +| Configuration Key | Component Property | Description | Allowed Values | Default Value | +| ----------------------------------------- | ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------- | +| `auth.autologout.enabled` | `enabled` | Enable/disable the Auto Logout feature. | `true`/`false` | With `` default is enabled (`true`). With `` default is disabled (`false`) | +| `auth.autologout.idleTimeoutMinutes` | `idleTimeoutMinutes` | Sets the idle time (in minutes) after which the user will be logged out. | `>= 0.5` minutes | `60` | +| `auth.autologout.promptBeforeIdleSeconds` | `promptBeforeIdleSeconds` | Determines the time (in seconds) prior to idle state when a prompt will appear. A value of 0 disables the prompt. This must be less than the value of `idleTimeoutMinutes`. | `>= 0` seconds | `10` | +| `auth.autologout.useWorkerTimers` | `useWorkerTimers` | Enables or disables the use of Node's worker thread timers instead of main thread timers. This can be beneficial if the browser is terminating timers in inactive tabs, like those used by auto logout. In case of browser incompatibility, try setting this to false. | `true`/`false` | `true` | +| `auth.autologout.logoutIfDisconnected` | `logoutIfDisconnected` | Enable/disable auto logout for disconnected users. Disconnected users are those who are logged in but do not have any active Backstage tabs open in their browsers. If enabled, such users will be automatically logged out after `idleTimeoutMinutes`. | `true`/`false` | `true` | diff --git a/packages/core-components/config.d.ts b/packages/core-components/config.d.ts index a10d84f232..fac678ef2a 100644 --- a/packages/core-components/config.d.ts +++ b/packages/core-components/config.d.ts @@ -49,13 +49,6 @@ export interface Config { */ useWorkerTimers?: boolean; - /** - * List of events that the autologout event listener will catch to detect if the user is active - * These events are standard DOM events. - * @visibility frontend - */ - events?: string[]; - /** * Enable/disable the automatic logout also on users that are logged in but with no Backstage tabs open. * Default is true. diff --git a/packages/core-components/package.json b/packages/core-components/package.json index a25999c2b3..202d558e46 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -110,11 +110,5 @@ "dist", "config.d.ts" ], - "configSchema": "config.d.ts", - "jest": { - "resetMocks": false, - "setupFiles": [ - "jest-localstorage-mock" - ] - } + "configSchema": "config.d.ts" } diff --git a/packages/core-components/src/components/AutoLogoutProvider/AutoLogoutProvider.tsx b/packages/core-components/src/components/AutoLogout/AutoLogout.tsx similarity index 57% rename from packages/core-components/src/components/AutoLogoutProvider/AutoLogoutProvider.tsx rename to packages/core-components/src/components/AutoLogout/AutoLogout.tsx index 44c79cc4d7..abb898a0f2 100644 --- a/packages/core-components/src/components/AutoLogoutProvider/AutoLogoutProvider.tsx +++ b/packages/core-components/src/components/AutoLogout/AutoLogout.tsx @@ -14,13 +14,19 @@ * limitations under the License. */ -import { identityApiRef, useApi } from '@backstage/core-plugin-api'; -import React, { PropsWithChildren, useEffect, useMemo, useState } from 'react'; +import { + ConfigApi, + configApiRef, + IdentityApi, + identityApiRef, + useApi, +} from '@backstage/core-plugin-api'; +import React, { useEffect, useMemo, useState } from 'react'; import { EventsType, - IdleTimerProvider, IIdleTimer, workerTimers, + useIdleTimer, } from 'react-idle-timer'; import { @@ -34,10 +40,10 @@ import { DefaultTimestampStore, TimestampStore } from './timestampStore'; export type AutoLogoutTrackableEvent = EventsType; /** @public */ -export type AutoLogoutProviderProps = { +export type AutoLogoutProps = { /** * Enable/disable the AutoLogoutMechanism. - * defaults to true + * defauls to true. */ enabled?: boolean; /** @@ -60,11 +66,6 @@ export type AutoLogoutProviderProps = { * defaults to true. */ useWorkerTimers?: boolean; - /** - * List of DOM events that the AutoLogoutProvider will track to determine if the user is active or not. - * default list includes all the needed events for keyboard/pointers/mouse devices. - */ - events?: AutoLogoutTrackableEvent[]; /** * Enable/disable the autologout for disconnected users. * disconnected users are the ones that are logged in but have no Backstage tab open in their browsers. @@ -74,6 +75,153 @@ export type AutoLogoutProviderProps = { logoutIfDisconnected?: boolean; }; +type AutoLogoutInternalProps = Omit, 'enabled'> & { + events: AutoLogoutTrackableEvent[]; + promptOpen: boolean; + setPromptOpen: (value: boolean) => void; + remainingTimeCountdown: number; + setRemainingTimeCountdown: (amount: number) => void; + identityApi: IdentityApi; + lastSeenOnlineStore: TimestampStore; +}; + +const ConditionalAutoLogout = ({ + idleTimeoutMinutes, + events, + useWorkerTimers, + logoutIfDisconnected, + promptBeforeIdleSeconds, + promptOpen, + setPromptOpen, + remainingTimeCountdown, + setRemainingTimeCountdown, + identityApi, + lastSeenOnlineStore, +}: AutoLogoutInternalProps): JSX.Element => { + const promptBeforeIdleMillis = promptBeforeIdleSeconds * 1000; + const promptBeforeIdle = promptBeforeIdleMillis > 0 ? true : false; + + const onPrompt = () => { + // onPrompt will be called `promptBeforeIdle` milliseconds before `timeout`. + // All events are disabled while the prompt is active. + // If the user wishes to stay active, call the `activate()` method. + // You can get the remaining prompt time with the `getRemainingTime()` method, + setPromptOpen(true); + setRemainingTimeCountdown(promptBeforeIdleMillis); + }; + + const onIdle = () => { + // onIdle will be called after the timeout is reached. + // Events will be rebound as long as `stopOnMount` is not set. + setPromptOpen(false); + setRemainingTimeCountdown(0); + identityApi.signOut(); + }; + + const onActive = () => { + // onActive will only be called if `activate()` is called while `isPrompted()` + // is true. Here you will also want to close your modal and perform + // any active actions. + setPromptOpen(false); + setRemainingTimeCountdown(0); + }; + + const onAction = ( + _event?: Event | undefined, + _idleTimer?: IIdleTimer | null, + ) => { + // onAction will be called if any user event is detected. The list of events that triggers a user event detection is the list of configured events + // If any user event is detected we update the Last seen online in storage + lastSeenOnlineStore.save(new Date()); + }; + + const timer = useIdleTimer({ + timeout: idleTimeoutMinutes * 60 * 1000, + events: events, + crossTab: true, + name: 'autologout-timer', + timers: useWorkerTimers ? workerTimers : undefined, + onIdle: onIdle, + onActive: promptBeforeIdle ? onActive : undefined, + onAction: logoutIfDisconnected ? onAction : undefined, + onPrompt: promptBeforeIdle ? onPrompt : undefined, + promptBeforeIdle: promptBeforeIdle ? promptBeforeIdleMillis : undefined, + syncTimers: 1000, + }); + + return ( + <> + {promptBeforeIdle && ( + + )} + + ); +}; + +const defaultConfig: Required = { + enabled: true, + idleTimeoutMinutes: 0.5, + promptBeforeIdleSeconds: 10, + useWorkerTimers: true, + logoutIfDisconnected: true, +}; + +/** + * A list of DOM events that the activity tracker will use to determine if the user is active or not. + */ +const defaultTrackedEvents: AutoLogoutTrackableEvent[] = [ + 'mousemove', + 'keydown', + 'wheel', + 'DOMMouseScroll', + 'mousewheel', + 'mousedown', + 'touchstart', + 'touchmove', + 'MSPointerDown', + 'MSPointerMove', + 'visibilitychange', +]; + +/** + * Parses configuration for the AutoLogout. Properties configured in `app-config` take precedence over the props passed to the React component. + * If neither props nor config properties are found, a default value will be set accordingly. + */ +const parseConfig = ( + configApi: ConfigApi, + props: AutoLogoutProps, +): Required => { + return { + enabled: + configApi.getOptionalBoolean('auth.autologout.enabled') ?? + props.enabled ?? + defaultConfig.enabled, + idleTimeoutMinutes: + configApi.getOptionalNumber('auth.autologout.idleTimeoutMinutes') ?? + props.idleTimeoutMinutes ?? + defaultConfig.idleTimeoutMinutes, + promptBeforeIdleSeconds: + configApi.getOptionalNumber('auth.autologout.promptBeforeIdleSeconds') ?? + props.promptBeforeIdleSeconds ?? + defaultConfig.promptBeforeIdleSeconds, + useWorkerTimers: + configApi.getOptionalBoolean('auth.autologout.useWorkerTimers') ?? + props.useWorkerTimers ?? + defaultConfig.useWorkerTimers, + logoutIfDisconnected: + configApi.getOptionalBoolean('auth.autologout.logoutIfDisconnected') ?? + props.logoutIfDisconnected ?? + defaultConfig.logoutIfDisconnected, + }; +}; + /** * The Autologout feature enables platform engineers to add a mechanism to log out users after a configurable amount of time of inactivity. * When enabled, the mechanism will track user actions (mouse movement, mouse click, key pressing, taps, etc.) in order to determine if they are active or not. @@ -81,28 +229,19 @@ export type AutoLogoutProviderProps = { * * @public */ -export const AutoLogoutProvider = ({ - children, - enabled = true, - idleTimeoutMinutes = 60, - promptBeforeIdleSeconds = 10, - useWorkerTimers = true, - events = [ - 'mousemove', - 'keydown', - 'wheel', - 'DOMMouseScroll', - 'mousewheel', - 'mousedown', - 'touchstart', - 'touchmove', - 'MSPointerDown', - 'MSPointerMove', - 'visibilitychange', - ], - logoutIfDisconnected = true, -}: PropsWithChildren): JSX.Element => { +export const AutoLogout = (props: AutoLogoutProps): JSX.Element => { const identityApi = useApi(identityApiRef); + const configApi = useApi(configApiRef); + + const { + enabled, + idleTimeoutMinutes, + promptBeforeIdleSeconds, + logoutIfDisconnected, + useWorkerTimers, + }: AutoLogoutProps = useMemo(() => { + return parseConfig(configApi, props); + }, [configApi, props]); useEffect(() => { if (idleTimeoutMinutes < 0.5) { @@ -142,70 +281,22 @@ export const AutoLogoutProvider = ({ }); if (!enabled) { - return <>{children}; + return <>; } - const promptBeforeIdleMillis = promptBeforeIdleSeconds * 1000; - const promptBeforeIdle = promptBeforeIdleMillis > 0 ? true : false; - - const onPrompt = () => { - // onPrompt will be called `promptBeforeIdle` milliseconds before `timeout`. - // All events are disabled while the prompt is active. - // If the user wishes to stay active, call the `activate()` method. - // You can get the remaining prompt time with the `getRemainingTime()` method, - setPromptOpen(true); - setRemainingTimeCountdown(promptBeforeIdleMillis); - }; - - const onIdle = () => { - // onIdle will be called after the timeout is reached. - // Events will be rebound as long as `stopOnMount` is not set. - setPromptOpen(false); - setRemainingTimeCountdown(0); - identityApi.signOut(); - }; - - const onActive = () => { - // onActive will only be called if `activate()` is called while `isPrompted()` - // is true. Here you will also want to close your modal and perform - // any active actions. - setPromptOpen(false); - setRemainingTimeCountdown(0); - }; - - const onAction = ( - _event?: Event | undefined, - _idleTimer?: IIdleTimer | null, - ) => { - // onAction will be called if any user event is detected. The list of events that triggers a user event detection is the list of configured events - // If any user event is detected we update the Last seen online in storage - lastSeenOnlineStore.save(new Date()); - }; - return ( - - {promptBeforeIdle && ( - - )} - {children} - + ); }; diff --git a/packages/core-components/src/components/AutoLogoutProvider/AutologoutProvider.test.tsx b/packages/core-components/src/components/AutoLogout/Autologout.test.tsx similarity index 72% rename from packages/core-components/src/components/AutoLogoutProvider/AutologoutProvider.test.tsx rename to packages/core-components/src/components/AutoLogout/Autologout.test.tsx index 204a8ab2cc..a60d09338e 100644 --- a/packages/core-components/src/components/AutoLogoutProvider/AutologoutProvider.test.tsx +++ b/packages/core-components/src/components/AutoLogout/Autologout.test.tsx @@ -18,10 +18,10 @@ import { createMocks } from 'react-idle-timer'; import { MessageChannel } from 'worker_threads'; import { ApiProvider } from '@backstage/core-app-api'; import { identityApiRef } from '@backstage/core-plugin-api'; -import { renderWithEffects, TestApiRegistry } from '@backstage/test-utils'; +import { TestApiRegistry } from '@backstage/test-utils'; import React from 'react'; -import { AutoLogoutProvider } from './AutoLogoutProvider'; +import { AutoLogout } from './AutoLogout'; import { cleanup, render } from '@testing-library/react'; // Mock the signOut function of identityApiRef @@ -43,29 +43,15 @@ describe('AutoLogoutProvider', () => { jest.clearAllMocks(); }); - it('renders children even when enabled is false', async () => { - const { queryByText } = await renderWithEffects( - - -
Test Child
-
-
, - ); - - expect(queryByText('Test Child')).not.toBeNull(); - expect(mockSignOut).not.toHaveBeenCalled(); - }); - it('should throw error if idleTimeoutMinutes is smaller than promptBeforeSeconds', async () => { expect(() => render( - -
Test Child
-
+ />
, ), ).toThrow(); @@ -75,9 +61,8 @@ describe('AutoLogoutProvider', () => { expect(() => render( - -
Test Child
-
+ +
Test Child
, ), ).toThrow(); diff --git a/packages/core-components/src/components/AutoLogoutProvider/StillTherePrompt.tsx b/packages/core-components/src/components/AutoLogout/StillTherePrompt.tsx similarity index 94% rename from packages/core-components/src/components/AutoLogoutProvider/StillTherePrompt.tsx rename to packages/core-components/src/components/AutoLogout/StillTherePrompt.tsx index bbe5759a62..e0cfc8dd56 100644 --- a/packages/core-components/src/components/AutoLogoutProvider/StillTherePrompt.tsx +++ b/packages/core-components/src/components/AutoLogout/StillTherePrompt.tsx @@ -21,9 +21,10 @@ import DialogContent from '@material-ui/core/DialogContent'; import DialogContentText from '@material-ui/core/DialogContentText'; import DialogTitle from '@material-ui/core/DialogTitle'; import React, { useEffect } from 'react'; -import { useIdleTimerContext } from 'react-idle-timer'; +import { IIdleTimer } from 'react-idle-timer'; export interface StillTherePromptProps { + idleTimer: IIdleTimer; promptTimeoutMillis: number; remainingTime: number; setRemainingTime: (amount: number) => void; @@ -33,13 +34,13 @@ export interface StillTherePromptProps { export const StillTherePrompt = (props: StillTherePromptProps) => { const { + idleTimer, setOpen, open, promptTimeoutMillis, remainingTime, setRemainingTime, } = props; - const idleTimer = useIdleTimerContext(); useEffect(() => { const interval = setInterval(() => { @@ -63,7 +64,7 @@ export const StillTherePrompt = (props: StillTherePromptProps) => { const seconds = timeTillPrompt > 1 ? 'seconds' : 'second'; return ( - + Logging out due to inactivity diff --git a/packages/core-components/src/components/AutoLogoutProvider/disconnectedUsers.test.ts b/packages/core-components/src/components/AutoLogout/disconnectedUsers.test.ts similarity index 100% rename from packages/core-components/src/components/AutoLogoutProvider/disconnectedUsers.test.ts rename to packages/core-components/src/components/AutoLogout/disconnectedUsers.test.ts diff --git a/packages/core-components/src/components/AutoLogoutProvider/disconnectedUsers.ts b/packages/core-components/src/components/AutoLogout/disconnectedUsers.ts similarity index 100% rename from packages/core-components/src/components/AutoLogoutProvider/disconnectedUsers.ts rename to packages/core-components/src/components/AutoLogout/disconnectedUsers.ts diff --git a/packages/core-components/src/components/AutoLogoutProvider/index.ts b/packages/core-components/src/components/AutoLogout/index.ts similarity index 87% rename from packages/core-components/src/components/AutoLogoutProvider/index.ts rename to packages/core-components/src/components/AutoLogout/index.ts index 2b9d0e9738..470689e45f 100644 --- a/packages/core-components/src/components/AutoLogoutProvider/index.ts +++ b/packages/core-components/src/components/AutoLogout/index.ts @@ -13,5 +13,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export * from './AutoLogoutProvider'; -export * from './ConfigBasedAutoLogoutProvider'; +export * from './AutoLogout'; diff --git a/packages/core-components/src/components/AutoLogoutProvider/timestampStore.test.ts b/packages/core-components/src/components/AutoLogout/timestampStore.test.ts similarity index 100% rename from packages/core-components/src/components/AutoLogoutProvider/timestampStore.test.ts rename to packages/core-components/src/components/AutoLogout/timestampStore.test.ts diff --git a/packages/core-components/src/components/AutoLogoutProvider/timestampStore.ts b/packages/core-components/src/components/AutoLogout/timestampStore.ts similarity index 100% rename from packages/core-components/src/components/AutoLogoutProvider/timestampStore.ts rename to packages/core-components/src/components/AutoLogout/timestampStore.ts diff --git a/packages/core-components/src/components/AutoLogoutProvider/ConfigBasedAutoLogoutProvider.tsx b/packages/core-components/src/components/AutoLogoutProvider/ConfigBasedAutoLogoutProvider.tsx deleted file mode 100644 index 1eceedaa3b..0000000000 --- a/packages/core-components/src/components/AutoLogoutProvider/ConfigBasedAutoLogoutProvider.tsx +++ /dev/null @@ -1,66 +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 { configApiRef, useApi } from '@backstage/core-plugin-api'; -import { PropsWithChildren, useMemo } from 'react'; -import { - AutoLogoutProvider, - AutoLogoutProviderProps, - AutoLogoutTrackableEvent, -} from './AutoLogoutProvider'; -import React from 'react'; - -/** @public */ -export type ConfigBasedAutoLogoutProviderProps = {}; - -/** - * A config based flavour of the AutoLogoutProvider. - * It allows to configure Autologout settings through `app-config` - * - * @public - */ -export const ConfigBasedAutoLogoutProvider = ({ - children, -}: PropsWithChildren): JSX.Element => { - const configApi = useApi(configApiRef); - - const props: AutoLogoutProviderProps = useMemo(() => { - return { - enabled: configApi.getOptionalBoolean('auth.autologout.enabled'), - idleTimeoutMinutes: configApi.getOptionalNumber( - 'auth.autologout.idleTimeoutMinutes', - ), - promptBeforeIdleSeconds: configApi.getOptionalNumber( - 'auth.autologout.promptBeforeIdleSeconds', - ), - useWorkerTimers: configApi.getOptionalBoolean( - 'auth.autologout.useWorkerTimers', - ), - events: configApi - .getOptionalStringArray('auth.autologout.events') - ?.map(event => event as AutoLogoutTrackableEvent), - logoutIfDisconnected: configApi.getOptionalBoolean( - 'auth.autologout.logoutIfDisconnected', - ), - }; - }, [configApi]); - - return ( - - {children} - - ); -}; diff --git a/packages/core-components/src/components/index.ts b/packages/core-components/src/components/index.ts index 62bc99ad53..a58208fabb 100644 --- a/packages/core-components/src/components/index.ts +++ b/packages/core-components/src/components/index.ts @@ -15,7 +15,7 @@ */ export * from './AlertDisplay'; -export * from './AutoLogoutProvider'; +export * from './AutoLogout'; export * from './Avatar'; export * from './LinkButton'; export * from './CodeSnippet'; diff --git a/packages/core-components/src/layout/SignInPage/providers.tsx b/packages/core-components/src/layout/SignInPage/providers.tsx index d72f26e53f..6d6dfe84b2 100644 --- a/packages/core-components/src/layout/SignInPage/providers.tsx +++ b/packages/core-components/src/layout/SignInPage/providers.tsx @@ -31,7 +31,7 @@ import { commonProvider } from './commonProvider'; import { guestProvider } from './guestProvider'; import { customProvider } from './customProvider'; import { IdentityApiSignOutProxy } from './IdentityApiSignOutProxy'; -import { LAST_SEEN_ONLINE_STORAGE_KEY } from '../../components/AutoLogoutProvider/disconnectedUsers'; +import { LAST_SEEN_ONLINE_STORAGE_KEY } from '../../components/AutoLogout/disconnectedUsers'; const PROVIDER_STORAGE_KEY = '@backstage/core:SignInPage:provider'; diff --git a/packages/core-components/src/setupTests.ts b/packages/core-components/src/setupTests.ts index 963c0f188b..fe6fab0620 100644 --- a/packages/core-components/src/setupTests.ts +++ b/packages/core-components/src/setupTests.ts @@ -15,3 +15,4 @@ */ import '@testing-library/jest-dom'; +import 'jest-localstorage-mock'; From 031101e20d617cda91ecc83fdd52287986c61262 Mon Sep 17 00:00:00 2001 From: Manuel Scurti Date: Wed, 6 Sep 2023 19:01:42 +0200 Subject: [PATCH 23/82] fix: autologout should not start if you are not logged in Signed-off-by: Manuel Scurti --- .../src/components/AutoLogout/AutoLogout.tsx | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/core-components/src/components/AutoLogout/AutoLogout.tsx b/packages/core-components/src/components/AutoLogout/AutoLogout.tsx index abb898a0f2..96ae497208 100644 --- a/packages/core-components/src/components/AutoLogout/AutoLogout.tsx +++ b/packages/core-components/src/components/AutoLogout/AutoLogout.tsx @@ -101,7 +101,7 @@ const ConditionalAutoLogout = ({ const promptBeforeIdleMillis = promptBeforeIdleSeconds * 1000; const promptBeforeIdle = promptBeforeIdleMillis > 0 ? true : false; - const onPrompt = () => { + const onPrompt = async () => { // onPrompt will be called `promptBeforeIdle` milliseconds before `timeout`. // All events are disabled while the prompt is active. // If the user wishes to stay active, call the `activate()` method. @@ -232,6 +232,18 @@ const parseConfig = ( export const AutoLogout = (props: AutoLogoutProps): JSX.Element => { const identityApi = useApi(identityApiRef); const configApi = useApi(configApiRef); + const [isLogged, setIsLogged] = useState(false); + useEffect(() => { + // if the user is not logged in, the autologout feature won't affect the app even if enabled + async function isLoggedIn(identity: IdentityApi) { + if ((await identity.getCredentials()).token) { + setIsLogged(true); + } else { + setIsLogged(false); + } + } + isLoggedIn(identityApi); + }, [identityApi]); const { enabled, @@ -274,13 +286,13 @@ export const AutoLogout = (props: AutoLogoutProps): JSX.Element => { useLogoutDisconnectedUserEffect({ enableEffect: logoutIfDisconnected, - autologoutIsEnabled: enabled, + autologoutIsEnabled: enabled && isLogged, idleTimeoutSeconds: idleTimeoutMinutes * 60, lastSeenOnlineStore, identityApi, }); - if (!enabled) { + if (!enabled || !isLogged) { return <>; } From 214d02fa8d60a61d148f910f11e66d85f77bee51 Mon Sep 17 00:00:00 2001 From: Manuel Scurti Date: Tue, 12 Sep 2023 11:39:17 +0200 Subject: [PATCH 24/82] fixed api report and docs Signed-off-by: Manuel Scurti --- .changeset/many-panthers-wink.md | 2 +- docs/auth/autologout.md | 20 +++++++++--------- packages/core-components/api-report.md | 21 ++----------------- .../src/components/AutoLogout/AutoLogout.tsx | 4 ++-- 4 files changed, 15 insertions(+), 32 deletions(-) diff --git a/.changeset/many-panthers-wink.md b/.changeset/many-panthers-wink.md index 1a7c5c1331..724a3aada6 100644 --- a/.changeset/many-panthers-wink.md +++ b/.changeset/many-panthers-wink.md @@ -2,4 +2,4 @@ '@backstage/core-components': patch --- -Added AutoLogoutProvider which introduces an optional automatic logout mechanism on user inactivity +Added `` component which introduces an optional automatic logout mechanism on user inactivity diff --git a/docs/auth/autologout.md b/docs/auth/autologout.md index 1c20f3f613..b792ac6ea1 100644 --- a/docs/auth/autologout.md +++ b/docs/auth/autologout.md @@ -27,7 +27,7 @@ To enable and configure Auto Logout, you will need to add the `` com Here's how to add it: ```ts -import { AutoLogoutProvider } from '@backstage/core-components'; +import { AutoLogout } from '@backstage/core-components'; // ... App.tsx contents @@ -63,13 +63,13 @@ auth: enabled: true ``` -Bear in mind that, in case the same property is found both in the `` component and the `app-config` file then the properties set in the React component take precedence over configuration properties found inside your `app-config`. -You will now be able to configure the AutoLogoutProvider through your `app-config`. These are the available settings: +Bear in mind that, properties configured in `app-config` take precedence over the props passed to the `` React component. +These are the available settings: -| Configuration Key | Component Property | Description | Allowed Values | Default Value | -| ----------------------------------------- | ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------- | -| `auth.autologout.enabled` | `enabled` | Enable/disable the Auto Logout feature. | `true`/`false` | With `` default is enabled (`true`). With `` default is disabled (`false`) | -| `auth.autologout.idleTimeoutMinutes` | `idleTimeoutMinutes` | Sets the idle time (in minutes) after which the user will be logged out. | `>= 0.5` minutes | `60` | -| `auth.autologout.promptBeforeIdleSeconds` | `promptBeforeIdleSeconds` | Determines the time (in seconds) prior to idle state when a prompt will appear. A value of 0 disables the prompt. This must be less than the value of `idleTimeoutMinutes`. | `>= 0` seconds | `10` | -| `auth.autologout.useWorkerTimers` | `useWorkerTimers` | Enables or disables the use of Node's worker thread timers instead of main thread timers. This can be beneficial if the browser is terminating timers in inactive tabs, like those used by auto logout. In case of browser incompatibility, try setting this to false. | `true`/`false` | `true` | -| `auth.autologout.logoutIfDisconnected` | `logoutIfDisconnected` | Enable/disable auto logout for disconnected users. Disconnected users are those who are logged in but do not have any active Backstage tabs open in their browsers. If enabled, such users will be automatically logged out after `idleTimeoutMinutes`. | `true`/`false` | `true` | +| Configuration Key | Component Property | Description | Allowed Values | Default Value | +| ----------------------------------------- | ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | --------------------------- | +| `auth.autologout.enabled` | `enabled` | Enable/disable the Auto Logout feature. | `true`/`false` | Default is enabled (`true`) | +| `auth.autologout.idleTimeoutMinutes` | `idleTimeoutMinutes` | Sets the idle time (in minutes) after which the user will be logged out. | `>= 0.5` minutes | `60` | +| `auth.autologout.promptBeforeIdleSeconds` | `promptBeforeIdleSeconds` | Determines the time (in seconds) prior to idle state when a prompt will appear. A value of 0 disables the prompt. This must be less than the value of `idleTimeoutMinutes`. | `>= 0` seconds | `10` | +| `auth.autologout.useWorkerTimers` | `useWorkerTimers` | Enables or disables the use of Node's worker thread timers instead of main thread timers. This can be beneficial if the browser is terminating timers in inactive tabs, like those used by auto logout. In case of browser incompatibility, try setting this to false. | `true`/`false` | `true` | +| `auth.autologout.logoutIfDisconnected` | `logoutIfDisconnected` | Enable/disable auto logout for disconnected users. Disconnected users are those who are logged in but do not have any active Backstage tabs open in their browsers. If enabled, such users will be automatically logged out after `idleTimeoutMinutes`. | `true`/`false` | `true` | diff --git a/packages/core-components/api-report.md b/packages/core-components/api-report.md index 388282a854..e7a3a47713 100644 --- a/packages/core-components/api-report.md +++ b/packages/core-components/api-report.md @@ -69,23 +69,14 @@ export type AlertDisplayProps = { }; // @public -export const AutoLogoutProvider: ({ - children, - enabled, - idleTimeoutMinutes, - promptBeforeIdleSeconds, - useWorkerTimers, - events, - logoutIfDisconnected, -}: PropsWithChildren) => JSX.Element; +export const AutoLogout: (props: AutoLogoutProps) => JSX.Element | null; // @public (undocumented) -export type AutoLogoutProviderProps = { +export type AutoLogoutProps = { enabled?: boolean; idleTimeoutMinutes?: number; promptBeforeIdleSeconds?: number; useWorkerTimers?: boolean; - events?: AutoLogoutTrackableEvent[]; logoutIfDisconnected?: boolean; }; @@ -190,14 +181,6 @@ export interface CodeSnippetProps { text: string; } -// @public -export const ConfigBasedAutoLogoutProvider: ({ - children, -}: PropsWithChildren) => JSX.Element; - -// @public (undocumented) -export type ConfigBasedAutoLogoutProviderProps = {}; - // Warning: (ae-forgotten-export) The symbol "Props_13" needs to be exported by the entry point index.d.ts // // @public diff --git a/packages/core-components/src/components/AutoLogout/AutoLogout.tsx b/packages/core-components/src/components/AutoLogout/AutoLogout.tsx index 96ae497208..56ff2f19c8 100644 --- a/packages/core-components/src/components/AutoLogout/AutoLogout.tsx +++ b/packages/core-components/src/components/AutoLogout/AutoLogout.tsx @@ -229,7 +229,7 @@ const parseConfig = ( * * @public */ -export const AutoLogout = (props: AutoLogoutProps): JSX.Element => { +export const AutoLogout = (props: AutoLogoutProps): JSX.Element | null => { const identityApi = useApi(identityApiRef); const configApi = useApi(configApiRef); const [isLogged, setIsLogged] = useState(false); @@ -293,7 +293,7 @@ export const AutoLogout = (props: AutoLogoutProps): JSX.Element => { }); if (!enabled || !isLogged) { - return <>; + return null; } return ( From 6ed18c353c052cad0f2ef3257bdf52af3f5d81f8 Mon Sep 17 00:00:00 2001 From: Manuel Scurti Date: Tue, 12 Sep 2023 11:46:05 +0200 Subject: [PATCH 25/82] Update packages/core-components/src/components/AutoLogout/AutoLogout.tsx Co-authored-by: Johan Haals Signed-off-by: Manuel Scurti --- .../core-components/src/components/AutoLogout/AutoLogout.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core-components/src/components/AutoLogout/AutoLogout.tsx b/packages/core-components/src/components/AutoLogout/AutoLogout.tsx index 56ff2f19c8..cb5b101308 100644 --- a/packages/core-components/src/components/AutoLogout/AutoLogout.tsx +++ b/packages/core-components/src/components/AutoLogout/AutoLogout.tsx @@ -61,7 +61,7 @@ export type AutoLogoutProps = { promptBeforeIdleSeconds?: number; /** * Enable/disable the usage of Node's worker thread timers instead of main thread timers. - * This is helpful if you notice that the your browser is killing inactive tab's timers, like the one used by AutoLogoutProvider. + * This is helpful if you notice that the your browser is killing inactive tab's timers, like the one used by AutoLogout. * If you experience some browser incompatibility, you may try to set this to false. * defaults to true. */ From f92d389b7c8eeb9beb1935dd31ab1d707a805871 Mon Sep 17 00:00:00 2001 From: Manuel Scurti Date: Tue, 12 Sep 2023 11:46:16 +0200 Subject: [PATCH 26/82] Update packages/core-components/src/components/AutoLogout/Autologout.test.tsx Co-authored-by: Johan Haals Signed-off-by: Manuel Scurti --- .../src/components/AutoLogout/Autologout.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core-components/src/components/AutoLogout/Autologout.test.tsx b/packages/core-components/src/components/AutoLogout/Autologout.test.tsx index a60d09338e..0d414524a5 100644 --- a/packages/core-components/src/components/AutoLogout/Autologout.test.tsx +++ b/packages/core-components/src/components/AutoLogout/Autologout.test.tsx @@ -30,7 +30,7 @@ const mockIdentityApi = { signOut: mockSignOut }; const apis = TestApiRegistry.from([identityApiRef, mockIdentityApi]); -describe('AutoLogoutProvider', () => { +describe('AutoLogout', () => { beforeAll(() => { createMocks(); // @ts-ignore From d3946292b551d063b71ee7278202e804dc16701d Mon Sep 17 00:00:00 2001 From: Manuel Scurti Date: Tue, 12 Sep 2023 14:34:21 +0200 Subject: [PATCH 27/82] Update docs/auth/autologout.md Co-authored-by: Patrik Oldsberg Signed-off-by: Manuel Scurti --- docs/auth/autologout.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/auth/autologout.md b/docs/auth/autologout.md index b792ac6ea1..7375362687 100644 --- a/docs/auth/autologout.md +++ b/docs/auth/autologout.md @@ -26,7 +26,7 @@ To enable and configure Auto Logout, you will need to add the `` com Here's how to add it: -```ts +```tsx import { AutoLogout } from '@backstage/core-components'; // ... App.tsx contents From 21e8ef916ba2c77c6e20fce25b223b8bc14ee1f2 Mon Sep 17 00:00:00 2001 From: Manuel Scurti Date: Tue, 12 Sep 2023 14:34:31 +0200 Subject: [PATCH 28/82] Update docs/auth/autologout.md Co-authored-by: Patrik Oldsberg Signed-off-by: Manuel Scurti --- docs/auth/autologout.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/auth/autologout.md b/docs/auth/autologout.md index 7375362687..b85f6f486d 100644 --- a/docs/auth/autologout.md +++ b/docs/auth/autologout.md @@ -47,7 +47,7 @@ export default app.createRoot( You can further adjust the Auto Logout settings by tweaking the available `` properties: -```ts +```tsx Date: Tue, 12 Sep 2023 15:18:32 +0200 Subject: [PATCH 29/82] removed jest-localstorage-mock dep Signed-off-by: Manuel Scurti --- packages/core-components/api-report.md | 4 ---- packages/core-components/package.json | 1 - .../src/components/AutoLogout/AutoLogout.tsx | 3 +-- .../AutoLogout/timestampStore.test.ts | 20 +++++++++++++++++++ packages/core-components/src/setupTests.ts | 1 - 5 files changed, 21 insertions(+), 8 deletions(-) diff --git a/packages/core-components/api-report.md b/packages/core-components/api-report.md index e7a3a47713..44a8b33e04 100644 --- a/packages/core-components/api-report.md +++ b/packages/core-components/api-report.md @@ -20,7 +20,6 @@ import { default as CSS_2 } from 'csstype'; import { CSSProperties } from 'react'; import { ElementType } from 'react'; import { ErrorInfo } from 'react'; -import { EventsType } from 'react-idle-timer'; import { IconComponent } from '@backstage/core-plugin-api'; import { Icons } from '@material-table/core'; import { IdentityApi } from '@backstage/core-plugin-api'; @@ -80,9 +79,6 @@ export type AutoLogoutProps = { logoutIfDisconnected?: boolean; }; -// @public (undocumented) -export type AutoLogoutTrackableEvent = EventsType; - // @public export function Avatar(props: AvatarProps): React_2.JSX.Element; diff --git a/packages/core-components/package.json b/packages/core-components/package.json index 202d558e46..36c7296fdf 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -103,7 +103,6 @@ "@types/react-window": "^1.8.5", "@types/zen-observable": "^0.8.0", "cross-fetch": "^3.1.5", - "jest-localstorage-mock": "^2.4.26", "msw": "^1.0.0" }, "files": [ diff --git a/packages/core-components/src/components/AutoLogout/AutoLogout.tsx b/packages/core-components/src/components/AutoLogout/AutoLogout.tsx index cb5b101308..a345ca4b2d 100644 --- a/packages/core-components/src/components/AutoLogout/AutoLogout.tsx +++ b/packages/core-components/src/components/AutoLogout/AutoLogout.tsx @@ -36,8 +36,7 @@ import { import { StillTherePrompt } from './StillTherePrompt'; import { DefaultTimestampStore, TimestampStore } from './timestampStore'; -/** @public */ -export type AutoLogoutTrackableEvent = EventsType; +type AutoLogoutTrackableEvent = EventsType; /** @public */ export type AutoLogoutProps = { diff --git a/packages/core-components/src/components/AutoLogout/timestampStore.test.ts b/packages/core-components/src/components/AutoLogout/timestampStore.test.ts index 67708b16d9..ce69a1846a 100644 --- a/packages/core-components/src/components/AutoLogout/timestampStore.test.ts +++ b/packages/core-components/src/components/AutoLogout/timestampStore.test.ts @@ -16,6 +16,20 @@ import { DefaultTimestampStore, TimestampStore } from './timestampStore'; +const mockLocalStorage: any = { + __STORE__: {}, + getItem: jest.fn(key => mockLocalStorage.__STORE__[key] || null), + setItem: jest.fn((key, value) => { + mockLocalStorage.__STORE__[key] = value; + }), + removeItem: jest.fn(key => { + delete mockLocalStorage.__STORE__[key]; + }), + clear: jest.fn(() => { + mockLocalStorage.__STORE__ = {}; + }), +}; + describe('DefaultTimestampStore', () => { let timestampStore: TimestampStore; const key = 'test-key'; @@ -23,6 +37,12 @@ describe('DefaultTimestampStore', () => { beforeEach(() => { timestampStore = new DefaultTimestampStore(key); + + // Set up mock localStorage + Object.defineProperty(window, 'localStorage', { + value: mockLocalStorage, + }); + // Clear the mock storage before each test localStorage.clear(); }); diff --git a/packages/core-components/src/setupTests.ts b/packages/core-components/src/setupTests.ts index fe6fab0620..963c0f188b 100644 --- a/packages/core-components/src/setupTests.ts +++ b/packages/core-components/src/setupTests.ts @@ -15,4 +15,3 @@ */ import '@testing-library/jest-dom'; -import 'jest-localstorage-mock'; From 5c541101bd49276ae8baacbc1ba4b845e83a03a0 Mon Sep 17 00:00:00 2001 From: Manuel Scurti Date: Tue, 12 Sep 2023 23:58:08 +0200 Subject: [PATCH 30/82] removed on signout autologout action Signed-off-by: Manuel Scurti --- packages/core-components/src/layout/SignInPage/providers.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/core-components/src/layout/SignInPage/providers.tsx b/packages/core-components/src/layout/SignInPage/providers.tsx index 6d6dfe84b2..62a1e702dc 100644 --- a/packages/core-components/src/layout/SignInPage/providers.tsx +++ b/packages/core-components/src/layout/SignInPage/providers.tsx @@ -96,7 +96,6 @@ export const useSignInProviders = ( IdentityApiSignOutProxy.from({ identityApi, signOut: async () => { - localStorage.removeItem(LAST_SEEN_ONLINE_STORAGE_KEY); localStorage.removeItem(PROVIDER_STORAGE_KEY); await identityApi.signOut?.(); }, From dd2b84cb6bd2715ae72877507f8bcdd66e3286b0 Mon Sep 17 00:00:00 2001 From: Manuel Scurti Date: Mon, 18 Sep 2023 14:41:20 +0200 Subject: [PATCH 31/82] restored yarn.lock Signed-off-by: Manuel Scurti --- yarn.lock | 8 -------- 1 file changed, 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index 726596bb24..96e7e46ca5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4155,7 +4155,6 @@ __metadata: dagre: ^0.8.5 history: ^5.0.0 immer: ^9.0.1 - jest-localstorage-mock: ^2.4.26 linkify-react: 4.1.1 linkifyjs: 4.1.1 lodash: ^4.17.21 @@ -30118,13 +30117,6 @@ __metadata: languageName: node linkType: hard -"jest-localstorage-mock@npm:^2.4.26": - version: 2.4.26 - resolution: "jest-localstorage-mock@npm:2.4.26" - checksum: d6871dd030f04bb59c9ef71ce22e98e15e2bc0d77755f5ed466839b891a7a7aae64b6cfc8f942cbef515981c4ff2ae26ad2ccc2f9d1b426c198d0b812ab1831f - languageName: node - linkType: hard - "jest-matcher-utils@npm:^28.1.3": version: 28.1.3 resolution: "jest-matcher-utils@npm:28.1.3" From 009b654c75355ba4729e3fddc0f4cb206668d1ab Mon Sep 17 00:00:00 2001 From: Manuel Scurti Date: Mon, 18 Sep 2023 18:11:51 +0200 Subject: [PATCH 32/82] fixed lint issue Signed-off-by: Manuel Scurti --- packages/core-components/src/layout/SignInPage/providers.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/core-components/src/layout/SignInPage/providers.tsx b/packages/core-components/src/layout/SignInPage/providers.tsx index 62a1e702dc..e456a6948b 100644 --- a/packages/core-components/src/layout/SignInPage/providers.tsx +++ b/packages/core-components/src/layout/SignInPage/providers.tsx @@ -31,7 +31,6 @@ import { commonProvider } from './commonProvider'; import { guestProvider } from './guestProvider'; import { customProvider } from './customProvider'; import { IdentityApiSignOutProxy } from './IdentityApiSignOutProxy'; -import { LAST_SEEN_ONLINE_STORAGE_KEY } from '../../components/AutoLogout/disconnectedUsers'; const PROVIDER_STORAGE_KEY = '@backstage/core:SignInPage:provider'; From 03691f0f32705e0f6f2de0daccb3d4ac133012b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 19 Sep 2023 11:04:53 +0200 Subject: [PATCH 33/82] add back proxy legacy config MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/purple-hotels-doubt.md | 5 ++++ plugins/proxy-backend/config.d.ts | 49 +++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 .changeset/purple-hotels-doubt.md diff --git a/.changeset/purple-hotels-doubt.md b/.changeset/purple-hotels-doubt.md new file mode 100644 index 0000000000..476d8071de --- /dev/null +++ b/.changeset/purple-hotels-doubt.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-proxy-backend': patch +--- + +Add back the legacy proxy config, to get secret redaction diff --git a/plugins/proxy-backend/config.d.ts b/plugins/proxy-backend/config.d.ts index 79e1cfcba6..dd65aa8e75 100644 --- a/plugins/proxy-backend/config.d.ts +++ b/plugins/proxy-backend/config.d.ts @@ -73,5 +73,54 @@ export interface Config { allowedHeaders?: string[]; }; }; + } & { + /** + * This was the legacy way of expressing proxies, and is now deprecated. We + * keep it around in the config schema, to ensure that legacy setups still + * have properly secret-marked values so that they get redacted. + * + * TODO(freben): Remove this in the future (suggestion: after 2024-03-01) + * when people likely have moved off of this format. + */ + [key: string]: + | string + | { + /** + * Target of the proxy. Url string to be parsed with the url module. + */ + target: string; + /** + * Object with extra headers to be added to target requests. + */ + headers?: { + /** @visibility secret */ + Authorization?: string; + /** @visibility secret */ + authorization?: string; + /** @visibility secret */ + 'X-Api-Key'?: string; + /** @visibility secret */ + 'x-api-key'?: string; + [key: string]: string | undefined; + }; + /** + * Changes the origin of the host header to the target URL. Default: true. + */ + changeOrigin?: boolean; + /** + * Rewrite target's url path. Object-keys will be used as RegExp to match paths. + * If pathRewrite is not specified, it is set to a single rewrite that removes the entire prefix and route. + */ + pathRewrite?: { [regexp: string]: string }; + /** + * Limit the forwarded HTTP methods, for example allowedMethods: ['GET'] to enforce read-only access. + */ + allowedMethods?: string[]; + /** + * Limit the forwarded HTTP methods. By default, only the headers that are considered safe for CORS + * and headers that are set by the proxy will be forwarded. + */ + allowedHeaders?: string[]; + }; }; } From b337d78c3b53cee9370a78fda072fc1fca0524fd Mon Sep 17 00:00:00 2001 From: npiyush97 Date: Tue, 19 Sep 2023 15:08:53 +0530 Subject: [PATCH 34/82] added suggested changes Signed-off-by: npiyush97 --- .changeset/large-comics-knock.md | 5 +++++ .../src/components/TemplateEditorPage/TemplateEditorForm.tsx | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 .changeset/large-comics-knock.md diff --git a/.changeset/large-comics-knock.md b/.changeset/large-comics-knock.md new file mode 100644 index 0000000000..860172579e --- /dev/null +++ b/.changeset/large-comics-knock.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': patch +--- + +fixed issue related template editor fails with multiple templates per file. diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx index 315028219b..15a44cf918 100644 --- a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx +++ b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx @@ -123,7 +123,10 @@ export function TemplateEditorForm(props: TemplateEditorFormProps) { setSteps(undefined); return; } - const parsed: JsonValue = yaml.parse(content); + const parsed: JsonValue = yaml + .parseAllDocuments(content) + .map(c => c.toJSON()) + .filter(c => c)[0]; if (!isJsonObject(parsed)) { setSteps(undefined); From 5fcffed83e101e6f3af7ce09389814580fdb15bf Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 19 Sep 2023 10:30:54 +0000 Subject: [PATCH 35/82] chore(deps): update github/codeql-action action to v2.21.8 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 62c693de6f..4f48fa83b4 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -61,6 +61,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: 'Upload to code-scanning' - uses: github/codeql-action/upload-sarif@00e563ead9f72a8461b24876bee2d0c2e8bd2ee8 # v2.21.5 + uses: github/codeql-action/upload-sarif@6a28655e3dcb49cb0840ea372fd6d17733edd8a4 # v2.21.8 with: sarif_file: results.sarif From 5af17aa5830423a22fc50a04c2520c14b8773006 Mon Sep 17 00:00:00 2001 From: npiyush97 Date: Tue, 19 Sep 2023 16:40:28 +0530 Subject: [PATCH 36/82] =?UTF-8?q?fixed=20the=20fix=20=F0=9F=98=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: npiyush97 --- .../src/components/TemplateEditorPage/TemplateEditorForm.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx index 15a44cf918..2a726110b8 100644 --- a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx +++ b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx @@ -125,8 +125,8 @@ export function TemplateEditorForm(props: TemplateEditorFormProps) { } const parsed: JsonValue = yaml .parseAllDocuments(content) - .map(c => c.toJSON()) - .filter(c => c)[0]; + .filter(c => c) + .map(c => c.toJSON())[0]; if (!isJsonObject(parsed)) { setSteps(undefined); From fdab0209647fcf13225058dfbf2ea0d9a6597461 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 19 Sep 2023 13:33:23 +0200 Subject: [PATCH 37/82] cli-node: removed unused mock-fs from Lockfile test Signed-off-by: Patrik Oldsberg --- packages/cli-node/src/monorepo/Lockfile.test.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/cli-node/src/monorepo/Lockfile.test.ts b/packages/cli-node/src/monorepo/Lockfile.test.ts index 01574779b2..41beeb4408 100644 --- a/packages/cli-node/src/monorepo/Lockfile.test.ts +++ b/packages/cli-node/src/monorepo/Lockfile.test.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import mockFs from 'mock-fs'; import { Lockfile } from './Lockfile'; const LEGACY_HEADER = `# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. @@ -31,10 +30,6 @@ __metadata: `; describe('New Lockfile', () => { - afterEach(() => { - mockFs.restore(); - }); - describe('diff', () => { const lockfileLegacyA = Lockfile.parse(`${LEGACY_HEADER} a@^1: From 49cf3870f433ae9992fbeb6ff8ebd5c3f56f0776 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 19 Sep 2023 13:41:18 +0200 Subject: [PATCH 38/82] fix the link in the release process doc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- docs/publishing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/publishing.md b/docs/publishing.md index be94406a40..3ffc29e6df 100644 --- a/docs/publishing.md +++ b/docs/publishing.md @@ -21,7 +21,7 @@ PR is merged. This is typically done every Tuesday around noon CET. - Note: Admin rights are required to lock the branch. If you lack the necessary permissions, contact a core maintainer to perform this action on your behalf. - Check [`Version Packages (next)` Pull Request](https://github.com/backstage/backstage/pulls?q=is%3Aopen+is%3Apr+in%3Atitle+%22Version+Packages+%28next%29%22) - Verify the version we are shipping is correct, by looking at the version packages PR title. It should be "Version Packages (next)" - - Check [`.changeset/pre.json`](https://github.com/backstage/backstage/blob/master/.changeset/pre.json) if the `mode` is set to `pre`. If you encounter `mode: "exit"` or if it's not defined, it indicates a mainline release. + - Check `pre.json` in [the `.changeset` folder](https://github.com/backstage/backstage/blob/master/.changeset) - it should have `"mode": "pre"` near the top. If you encounter `"mode": "exit"` or if the file doesn't exist, it indicates a mainline release. - Verify that there are no active/unfinished `sync_version-packages` actions running (https://github.com/backstage/backstage/actions/workflows/sync_version-packages.yml) - Locking the main branch will prevent new ones to be created, but be sure to check for running actions again after unlocking, since it may cause pending auto-merge PRs to be merged. - Check [`Version Packages (next)` Pull Request](https://github.com/backstage/backstage/pulls?q=is%3Aopen+is%3Apr+in%3Atitle+%22Version+Packages+%28next%29%22) for sufficient approval to be merged From 281c5e4698f46174a77eed2f57cf70db0e3faf1b Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 19 Sep 2023 15:23:26 +0200 Subject: [PATCH 39/82] backend-common: temporarily disable GerritUrlReader tests Signed-off-by: Patrik Oldsberg --- packages/backend-common/src/reading/GerritUrlReader.test.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/backend-common/src/reading/GerritUrlReader.test.ts b/packages/backend-common/src/reading/GerritUrlReader.test.ts index 9de9aac33d..19c67ffd56 100644 --- a/packages/backend-common/src/reading/GerritUrlReader.test.ts +++ b/packages/backend-common/src/reading/GerritUrlReader.test.ts @@ -82,7 +82,10 @@ const createReader = (config: JsonObject): UrlReaderPredicateTuple[] => { }); }; -describe('GerritUrlReader', () => { +// TODO(Rugvip): These tests seem to be a direct or indirect cause of the TaskWorker test flakiness +// We're not sure why at this point, but while investigating these tests are disabled +// eslint-disable-next-line jest/no-disabled-tests +describe.skip('GerritUrlReader', () => { const worker = setupServer(); setupRequestMockHandlers(worker); From 27583ac07ce6ba57288fe3df78bb3cccb7901f52 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 19 Sep 2023 16:41:01 +0200 Subject: [PATCH 40/82] .github/workflows: limit sync VP fetch Signed-off-by: Patrik Oldsberg --- .github/workflows/sync_version-packages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sync_version-packages.yml b/.github/workflows/sync_version-packages.yml index 6d662ea05f..28fb1b64a2 100644 --- a/.github/workflows/sync_version-packages.yml +++ b/.github/workflows/sync_version-packages.yml @@ -15,7 +15,7 @@ jobs: steps: - uses: actions/checkout@v3 with: - fetch-depth: 0 + fetch-depth: 20000 token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} - name: Install Dependencies run: yarn --immutable From e347dc27e4856f98cc9285fb2f0ec142bc5732e6 Mon Sep 17 00:00:00 2001 From: Florian JUDITH Date: Tue, 19 Sep 2023 13:00:39 -0400 Subject: [PATCH 41/82] Update .changeset/small-pugs-build.md Co-authored-by: Johan Haals Signed-off-by: Florian JUDITH --- .changeset/small-pugs-build.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.changeset/small-pugs-build.md b/.changeset/small-pugs-build.md index 4ec40a8181..d1640340ba 100644 --- a/.changeset/small-pugs-build.md +++ b/.changeset/small-pugs-build.md @@ -2,4 +2,6 @@ '@backstage/create-app': patch --- -Bump Docker base images to `node:18-bullseye-slim` to fix compatibility issues raised during image build. This update aligns with the recent Github Actions update to Node 18x [#19563](https://github.com/backstage/backstage/pull/19563). +Bump Docker base images to `node:18-bullseye-slim` to fix compatibility issues raised during image build. + +You can apply these change to your own `Dockerfile` by replacing `node:16-bullseye-slim` with `node:18-bullseye-slim` From b9ce3068148e3884382db91d199ef80358ad0fb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 20 Sep 2023 10:51:41 +0200 Subject: [PATCH 42/82] stop using old prop MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/chatty-papayas-care.md | 5 +++++ .../src/components/ChangeEvents/ChangeEventEmptyState.tsx | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 .changeset/chatty-papayas-care.md diff --git a/.changeset/chatty-papayas-care.md b/.changeset/chatty-papayas-care.md new file mode 100644 index 0000000000..9f29e94a85 --- /dev/null +++ b/.changeset/chatty-papayas-care.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-pagerduty': patch +--- + +Minor fix to avoid usage of deprecated prop diff --git a/plugins/pagerduty/src/components/ChangeEvents/ChangeEventEmptyState.tsx b/plugins/pagerduty/src/components/ChangeEvents/ChangeEventEmptyState.tsx index 38bf8c9e43..4ec2d599c7 100644 --- a/plugins/pagerduty/src/components/ChangeEvents/ChangeEventEmptyState.tsx +++ b/plugins/pagerduty/src/components/ChangeEvents/ChangeEventEmptyState.tsx @@ -20,7 +20,12 @@ import EmptyStateImage from '../../assets/emptystate.svg'; export const ChangeEventEmptyState = () => { return ( - + No change events to display yet. From b228d7d9c2bec1910f9037c46a3779442289467c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 19 Sep 2023 14:15:46 +0000 Subject: [PATCH 43/82] Version Packages Signed-off-by: Patrik Oldsberg --- .changeset/afraid-apes-smell.md | 6 - .changeset/angry-ghosts-brush.md | 13 - .changeset/big-bananas-sleep.md | 5 - .changeset/big-masks-divide.md | 5 - .changeset/big-spies-agree.md | 5 - .changeset/blue-rats-drop.md | 5 - .changeset/brave-books-pretend.md | 5 - .changeset/brave-carrots-occur.md | 5 - .changeset/brown-cameras-marry.md | 5 - .changeset/calm-cups-smile.md | 60 - .changeset/catalog-everybody-to-the-limit.md | 5 - .changeset/chatty-goats-mate.md | 6 - .changeset/chatty-spiders-serve.md | 5 - .changeset/chilled-beds-exist.md | 5 - .changeset/chilly-balloons-enjoy.md | 6 - .changeset/chilly-parrots-yell.md | 5 - .changeset/clean-houses-invent.md | 5 - .changeset/clean-icons-wonder.md | 5 - .changeset/cold-apricots-poke.md | 5 - .changeset/cold-pillows-glow.md | 5 - .changeset/create-app-1692704146.md | 5 - .changeset/create-app-1693311380.md | 5 - .changeset/cuddly-avocados-warn.md | 5 - .changeset/curvy-roses-march.md | 5 - .changeset/cyan-roses-relate.md | 5 - .changeset/dirty-boxes-give.md | 7 - .changeset/dirty-carrots-notice.md | 5 - .changeset/dirty-cars-poke.md | 34 - .changeset/dirty-cars-smoke.md | 48 - .changeset/dirty-garlics-kiss.md | 5 - .changeset/dirty-years-travel.md | 5 - .changeset/dry-wasps-occur.md | 5 - .changeset/dry-yaks-type.md | 8 - .changeset/dull-eyes-pay.md | 5 - .changeset/dull-tables-joke.md | 5 - .changeset/early-rules-taste.md | 14 - .changeset/early-trains.draw.md | 5 - .changeset/eight-radios-listen.md | 5 - .changeset/eight-timers-sin.md | 5 - .changeset/eighty-emus-float.md | 5 - .changeset/eighty-fans-provide.md | 5 - .changeset/empty-rings-type.md | 5 - .changeset/fair-paws-flash.md | 5 - .changeset/few-nails-smile.md | 5 - .changeset/fifty-adults-shake.md | 5 - .changeset/fifty-pigs-travel.md | 5 - .changeset/flat-beans-kiss.md | 5 - .changeset/forty-rocks-jog.md | 6 - .changeset/four-masks-fry.md | 5 - .changeset/four-parents-visit.md | 5 - .changeset/fresh-candles-warn.md | 5 - .changeset/friendly-pugs-lick.md | 5 - .changeset/friendly-teachers-attend.md | 5 - .changeset/funny-ligers-matter.md | 6 - .changeset/funny-timers-retire.md | 5 - .changeset/giant-coats-brush.md | 129 - .changeset/gorgeous-coins-attack.md | 5 - .changeset/great-chairs-swim.md | 5 - .changeset/grumpy-bikes-beg.md | 5 - .changeset/grumpy-papayas-tie.md | 5 - .changeset/grumpy-ties-know.md | 5 - .changeset/healthy-spiders-arrive.md | 5 - .changeset/healthy-tools-count.md | 5 - .changeset/hip-seahorses-exist.md | 5 - .changeset/honest-ads-rush.md | 5 - .changeset/hungry-cherries-speak.md | 5 - .changeset/hungry-dots-design.md | 7 - .changeset/khaki-pigs-accept.md | 7 - .changeset/khaki-spiders-sniff.md | 5 - .changeset/late-cows-turn.md | 5 - .changeset/late-hounds-yell.md | 5 - .changeset/late-roses-dream.md | 5 - .changeset/lazy-pumas-hope.md | 5 - .changeset/lazy-pumas-shop.md | 8 - .changeset/lazy-rice-rule.md | 5 - .changeset/lemon-donuts-clap.md | 5 - .changeset/light-clocks-listen.md | 5 - .changeset/light-drinks-rush.md | 5 - .changeset/long-flowers-sort.md | 5 - .changeset/loud-apricots-destroy.md | 5 - .changeset/lovely-years-sniff.md | 5 - .changeset/lucky-chicken-hear.md | 13 - .changeset/lucky-chicken-lie.md | 5 - .changeset/many-panthers-wink.md | 5 - .changeset/many-tips-attend.md | 5 - .changeset/mean-carpets-provide.md | 5 - .changeset/mean-planes-smoke.md | 5 - .changeset/mean-queens-act.md | 5 - .changeset/mighty-crabs-cheat.md | 5 - .changeset/modern-trees-add.md | 6 - .changeset/nasty-cherries-exercise.md | 5 - .changeset/nasty-forks-beg.md | 14 - .changeset/nasty-snails-complain.md | 5 - .changeset/nasty-worms-share.md | 5 - .changeset/new-frogs-punch.md | 7 - .changeset/new-sheep-cover.md | 5 - .changeset/nice-forks-remain.md | 5 - .changeset/nine-taxis-study.md | 5 - .changeset/ninety-horses-remember.md | 5 - .changeset/ninety-news-visit.md | 5 - .changeset/old-geese-drive.md | 5 - .changeset/old-windows-argue.md | 5 - .changeset/orange-houses-fly.md | 5 - .changeset/pink-cups-rescue.md | 28 - .changeset/pink-months-hammer.md | 5 - .changeset/plenty-lamps-pump.md | 5 - .changeset/polite-forks-grin.md | 5 - .changeset/polite-plums-share.md | 5 - .changeset/poor-olives-own.md | 5 - .changeset/poor-years-appear.md | 5 - .changeset/popular-clocks-whisper.md | 5 - .changeset/popular-coins-tap.md | 5 - .changeset/popular-readers-allow.md | 5 - .changeset/pre.json | 399 -- .changeset/pretty-otters-whisper.md | 6 - .changeset/proud-lamps-cross.md | 5 - .changeset/purple-hotels-doubt.md | 5 - .changeset/red-pens-knock.md | 93 - .changeset/renovate-2ebf420.md | 7 - .changeset/renovate-36e7f58.md | 11 - .changeset/renovate-76185f9.md | 5 - .changeset/renovate-b129f45.md | 5 - .changeset/renovate-bbda8e8.md | 5 - .changeset/repo-p-lisa.md | 7 - ...-boo-descriptions-two-electric-boogaloo.md | 5 - .changeset/repo-tools-boo-descriptions.md | 5 - .changeset/repo-tools-ci-toldya-so.md | 5 - .changeset/rich-fishes-deny.md | 5 - .changeset/rotten-bees-wave.md | 5 - .changeset/rude-dolphins-reply.md | 5 - .changeset/short-planets-argue.md | 5 - .changeset/silent-icons-deny.md | 5 - .changeset/silent-numbers-retire.md | 6 - .changeset/silly-emus-remain.md | 5 - .changeset/silver-bananas-kick.md | 5 - .changeset/six-radios-smile.md | 5 - .changeset/six-wolves-admire.md | 23 - .changeset/slow-ducks-hunt.md | 5 - .changeset/slow-queens-visit.md | 5 - .changeset/slow-suits-rescue.md | 8 - .changeset/smart-islands-jog.md | 5 - .changeset/sour-rules-press.md | 5 - .changeset/stale-points-breathe.md | 5 - .changeset/strange-frogs-count.md | 5 - .changeset/stupid-ants-change.md | 5 - .changeset/sweet-hairs-complain.md | 5 - .changeset/sweet-pens-hunt.md | 24 - .changeset/swift-frogs-drop.md | 5 - .changeset/tall-countries-float.md | 5 - .changeset/tall-items-clap.md | 5 - .changeset/tall-peas-visit.md | 5 - .changeset/tame-jokes-do.md | 6 - .changeset/ten-wasps-serve.md | 8 - .changeset/tender-garlics-report.md | 5 - .changeset/tender-seals-yawn.md | 5 - .changeset/thick-pets-drive.md | 17 - .changeset/thin-dryers-repeat.md | 5 - .changeset/thin-ladybugs-lick.md | 5 - .changeset/three-hounds-wonder.md | 5 - .changeset/three-nails-remember.md | 7 - .changeset/tiny-bulldogs-grow.md | 5 - .changeset/tricky-melons-fold.md | 5 - .changeset/twelve-elephants-pay.md | 7 - .changeset/twenty-worms-enjoy.md | 7 - .changeset/warm-llamas-bake.md | 5 - .changeset/warm-panthers-lick.md | 5 - .changeset/weak-tomatoes-dance.md | 5 - .changeset/wet-donuts-fry.md | 5 - .changeset/wise-boxes-kiss.md | 5 - .changeset/wise-tables-add.md | 5 - .changeset/witty-ants-cover.md | 5 - .changeset/witty-pans-flash.md | 5 - .changeset/yellow-trains-protect.md | 13 - .changeset/yellow-yaks-behave.md | 7 - .changeset/young-ants-nail.md | 5 - .changeset/young-panthers-mix.md | 13 - docs/releases/v1.18.0-changelog.md | 4483 +++++++++++++++++ package.json | 2 +- packages/app-defaults/CHANGELOG.md | 13 + packages/app-defaults/package.json | 2 +- packages/app-next-example-plugin/CHANGELOG.md | 8 + packages/app-next-example-plugin/package.json | 2 +- packages/app-next/CHANGELOG.md | 77 + packages/app-next/package.json | 2 +- packages/app/CHANGELOG.md | 76 + packages/app/package.json | 2 +- packages/backend-app-api/CHANGELOG.md | 24 + packages/backend-app-api/package.json | 2 +- packages/backend-common/CHANGELOG.md | 22 + packages/backend-common/package.json | 2 +- packages/backend-defaults/CHANGELOG.md | 9 + packages/backend-defaults/package.json | 2 +- packages/backend-next/CHANGELOG.md | 35 + packages/backend-next/package.json | 2 +- packages/backend-openapi-utils/CHANGELOG.md | 7 + packages/backend-openapi-utils/package.json | 2 +- packages/backend-plugin-api/CHANGELOG.md | 13 + packages/backend-plugin-api/package.json | 2 +- packages/backend-plugin-manager/CHANGELOG.md | 23 + packages/backend-plugin-manager/package.json | 2 +- packages/backend-tasks/CHANGELOG.md | 18 + packages/backend-tasks/package.json | 2 +- packages/backend-test-utils/CHANGELOG.md | 16 + packages/backend-test-utils/package.json | 2 +- packages/backend/CHANGELOG.md | 59 + packages/backend/package.json | 2 +- packages/catalog-client/CHANGELOG.md | 9 + packages/catalog-client/package.json | 2 +- packages/catalog-model/CHANGELOG.md | 10 + packages/catalog-model/package.json | 2 +- packages/cli-node/CHANGELOG.md | 9 + packages/cli-node/package.json | 2 +- packages/cli/CHANGELOG.md | 29 + packages/cli/package.json | 2 +- packages/config-loader/CHANGELOG.md | 35 + packages/config-loader/package.json | 2 +- packages/config/CHANGELOG.md | 14 + packages/config/package.json | 2 +- packages/core-app-api/CHANGELOG.md | 19 + packages/core-app-api/package.json | 2 +- packages/core-components/CHANGELOG.md | 19 + packages/core-components/package.json | 2 +- packages/core-plugin-api/CHANGELOG.md | 16 + packages/core-plugin-api/package.json | 2 +- packages/create-app/CHANGELOG.md | 34 + packages/create-app/package.json | 2 +- packages/dev-utils/CHANGELOG.md | 17 + packages/dev-utils/package.json | 2 +- packages/e2e-test/CHANGELOG.md | 9 + packages/e2e-test/package.json | 2 +- packages/errors/CHANGELOG.md | 8 + packages/errors/package.json | 2 +- packages/frontend-app-api/CHANGELOG.md | 17 + packages/frontend-app-api/package.json | 2 +- packages/frontend-plugin-api/CHANGELOG.md | 12 + packages/frontend-plugin-api/package.json | 2 +- packages/integration-aws-node/CHANGELOG.md | 8 + packages/integration-aws-node/package.json | 2 +- packages/integration-react/CHANGELOG.md | 14 + packages/integration-react/package.json | 2 +- packages/integration/CHANGELOG.md | 33 + packages/integration/package.json | 2 +- packages/release-manifests/CHANGELOG.md | 7 + packages/release-manifests/package.json | 2 +- packages/repo-tools/CHANGELOG.md | 16 + packages/repo-tools/package.json | 2 +- .../techdocs-cli-embedded-app/CHANGELOG.md | 19 + .../techdocs-cli-embedded-app/package.json | 2 +- packages/techdocs-cli/CHANGELOG.md | 15 + packages/techdocs-cli/package.json | 2 +- packages/test-utils/CHANGELOG.md | 21 + packages/test-utils/package.json | 2 +- packages/theme/CHANGELOG.md | 6 + packages/theme/package.json | 2 +- packages/types/CHANGELOG.md | 6 + packages/types/package.json | 2 +- packages/version-bridge/CHANGELOG.md | 6 + packages/version-bridge/package.json | 2 +- plugins/adr-backend/CHANGELOG.md | 33 + plugins/adr-backend/package.json | 2 +- plugins/adr-common/CHANGELOG.md | 10 + plugins/adr-common/package.json | 2 +- plugins/adr/CHANGELOG.md | 18 + plugins/adr/package.json | 2 +- plugins/airbrake-backend/CHANGELOG.md | 27 + plugins/airbrake-backend/package.json | 2 +- plugins/airbrake/CHANGELOG.md | 16 + plugins/airbrake/package.json | 2 +- plugins/allure/CHANGELOG.md | 14 + plugins/allure/package.json | 2 +- plugins/analytics-module-ga/CHANGELOG.md | 12 + plugins/analytics-module-ga/package.json | 2 +- plugins/analytics-module-ga4/CHANGELOG.md | 12 + plugins/analytics-module-ga4/package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- plugins/apache-airflow/CHANGELOG.md | 11 + plugins/apache-airflow/package.json | 2 +- .../CHANGELOG.md | 7 + .../package.json | 2 +- plugins/api-docs/CHANGELOG.md | 14 + plugins/api-docs/package.json | 2 +- plugins/apollo-explorer/CHANGELOG.md | 12 + plugins/apollo-explorer/package.json | 2 +- plugins/app-backend/CHANGELOG.md | 29 + plugins/app-backend/package.json | 2 +- plugins/app-node/CHANGELOG.md | 7 + plugins/app-node/package.json | 2 +- .../CHANGELOG.md | 30 + .../package.json | 2 +- .../CHANGELOG.md | 29 + .../package.json | 2 +- .../CHANGELOG.md | 29 + .../package.json | 2 +- .../CHANGELOG.md | 28 + .../package.json | 2 +- .../CHANGELOG.md | 13 + .../package.json | 2 +- plugins/auth-backend/CHANGELOG.md | 43 + plugins/auth-backend/package.json | 2 +- plugins/auth-node/CHANGELOG.md | 41 + plugins/auth-node/package.json | 2 +- plugins/azure-devops-backend/CHANGELOG.md | 28 + plugins/azure-devops-backend/package.json | 2 +- plugins/azure-devops-common/CHANGELOG.md | 6 + plugins/azure-devops-common/package.json | 2 +- plugins/azure-devops/CHANGELOG.md | 16 + plugins/azure-devops/package.json | 2 +- plugins/azure-sites-backend/CHANGELOG.md | 9 + plugins/azure-sites-backend/package.json | 2 +- plugins/azure-sites-common/CHANGELOG.md | 6 + plugins/azure-sites-common/package.json | 2 +- plugins/azure-sites/CHANGELOG.md | 15 + plugins/azure-sites/package.json | 2 +- plugins/badges-backend/CHANGELOG.md | 32 + plugins/badges-backend/package.json | 2 +- plugins/badges/CHANGELOG.md | 15 + plugins/badges/package.json | 2 +- plugins/bazaar-backend/CHANGELOG.md | 30 + plugins/bazaar-backend/package.json | 2 +- plugins/bazaar/CHANGELOG.md | 17 + plugins/bazaar/package.json | 2 +- plugins/bitbucket-cloud-common/CHANGELOG.md | 8 + plugins/bitbucket-cloud-common/package.json | 2 +- plugins/bitrise/CHANGELOG.md | 14 + plugins/bitrise/package.json | 2 +- .../catalog-backend-module-aws/CHANGELOG.md | 34 + .../catalog-backend-module-aws/package.json | 2 +- .../catalog-backend-module-azure/CHANGELOG.md | 35 + .../catalog-backend-module-azure/package.json | 2 +- .../CHANGELOG.md | 33 + .../package.json | 2 +- .../CHANGELOG.md | 30 + .../package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../catalog-backend-module-gcp/CHANGELOG.md | 33 + .../catalog-backend-module-gcp/package.json | 2 +- .../CHANGELOG.md | 30 + .../package.json | 2 +- .../CHANGELOG.md | 42 + .../package.json | 2 +- .../CHANGELOG.md | 47 + .../package.json | 2 +- .../CHANGELOG.md | 32 + .../package.json | 2 +- .../catalog-backend-module-ldap/CHANGELOG.md | 13 + .../catalog-backend-module-ldap/package.json | 2 +- .../CHANGELOG.md | 29 + .../package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../CHANGELOG.md | 30 + .../package.json | 2 +- .../CHANGELOG.md | 16 + .../package.json | 2 +- .../CHANGELOG.md | 27 + .../package.json | 2 +- plugins/catalog-backend/CHANGELOG.md | 57 + plugins/catalog-backend/package.json | 2 +- plugins/catalog-common/CHANGELOG.md | 10 + plugins/catalog-common/package.json | 2 +- plugins/catalog-customized/CHANGELOG.md | 8 + plugins/catalog-customized/package.json | 2 +- plugins/catalog-graph/CHANGELOG.md | 14 + plugins/catalog-graph/package.json | 2 +- plugins/catalog-graphql/CHANGELOG.md | 9 + plugins/catalog-graphql/package.json | 2 +- plugins/catalog-import/CHANGELOG.md | 21 + plugins/catalog-import/package.json | 2 +- plugins/catalog-node/CHANGELOG.md | 12 + plugins/catalog-node/package.json | 2 +- plugins/catalog-react/CHANGELOG.md | 21 + plugins/catalog-react/package.json | 2 +- .../catalog-unprocessed-entities/CHANGELOG.md | 14 + .../catalog-unprocessed-entities/package.json | 2 +- plugins/catalog/CHANGELOG.md | 26 + plugins/catalog/package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- plugins/cicd-statistics/CHANGELOG.md | 10 + plugins/cicd-statistics/package.json | 2 +- plugins/circleci/CHANGELOG.md | 14 + plugins/circleci/package.json | 2 +- plugins/cloudbuild/CHANGELOG.md | 15 + plugins/cloudbuild/package.json | 2 +- plugins/code-climate/CHANGELOG.md | 14 + plugins/code-climate/package.json | 2 +- plugins/code-coverage-backend/CHANGELOG.md | 28 + plugins/code-coverage-backend/package.json | 2 +- plugins/code-coverage/CHANGELOG.md | 16 + plugins/code-coverage/package.json | 2 +- plugins/codescene/CHANGELOG.md | 15 + plugins/codescene/package.json | 2 +- plugins/config-schema/CHANGELOG.md | 15 + plugins/config-schema/package.json | 2 +- plugins/cost-insights-common/CHANGELOG.md | 6 + plugins/cost-insights-common/package.json | 2 +- plugins/cost-insights/CHANGELOG.md | 16 + plugins/cost-insights/package.json | 2 +- plugins/devtools-backend/CHANGELOG.md | 36 + plugins/devtools-backend/package.json | 2 +- plugins/devtools-common/CHANGELOG.md | 10 + plugins/devtools-common/package.json | 2 +- plugins/devtools/CHANGELOG.md | 16 + plugins/devtools/package.json | 2 +- plugins/dynatrace/CHANGELOG.md | 14 + plugins/dynatrace/package.json | 2 +- plugins/entity-feedback-backend/CHANGELOG.md | 32 + plugins/entity-feedback-backend/package.json | 2 +- plugins/entity-feedback-common/CHANGELOG.md | 6 + plugins/entity-feedback-common/package.json | 2 +- plugins/entity-feedback/CHANGELOG.md | 16 + plugins/entity-feedback/package.json | 2 +- plugins/entity-validation/CHANGELOG.md | 17 + plugins/entity-validation/package.json | 2 +- .../CHANGELOG.md | 28 + .../package.json | 2 +- .../events-backend-module-azure/CHANGELOG.md | 8 + .../events-backend-module-azure/package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../events-backend-module-gerrit/CHANGELOG.md | 8 + .../events-backend-module-gerrit/package.json | 2 +- .../events-backend-module-github/CHANGELOG.md | 9 + .../events-backend-module-github/package.json | 2 +- .../events-backend-module-gitlab/CHANGELOG.md | 9 + .../events-backend-module-gitlab/package.json | 2 +- .../events-backend-test-utils/CHANGELOG.md | 7 + .../events-backend-test-utils/package.json | 2 +- plugins/events-backend/CHANGELOG.md | 26 + plugins/events-backend/package.json | 2 +- plugins/events-node/CHANGELOG.md | 7 + plugins/events-node/package.json | 2 +- .../example-todo-list-backend/CHANGELOG.md | 11 + .../example-todo-list-backend/package.json | 2 +- plugins/example-todo-list-common/CHANGELOG.md | 7 + plugins/example-todo-list-common/package.json | 2 +- plugins/example-todo-list/CHANGELOG.md | 9 + plugins/example-todo-list/package.json | 2 +- plugins/explore-backend/CHANGELOG.md | 12 + plugins/explore-backend/package.json | 2 +- plugins/explore-common/CHANGELOG.md | 6 + plugins/explore-common/package.json | 2 +- plugins/explore-react/CHANGELOG.md | 10 + plugins/explore-react/package.json | 2 +- plugins/explore/CHANGELOG.md | 18 + plugins/explore/package.json | 2 +- plugins/firehydrant/CHANGELOG.md | 14 + plugins/firehydrant/package.json | 2 +- plugins/fossa/CHANGELOG.md | 15 + plugins/fossa/package.json | 2 +- plugins/gcalendar/CHANGELOG.md | 14 + plugins/gcalendar/package.json | 2 +- plugins/gcp-projects/CHANGELOG.md | 12 + plugins/gcp-projects/package.json | 2 +- plugins/git-release-manager/CHANGELOG.md | 12 + plugins/git-release-manager/package.json | 2 +- plugins/github-actions/CHANGELOG.md | 16 + plugins/github-actions/package.json | 2 +- plugins/github-deployments/CHANGELOG.md | 17 + plugins/github-deployments/package.json | 2 +- plugins/github-issues/CHANGELOG.md | 16 + plugins/github-issues/package.json | 2 +- .../github-pull-requests-board/CHANGELOG.md | 15 + .../github-pull-requests-board/package.json | 2 +- plugins/gitops-profiles/CHANGELOG.md | 13 + plugins/gitops-profiles/package.json | 2 +- plugins/gocd/CHANGELOG.md | 14 + plugins/gocd/package.json | 2 +- plugins/graphiql/CHANGELOG.md | 15 + plugins/graphiql/package.json | 2 +- plugins/graphql-backend/CHANGELOG.md | 9 + plugins/graphql-backend/package.json | 2 +- plugins/graphql-voyager/CHANGELOG.md | 12 + plugins/graphql-voyager/package.json | 2 +- plugins/home-react/CHANGELOG.md | 15 + plugins/home-react/package.json | 2 +- plugins/home/CHANGELOG.md | 22 + plugins/home/package.json | 2 +- plugins/ilert/CHANGELOG.md | 16 + plugins/ilert/package.json | 2 +- plugins/jenkins-backend/CHANGELOG.md | 15 + plugins/jenkins-backend/package.json | 2 +- plugins/jenkins-common/CHANGELOG.md | 9 + plugins/jenkins-common/package.json | 2 +- plugins/jenkins/CHANGELOG.md | 16 + plugins/jenkins/package.json | 2 +- plugins/kafka-backend/CHANGELOG.md | 29 + plugins/kafka-backend/package.json | 2 +- plugins/kafka/CHANGELOG.md | 15 + plugins/kafka/package.json | 2 +- plugins/kubernetes-backend/CHANGELOG.md | 46 + plugins/kubernetes-backend/package.json | 2 +- plugins/kubernetes-common/CHANGELOG.md | 11 + plugins/kubernetes-common/package.json | 2 +- plugins/kubernetes/CHANGELOG.md | 21 + plugins/kubernetes/package.json | 2 +- plugins/lighthouse-backend/CHANGELOG.md | 33 + plugins/lighthouse-backend/package.json | 2 +- plugins/lighthouse-common/CHANGELOG.md | 8 + plugins/lighthouse-common/package.json | 2 +- plugins/lighthouse/CHANGELOG.md | 16 + plugins/lighthouse/package.json | 2 +- plugins/linguist-backend/CHANGELOG.md | 37 + plugins/linguist-backend/package.json | 2 +- plugins/linguist-common/CHANGELOG.md | 6 + plugins/linguist-common/package.json | 2 +- plugins/linguist/CHANGELOG.md | 16 + plugins/linguist/package.json | 2 +- plugins/microsoft-calendar/CHANGELOG.md | 14 + plugins/microsoft-calendar/package.json | 2 +- plugins/newrelic-dashboard/CHANGELOG.md | 13 + plugins/newrelic-dashboard/package.json | 2 +- plugins/newrelic/CHANGELOG.md | 13 + plugins/newrelic/package.json | 2 +- plugins/nomad-backend/CHANGELOG.md | 9 + plugins/nomad-backend/package.json | 2 +- plugins/nomad/CHANGELOG.md | 15 + plugins/nomad/package.json | 2 +- plugins/octopus-deploy/CHANGELOG.md | 14 + plugins/octopus-deploy/package.json | 2 +- plugins/opencost/CHANGELOG.md | 15 + plugins/opencost/package.json | 2 +- plugins/org-react/CHANGELOG.md | 15 + plugins/org-react/package.json | 2 +- plugins/org/CHANGELOG.md | 16 + plugins/org/package.json | 2 +- plugins/pagerduty/CHANGELOG.md | 16 + plugins/pagerduty/package.json | 2 +- plugins/periskop-backend/CHANGELOG.md | 27 + plugins/periskop-backend/package.json | 2 +- plugins/periskop/CHANGELOG.md | 15 + plugins/periskop/package.json | 2 +- .../CHANGELOG.md | 31 + .../package.json | 2 +- plugins/permission-backend/CHANGELOG.md | 31 + plugins/permission-backend/package.json | 2 +- plugins/permission-common/CHANGELOG.md | 10 + plugins/permission-common/package.json | 2 +- plugins/permission-node/CHANGELOG.md | 13 + plugins/permission-node/package.json | 2 +- plugins/permission-react/CHANGELOG.md | 10 + plugins/permission-react/package.json | 2 +- plugins/playlist-backend/CHANGELOG.md | 15 + plugins/playlist-backend/package.json | 2 +- plugins/playlist-common/CHANGELOG.md | 8 + plugins/playlist-common/package.json | 2 +- plugins/playlist/CHANGELOG.md | 26 + plugins/playlist/package.json | 2 +- plugins/proxy-backend/CHANGELOG.md | 31 + plugins/proxy-backend/package.json | 2 +- plugins/puppetdb/CHANGELOG.md | 15 + plugins/puppetdb/package.json | 2 +- plugins/rollbar-backend/CHANGELOG.md | 8 + plugins/rollbar-backend/package.json | 2 +- plugins/rollbar/CHANGELOG.md | 14 + plugins/rollbar/package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- plugins/scaffolder-backend/CHANGELOG.md | 55 + plugins/scaffolder-backend/package.json | 2 +- plugins/scaffolder-common/CHANGELOG.md | 10 + plugins/scaffolder-common/package.json | 2 +- plugins/scaffolder-node/CHANGELOG.md | 13 + plugins/scaffolder-node/package.json | 2 +- plugins/scaffolder-react/CHANGELOG.md | 22 + plugins/scaffolder-react/package.json | 2 +- plugins/scaffolder/CHANGELOG.md | 32 + plugins/scaffolder/package.json | 2 +- .../CHANGELOG.md | 34 + .../package.json | 2 +- .../CHANGELOG.md | 28 + .../package.json | 2 +- .../CHANGELOG.md | 29 + .../package.json | 2 +- plugins/search-backend-module-pg/CHANGELOG.md | 28 + plugins/search-backend-module-pg/package.json | 2 +- .../CHANGELOG.md | 34 + .../package.json | 2 +- plugins/search-backend-node/CHANGELOG.md | 13 + plugins/search-backend-node/package.json | 2 +- plugins/search-backend/CHANGELOG.md | 33 + plugins/search-backend/package.json | 2 +- plugins/search-common/CHANGELOG.md | 9 + plugins/search-common/package.json | 2 +- plugins/search-react/CHANGELOG.md | 27 + plugins/search-react/package.json | 2 +- plugins/search/CHANGELOG.md | 31 + plugins/search/package.json | 2 +- plugins/sentry/CHANGELOG.md | 14 + plugins/sentry/package.json | 2 +- plugins/shortcuts/CHANGELOG.md | 13 + plugins/shortcuts/package.json | 2 +- plugins/sonarqube-backend/CHANGELOG.md | 9 + plugins/sonarqube-backend/package.json | 2 +- plugins/sonarqube-react/CHANGELOG.md | 9 + plugins/sonarqube-react/package.json | 2 +- plugins/sonarqube/CHANGELOG.md | 16 + plugins/sonarqube/package.json | 2 +- plugins/splunk-on-call/CHANGELOG.md | 14 + plugins/splunk-on-call/package.json | 2 +- plugins/stack-overflow-backend/CHANGELOG.md | 9 + plugins/stack-overflow-backend/package.json | 2 +- plugins/stack-overflow/CHANGELOG.md | 15 + plugins/stack-overflow/package.json | 2 +- plugins/stackstorm/CHANGELOG.md | 12 + plugins/stackstorm/package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- plugins/tech-insights-backend/CHANGELOG.md | 17 + plugins/tech-insights-backend/package.json | 2 +- plugins/tech-insights-common/CHANGELOG.md | 8 + plugins/tech-insights-common/package.json | 2 +- plugins/tech-insights-node/CHANGELOG.md | 11 + plugins/tech-insights-node/package.json | 2 +- plugins/tech-insights/CHANGELOG.md | 16 + plugins/tech-insights/package.json | 2 +- plugins/tech-radar/CHANGELOG.md | 16 + plugins/tech-radar/package.json | 2 +- .../techdocs-addons-test-utils/CHANGELOG.md | 18 + .../techdocs-addons-test-utils/package.json | 2 +- plugins/techdocs-backend/CHANGELOG.md | 41 + plugins/techdocs-backend/package.json | 2 +- .../CHANGELOG.md | 18 + .../package.json | 2 +- plugins/techdocs-node/CHANGELOG.md | 18 + plugins/techdocs-node/package.json | 2 +- plugins/techdocs-react/CHANGELOG.md | 16 + plugins/techdocs-react/package.json | 2 +- plugins/techdocs/CHANGELOG.md | 25 + plugins/techdocs/package.json | 2 +- plugins/todo-backend/CHANGELOG.md | 37 + plugins/todo-backend/package.json | 2 +- plugins/todo/CHANGELOG.md | 19 + plugins/todo/package.json | 2 +- plugins/user-settings-backend/CHANGELOG.md | 34 + plugins/user-settings-backend/package.json | 2 +- plugins/user-settings/CHANGELOG.md | 22 + plugins/user-settings/package.json | 2 +- plugins/vault-backend/CHANGELOG.md | 15 + plugins/vault-backend/package.json | 2 +- plugins/vault/CHANGELOG.md | 20 + plugins/vault/package.json | 2 +- plugins/xcmetrics/CHANGELOG.md | 18 + plugins/xcmetrics/package.json | 2 +- yarn.lock | 534 +- 657 files changed, 9248 insertions(+), 2495 deletions(-) delete mode 100644 .changeset/afraid-apes-smell.md delete mode 100644 .changeset/angry-ghosts-brush.md delete mode 100644 .changeset/big-bananas-sleep.md delete mode 100644 .changeset/big-masks-divide.md delete mode 100644 .changeset/big-spies-agree.md delete mode 100644 .changeset/blue-rats-drop.md delete mode 100644 .changeset/brave-books-pretend.md delete mode 100644 .changeset/brave-carrots-occur.md delete mode 100644 .changeset/brown-cameras-marry.md delete mode 100644 .changeset/calm-cups-smile.md delete mode 100644 .changeset/catalog-everybody-to-the-limit.md delete mode 100644 .changeset/chatty-goats-mate.md delete mode 100644 .changeset/chatty-spiders-serve.md delete mode 100644 .changeset/chilled-beds-exist.md delete mode 100644 .changeset/chilly-balloons-enjoy.md delete mode 100644 .changeset/chilly-parrots-yell.md delete mode 100644 .changeset/clean-houses-invent.md delete mode 100644 .changeset/clean-icons-wonder.md delete mode 100644 .changeset/cold-apricots-poke.md delete mode 100644 .changeset/cold-pillows-glow.md delete mode 100644 .changeset/create-app-1692704146.md delete mode 100644 .changeset/create-app-1693311380.md delete mode 100644 .changeset/cuddly-avocados-warn.md delete mode 100644 .changeset/curvy-roses-march.md delete mode 100644 .changeset/cyan-roses-relate.md delete mode 100644 .changeset/dirty-boxes-give.md delete mode 100644 .changeset/dirty-carrots-notice.md delete mode 100644 .changeset/dirty-cars-poke.md delete mode 100644 .changeset/dirty-cars-smoke.md delete mode 100644 .changeset/dirty-garlics-kiss.md delete mode 100644 .changeset/dirty-years-travel.md delete mode 100644 .changeset/dry-wasps-occur.md delete mode 100644 .changeset/dry-yaks-type.md delete mode 100644 .changeset/dull-eyes-pay.md delete mode 100644 .changeset/dull-tables-joke.md delete mode 100644 .changeset/early-rules-taste.md delete mode 100644 .changeset/early-trains.draw.md delete mode 100644 .changeset/eight-radios-listen.md delete mode 100644 .changeset/eight-timers-sin.md delete mode 100644 .changeset/eighty-emus-float.md delete mode 100644 .changeset/eighty-fans-provide.md delete mode 100644 .changeset/empty-rings-type.md delete mode 100644 .changeset/fair-paws-flash.md delete mode 100644 .changeset/few-nails-smile.md delete mode 100644 .changeset/fifty-adults-shake.md delete mode 100644 .changeset/fifty-pigs-travel.md delete mode 100644 .changeset/flat-beans-kiss.md delete mode 100644 .changeset/forty-rocks-jog.md delete mode 100644 .changeset/four-masks-fry.md delete mode 100644 .changeset/four-parents-visit.md delete mode 100644 .changeset/fresh-candles-warn.md delete mode 100644 .changeset/friendly-pugs-lick.md delete mode 100644 .changeset/friendly-teachers-attend.md delete mode 100644 .changeset/funny-ligers-matter.md delete mode 100644 .changeset/funny-timers-retire.md delete mode 100644 .changeset/giant-coats-brush.md delete mode 100644 .changeset/gorgeous-coins-attack.md delete mode 100644 .changeset/great-chairs-swim.md delete mode 100644 .changeset/grumpy-bikes-beg.md delete mode 100644 .changeset/grumpy-papayas-tie.md delete mode 100644 .changeset/grumpy-ties-know.md delete mode 100644 .changeset/healthy-spiders-arrive.md delete mode 100644 .changeset/healthy-tools-count.md delete mode 100644 .changeset/hip-seahorses-exist.md delete mode 100644 .changeset/honest-ads-rush.md delete mode 100644 .changeset/hungry-cherries-speak.md delete mode 100644 .changeset/hungry-dots-design.md delete mode 100644 .changeset/khaki-pigs-accept.md delete mode 100644 .changeset/khaki-spiders-sniff.md delete mode 100644 .changeset/late-cows-turn.md delete mode 100644 .changeset/late-hounds-yell.md delete mode 100644 .changeset/late-roses-dream.md delete mode 100644 .changeset/lazy-pumas-hope.md delete mode 100644 .changeset/lazy-pumas-shop.md delete mode 100644 .changeset/lazy-rice-rule.md delete mode 100644 .changeset/lemon-donuts-clap.md delete mode 100644 .changeset/light-clocks-listen.md delete mode 100644 .changeset/light-drinks-rush.md delete mode 100644 .changeset/long-flowers-sort.md delete mode 100644 .changeset/loud-apricots-destroy.md delete mode 100644 .changeset/lovely-years-sniff.md delete mode 100644 .changeset/lucky-chicken-hear.md delete mode 100644 .changeset/lucky-chicken-lie.md delete mode 100644 .changeset/many-panthers-wink.md delete mode 100644 .changeset/many-tips-attend.md delete mode 100644 .changeset/mean-carpets-provide.md delete mode 100644 .changeset/mean-planes-smoke.md delete mode 100644 .changeset/mean-queens-act.md delete mode 100644 .changeset/mighty-crabs-cheat.md delete mode 100644 .changeset/modern-trees-add.md delete mode 100644 .changeset/nasty-cherries-exercise.md delete mode 100644 .changeset/nasty-forks-beg.md delete mode 100644 .changeset/nasty-snails-complain.md delete mode 100644 .changeset/nasty-worms-share.md delete mode 100644 .changeset/new-frogs-punch.md delete mode 100644 .changeset/new-sheep-cover.md delete mode 100644 .changeset/nice-forks-remain.md delete mode 100644 .changeset/nine-taxis-study.md delete mode 100644 .changeset/ninety-horses-remember.md delete mode 100644 .changeset/ninety-news-visit.md delete mode 100644 .changeset/old-geese-drive.md delete mode 100644 .changeset/old-windows-argue.md delete mode 100644 .changeset/orange-houses-fly.md delete mode 100644 .changeset/pink-cups-rescue.md delete mode 100644 .changeset/pink-months-hammer.md delete mode 100644 .changeset/plenty-lamps-pump.md delete mode 100644 .changeset/polite-forks-grin.md delete mode 100644 .changeset/polite-plums-share.md delete mode 100644 .changeset/poor-olives-own.md delete mode 100644 .changeset/poor-years-appear.md delete mode 100644 .changeset/popular-clocks-whisper.md delete mode 100644 .changeset/popular-coins-tap.md delete mode 100644 .changeset/popular-readers-allow.md delete mode 100644 .changeset/pre.json delete mode 100644 .changeset/pretty-otters-whisper.md delete mode 100644 .changeset/proud-lamps-cross.md delete mode 100644 .changeset/purple-hotels-doubt.md delete mode 100644 .changeset/red-pens-knock.md delete mode 100644 .changeset/renovate-2ebf420.md delete mode 100644 .changeset/renovate-36e7f58.md delete mode 100644 .changeset/renovate-76185f9.md delete mode 100644 .changeset/renovate-b129f45.md delete mode 100644 .changeset/renovate-bbda8e8.md delete mode 100644 .changeset/repo-p-lisa.md delete mode 100644 .changeset/repo-tools-boo-descriptions-two-electric-boogaloo.md delete mode 100644 .changeset/repo-tools-boo-descriptions.md delete mode 100644 .changeset/repo-tools-ci-toldya-so.md delete mode 100644 .changeset/rich-fishes-deny.md delete mode 100644 .changeset/rotten-bees-wave.md delete mode 100644 .changeset/rude-dolphins-reply.md delete mode 100644 .changeset/short-planets-argue.md delete mode 100644 .changeset/silent-icons-deny.md delete mode 100644 .changeset/silent-numbers-retire.md delete mode 100644 .changeset/silly-emus-remain.md delete mode 100644 .changeset/silver-bananas-kick.md delete mode 100644 .changeset/six-radios-smile.md delete mode 100644 .changeset/six-wolves-admire.md delete mode 100644 .changeset/slow-ducks-hunt.md delete mode 100644 .changeset/slow-queens-visit.md delete mode 100644 .changeset/slow-suits-rescue.md delete mode 100644 .changeset/smart-islands-jog.md delete mode 100644 .changeset/sour-rules-press.md delete mode 100644 .changeset/stale-points-breathe.md delete mode 100644 .changeset/strange-frogs-count.md delete mode 100644 .changeset/stupid-ants-change.md delete mode 100644 .changeset/sweet-hairs-complain.md delete mode 100644 .changeset/sweet-pens-hunt.md delete mode 100644 .changeset/swift-frogs-drop.md delete mode 100644 .changeset/tall-countries-float.md delete mode 100644 .changeset/tall-items-clap.md delete mode 100644 .changeset/tall-peas-visit.md delete mode 100644 .changeset/tame-jokes-do.md delete mode 100644 .changeset/ten-wasps-serve.md delete mode 100644 .changeset/tender-garlics-report.md delete mode 100644 .changeset/tender-seals-yawn.md delete mode 100644 .changeset/thick-pets-drive.md delete mode 100644 .changeset/thin-dryers-repeat.md delete mode 100644 .changeset/thin-ladybugs-lick.md delete mode 100644 .changeset/three-hounds-wonder.md delete mode 100644 .changeset/three-nails-remember.md delete mode 100644 .changeset/tiny-bulldogs-grow.md delete mode 100644 .changeset/tricky-melons-fold.md delete mode 100644 .changeset/twelve-elephants-pay.md delete mode 100644 .changeset/twenty-worms-enjoy.md delete mode 100644 .changeset/warm-llamas-bake.md delete mode 100644 .changeset/warm-panthers-lick.md delete mode 100644 .changeset/weak-tomatoes-dance.md delete mode 100644 .changeset/wet-donuts-fry.md delete mode 100644 .changeset/wise-boxes-kiss.md delete mode 100644 .changeset/wise-tables-add.md delete mode 100644 .changeset/witty-ants-cover.md delete mode 100644 .changeset/witty-pans-flash.md delete mode 100644 .changeset/yellow-trains-protect.md delete mode 100644 .changeset/yellow-yaks-behave.md delete mode 100644 .changeset/young-ants-nail.md delete mode 100644 .changeset/young-panthers-mix.md create mode 100644 docs/releases/v1.18.0-changelog.md diff --git a/.changeset/afraid-apes-smell.md b/.changeset/afraid-apes-smell.md deleted file mode 100644 index 2654351ad8..0000000000 --- a/.changeset/afraid-apes-smell.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-kubernetes': patch -'@backstage/plugin-kubernetes-common': patch ---- - -Loosened the type of the `auth` field in the body of requests to the `retrieveObjectsByServiceId` endpoint. Now any JSON object is allowed, which should make it easier for integrators to write their own custom auth strategies for Kubernetes. diff --git a/.changeset/angry-ghosts-brush.md b/.changeset/angry-ghosts-brush.md deleted file mode 100644 index e1f3d7bc04..0000000000 --- a/.changeset/angry-ghosts-brush.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -'@backstage/create-app': patch ---- - -Updated the backend template to no longer create duplicate connection pools to plugins that use the task scheduler. - -To apply this change in your own repository, perform the following small update: - -```diff -// in packages/backend/src/index.ts -- const taskScheduler = TaskScheduler.fromConfig(config); -+ const taskScheduler = TaskScheduler.fromConfig(config, { databaseManager }); -``` diff --git a/.changeset/big-bananas-sleep.md b/.changeset/big-bananas-sleep.md deleted file mode 100644 index 71a0772720..0000000000 --- a/.changeset/big-bananas-sleep.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-playlist': patch ---- - -Updated latest playlist screen in readme document diff --git a/.changeset/big-masks-divide.md b/.changeset/big-masks-divide.md deleted file mode 100644 index f1d346ba7d..0000000000 --- a/.changeset/big-masks-divide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-home': patch ---- - -Fixed a bug where customizable home page cards would render missing their normal borders. diff --git a/.changeset/big-spies-agree.md b/.changeset/big-spies-agree.md deleted file mode 100644 index 1c544f4f36..0000000000 --- a/.changeset/big-spies-agree.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend-module-yeoman': patch ---- - -Enables dry-run functionality for the run:yeoman scaffolder action diff --git a/.changeset/blue-rats-drop.md b/.changeset/blue-rats-drop.md deleted file mode 100644 index 19b732be1a..0000000000 --- a/.changeset/blue-rats-drop.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-test-utils': patch ---- - -Introduced a new utility for testing service factories, `ServiceFactoryTester`. diff --git a/.changeset/brave-books-pretend.md b/.changeset/brave-books-pretend.md deleted file mode 100644 index ee80aedb18..0000000000 --- a/.changeset/brave-books-pretend.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-playlist': patch ---- - -change color of delete icon to secondary in playlist table diff --git a/.changeset/brave-carrots-occur.md b/.changeset/brave-carrots-occur.md deleted file mode 100644 index 017a9bdd8c..0000000000 --- a/.changeset/brave-carrots-occur.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-search-backend-module-pg': patch ---- - -Added `indexerBatchSize` option to be able to control the size of the batches being indexed. Also added a debug log entry to list out all the entities in the batch diff --git a/.changeset/brown-cameras-marry.md b/.changeset/brown-cameras-marry.md deleted file mode 100644 index cfa6911842..0000000000 --- a/.changeset/brown-cameras-marry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Added the ability to specify the listen address for the `--inspect` and `--inspect-brk` command. You can now set the `ip` and port of the `inspect` and `inspectBrk` by adding for example `--inspect=0.0.0.0:9229` diff --git a/.changeset/calm-cups-smile.md b/.changeset/calm-cups-smile.md deleted file mode 100644 index 68fcfb2d1a..0000000000 --- a/.changeset/calm-cups-smile.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -'@backstage/plugin-api-docs-module-protoc-gen-doc': patch -'@backstage/plugin-catalog-unprocessed-entities': patch -'@backstage/plugin-github-pull-requests-board': patch -'@backstage/integration-react': patch -'@backstage/plugin-github-deployments': patch -'@backstage/plugin-microsoft-calendar': patch -'@backstage/plugin-newrelic-dashboard': patch -'@backstage/plugin-entity-validation': patch -'@backstage/plugin-apollo-explorer': patch -'@backstage/plugin-gitops-profiles': patch -'@backstage/plugin-graphql-voyager': patch -'@backstage/plugin-apache-airflow': patch -'@backstage/plugin-github-actions': patch -'@backstage/plugin-octopus-deploy': patch -'@backstage/plugin-splunk-on-call': patch -'@backstage/plugin-config-schema': patch -'@backstage/plugin-github-issues': patch -'@backstage/plugin-azure-devops': patch -'@backstage/plugin-code-climate': patch -'@backstage/plugin-gcp-projects': patch -'@backstage/plugin-azure-sites': patch -'@backstage/plugin-firehydrant': patch -'@backstage/plugin-cloudbuild': patch -'@backstage/plugin-home-react': patch -'@backstage/plugin-lighthouse': patch -'@backstage/plugin-tech-radar': patch -'@backstage/plugin-codescene': patch -'@backstage/plugin-dynatrace': patch -'@backstage/plugin-gcalendar': patch -'@backstage/plugin-org-react': patch -'@backstage/plugin-shortcuts': patch -'@backstage/plugin-sonarqube': patch -'@backstage/plugin-xcmetrics': patch -'@backstage/plugin-airbrake': patch -'@backstage/plugin-circleci': patch -'@backstage/plugin-graphiql': patch -'@backstage/plugin-linguist': patch -'@backstage/plugin-newrelic': patch -'@backstage/plugin-opencost': patch -'@backstage/plugin-periskop': patch -'@backstage/plugin-playlist': patch -'@backstage/plugin-puppetdb': patch -'@backstage/plugin-bitrise': patch -'@backstage/plugin-jenkins': patch -'@backstage/plugin-rollbar': patch -'@backstage/plugin-allure': patch -'@backstage/plugin-badges': patch -'@backstage/plugin-bazaar': patch -'@backstage/plugin-sentry': patch -'@backstage/plugin-fossa': patch -'@backstage/plugin-ilert': patch -'@backstage/plugin-kafka': patch -'@backstage/plugin-nomad': patch -'@backstage/plugin-vault': patch -'@backstage/plugin-todo': patch -'@backstage/plugin-org': patch ---- - -Moved `@types/react` to be a regular dependency diff --git a/.changeset/catalog-everybody-to-the-limit.md b/.changeset/catalog-everybody-to-the-limit.md deleted file mode 100644 index 4c0177820e..0000000000 --- a/.changeset/catalog-everybody-to-the-limit.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Fix to the `limit` parameter on entity queries. diff --git a/.changeset/chatty-goats-mate.md b/.changeset/chatty-goats-mate.md deleted file mode 100644 index 2d4911c603..0000000000 --- a/.changeset/chatty-goats-mate.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-kubernetes-backend': patch -'@backstage/plugin-kubernetes-common': patch ---- - -Add AWS Annotations to Kubernetes Cluster Resource diff --git a/.changeset/chatty-spiders-serve.md b/.changeset/chatty-spiders-serve.md deleted file mode 100644 index e2b5e5630e..0000000000 --- a/.changeset/chatty-spiders-serve.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-app-api': patch ---- - -Add support for discovering additional service factories during startup. diff --git a/.changeset/chilled-beds-exist.md b/.changeset/chilled-beds-exist.md deleted file mode 100644 index 2023f6fb71..0000000000 --- a/.changeset/chilled-beds-exist.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-graphiql': patch ---- - -Add support for using the FetchApi diff --git a/.changeset/chilly-balloons-enjoy.md b/.changeset/chilly-balloons-enjoy.md deleted file mode 100644 index e541e4d4cc..0000000000 --- a/.changeset/chilly-balloons-enjoy.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/frontend-plugin-api': minor -'@backstage/frontend-app-api': minor ---- - -Initial release diff --git a/.changeset/chilly-parrots-yell.md b/.changeset/chilly-parrots-yell.md deleted file mode 100644 index fe4c760923..0000000000 --- a/.changeset/chilly-parrots-yell.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog': patch ---- - -Added title to props for `HasCards`. diff --git a/.changeset/clean-houses-invent.md b/.changeset/clean-houses-invent.md deleted file mode 100644 index fe4a252d48..0000000000 --- a/.changeset/clean-houses-invent.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-graphiql': patch ---- - -Added experimental exports for the new frontend system under `/alpha`. diff --git a/.changeset/clean-icons-wonder.md b/.changeset/clean-icons-wonder.md deleted file mode 100644 index b6beb58969..0000000000 --- a/.changeset/clean-icons-wonder.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-kubernetes-backend': patch ---- - -Handle Proxy WS upgrade manually for WS handshakes diff --git a/.changeset/cold-apricots-poke.md b/.changeset/cold-apricots-poke.md deleted file mode 100644 index b050c8082b..0000000000 --- a/.changeset/cold-apricots-poke.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Changed the processing loop task pipeline implementation from recursive to iterative diff --git a/.changeset/cold-pillows-glow.md b/.changeset/cold-pillows-glow.md deleted file mode 100644 index a3ff46327c..0000000000 --- a/.changeset/cold-pillows-glow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/create-app': patch ---- - -Switched the template to use TypeScript 5.2 by default. diff --git a/.changeset/create-app-1692704146.md b/.changeset/create-app-1692704146.md deleted file mode 100644 index b50d431d4b..0000000000 --- a/.changeset/create-app-1692704146.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/create-app': patch ---- - -Bumped create-app version. diff --git a/.changeset/create-app-1693311380.md b/.changeset/create-app-1693311380.md deleted file mode 100644 index b50d431d4b..0000000000 --- a/.changeset/create-app-1693311380.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/create-app': patch ---- - -Bumped create-app version. diff --git a/.changeset/cuddly-avocados-warn.md b/.changeset/cuddly-avocados-warn.md deleted file mode 100644 index aa70da287b..0000000000 --- a/.changeset/cuddly-avocados-warn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-techdocs-backend': patch ---- - -Expand techdocs.publisher.type with `googleGcs`,`awsS3`,`azureBlobStorage` and `openStackSwift` diff --git a/.changeset/curvy-roses-march.md b/.changeset/curvy-roses-march.md deleted file mode 100644 index cd38808165..0000000000 --- a/.changeset/curvy-roses-march.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-backend': patch ---- - -Migrated the GitLab auth provider to be implemented using the new `@backstage/plugin-auth-backend-module-gitlab-provider` module. diff --git a/.changeset/cyan-roses-relate.md b/.changeset/cyan-roses-relate.md deleted file mode 100644 index e6dbeb6ed9..0000000000 --- a/.changeset/cyan-roses-relate.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Added the ability to create a plain backend module with the `new` command. diff --git a/.changeset/dirty-boxes-give.md b/.changeset/dirty-boxes-give.md deleted file mode 100644 index d339e49c98..0000000000 --- a/.changeset/dirty-boxes-give.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/plugin-proxy-backend': patch ---- - -Add the route name to an error message that appears when the backend -proxy wasn't well configured. This will help users to understand the -issue and fix the right configuration. diff --git a/.changeset/dirty-carrots-notice.md b/.changeset/dirty-carrots-notice.md deleted file mode 100644 index ccc31c25ca..0000000000 --- a/.changeset/dirty-carrots-notice.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-backend': patch ---- - -Added `authPlugin` export for the new backend system. The plugin does not include any built-in auth providers, they must instead be added by installing additional modules, for example `authModuleGoogleProvider` from `@backstage/plugin-auth-backend-module-google-provider`. diff --git a/.changeset/dirty-cars-poke.md b/.changeset/dirty-cars-poke.md deleted file mode 100644 index 5412229f34..0000000000 --- a/.changeset/dirty-cars-poke.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -'@backstage/plugin-adr-backend': minor -'@backstage/plugin-airbrake-backend': minor -'@backstage/plugin-auth-backend': minor -'@backstage/plugin-azure-devops-backend': minor -'@backstage/plugin-badges-backend': minor -'@backstage/plugin-bazaar-backend': minor -'@backstage/plugin-catalog-backend-module-unprocessed': minor -'@backstage/plugin-devtools-backend': minor -'@backstage/plugin-entity-feedback-backend': minor -'@backstage/plugin-kafka-backend': minor -'@backstage/plugin-lighthouse-backend': minor -'@backstage/plugin-linguist-backend': minor -'@backstage/plugin-periskop-backend': minor -'@backstage/plugin-proxy-backend': minor -'@backstage/plugin-todo-backend': minor -'@backstage/plugin-user-settings-backend': minor ---- - -**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')); -``` diff --git a/.changeset/dirty-cars-smoke.md b/.changeset/dirty-cars-smoke.md deleted file mode 100644 index 5ba8380d68..0000000000 --- a/.changeset/dirty-cars-smoke.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -'@backstage/plugin-app-backend': patch -'@backstage/plugin-auth-backend-module-gcp-iap-provider': patch -'@backstage/plugin-auth-backend-module-github-provider': patch -'@backstage/plugin-auth-backend-module-gitlab-provider': patch -'@backstage/plugin-auth-backend-module-google-provider': patch -'@backstage/plugin-catalog-backend': patch -'@backstage/plugin-catalog-backend-module-aws': patch -'@backstage/plugin-catalog-backend-module-azure': patch -'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch -'@backstage/plugin-catalog-backend-module-bitbucket-server': patch -'@backstage/plugin-catalog-backend-module-gcp': patch -'@backstage/plugin-catalog-backend-module-gerrit': patch -'@backstage/plugin-catalog-backend-module-github': patch -'@backstage/plugin-catalog-backend-module-gitlab': patch -'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch -'@backstage/plugin-catalog-backend-module-msgraph': patch -'@backstage/plugin-catalog-backend-module-puppetdb': patch -'@backstage/plugin-events-backend': patch -'@backstage/plugin-events-backend-module-aws-sqs': patch -'@backstage/plugin-kubernetes-backend': patch -'@backstage/plugin-permission-backend': patch -'@backstage/plugin-permission-backend-module-allow-all-policy': patch -'@backstage/plugin-scaffolder-backend': patch -'@backstage/plugin-search-backend': patch -'@backstage/plugin-search-backend-module-catalog': patch -'@backstage/plugin-search-backend-module-elasticsearch': patch -'@backstage/plugin-search-backend-module-explore': patch -'@backstage/plugin-search-backend-module-pg': patch -'@backstage/plugin-search-backend-module-techdocs': patch -'@backstage/plugin-techdocs-backend': patch ---- - -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')); -``` diff --git a/.changeset/dirty-garlics-kiss.md b/.changeset/dirty-garlics-kiss.md deleted file mode 100644 index 98a9b569cc..0000000000 --- a/.changeset/dirty-garlics-kiss.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-tech-radar': patch ---- - -Add names to blip entry links in the radar to improve accessibility diff --git a/.changeset/dirty-years-travel.md b/.changeset/dirty-years-travel.md deleted file mode 100644 index e6e5b8a608..0000000000 --- a/.changeset/dirty-years-travel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-code-coverage-backend': patch ---- - -Added support for LCOV coverage reports diff --git a/.changeset/dry-wasps-occur.md b/.changeset/dry-wasps-occur.md deleted file mode 100644 index 0c7d231708..0000000000 --- a/.changeset/dry-wasps-occur.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-backend-module-gcp-iap-provider': minor ---- - -New module for `@backstage/plugin-auth-backend` that adds a GCP IAP auth provider. diff --git a/.changeset/dry-yaks-type.md b/.changeset/dry-yaks-type.md deleted file mode 100644 index 3e9cdef474..0000000000 --- a/.changeset/dry-yaks-type.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@backstage/backend-tasks': patch ---- - -When starting a task that existed before, with a faster schedule than it -previously had, the task will now correctly obey the faster schedule -immediately. Before this fix, the new schedule was only obeyed after the next -pending (according to the old schedule) run had completed. diff --git a/.changeset/dull-eyes-pay.md b/.changeset/dull-eyes-pay.md deleted file mode 100644 index 2a2b996051..0000000000 --- a/.changeset/dull-eyes-pay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-backend-module-oauth2-provider': minor ---- - -New module for `@backstage/plugin-auth-backend` that adds a `oauth2` auth provider. diff --git a/.changeset/dull-tables-joke.md b/.changeset/dull-tables-joke.md deleted file mode 100644 index e987377023..0000000000 --- a/.changeset/dull-tables-joke.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog': patch ---- - -Fixed an issue where `EntitySwitch` was preventing the display of entity errors. diff --git a/.changeset/early-rules-taste.md b/.changeset/early-rules-taste.md deleted file mode 100644 index 1a332dfe36..0000000000 --- a/.changeset/early-rules-taste.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -'@backstage/create-app': patch ---- - -Added a `fix` scripts that calls the new `backstage-cli repo fix` command. - -To apply this change to an existing app, make the following change to your root `package.json`: - -```diff - "test": "backstage-cli repo test", - "test:all": "backstage-cli repo test --coverage", -+ "fix": "backstage-cli repo fix", - "lint": "backstage-cli repo lint --since origin/master", -``` diff --git a/.changeset/early-trains.draw.md b/.changeset/early-trains.draw.md deleted file mode 100644 index 30aad1a08d..0000000000 --- a/.changeset/early-trains.draw.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-tech-radar': patch ---- - -Fixed the width of the tech radar dialog so that the content fits diff --git a/.changeset/eight-radios-listen.md b/.changeset/eight-radios-listen.md deleted file mode 100644 index 0421a561c0..0000000000 --- a/.changeset/eight-radios-listen.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-techdocs': patch ---- - -Fixed bug in styles that caused next and previous links in footer to overlap page content. diff --git a/.changeset/eight-timers-sin.md b/.changeset/eight-timers-sin.md deleted file mode 100644 index 28d6259cb4..0000000000 --- a/.changeset/eight-timers-sin.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-react': patch ---- - -Export the `EntityAutocompletePicker` component. diff --git a/.changeset/eighty-emus-float.md b/.changeset/eighty-emus-float.md deleted file mode 100644 index c149affa09..0000000000 --- a/.changeset/eighty-emus-float.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Add ESM loader for the experimental backend start command. diff --git a/.changeset/eighty-fans-provide.md b/.changeset/eighty-fans-provide.md deleted file mode 100644 index b98bc39924..0000000000 --- a/.changeset/eighty-fans-provide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-components': patch ---- - -Fixed an issue causing `StructuredMetadataTable` to crash in case metadata contained `null` values. diff --git a/.changeset/empty-rings-type.md b/.changeset/empty-rings-type.md deleted file mode 100644 index 2aa41054f9..0000000000 --- a/.changeset/empty-rings-type.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': patch ---- - -Add examples for `publish:github` and `publish:gitlab` scaffolder actions. diff --git a/.changeset/fair-paws-flash.md b/.changeset/fair-paws-flash.md deleted file mode 100644 index d9a7b1827e..0000000000 --- a/.changeset/fair-paws-flash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-azure': patch ---- - -Improve consistency of results from the `AzureDevOpsEntityProvider`. diff --git a/.changeset/few-nails-smile.md b/.changeset/few-nails-smile.md deleted file mode 100644 index 2fad9a0b40..0000000000 --- a/.changeset/few-nails-smile.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-entity-feedback': patch ---- - -Improve README to note that Backstage identity is required to be configured diff --git a/.changeset/fifty-adults-shake.md b/.changeset/fifty-adults-shake.md deleted file mode 100644 index a21c5805ab..0000000000 --- a/.changeset/fifty-adults-shake.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': minor ---- - -Allow configuring the processing interval in your app-config, under the `catalog.processingInterval` key. diff --git a/.changeset/fifty-pigs-travel.md b/.changeset/fifty-pigs-travel.md deleted file mode 100644 index 2f43badc52..0000000000 --- a/.changeset/fifty-pigs-travel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-kubernetes-backend': patch ---- - -Fixed a bug where requests to the proxy endpoint would fail for clusters with `caFile` configured diff --git a/.changeset/flat-beans-kiss.md b/.changeset/flat-beans-kiss.md deleted file mode 100644 index 4dfe06afdd..0000000000 --- a/.changeset/flat-beans-kiss.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-pagerduty': patch ---- - -Minor internal tweaks to improve tests diff --git a/.changeset/forty-rocks-jog.md b/.changeset/forty-rocks-jog.md deleted file mode 100644 index aff3d34a4a..0000000000 --- a/.changeset/forty-rocks-jog.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-kubernetes': patch -'@backstage/test-utils': patch ---- - -Add pod exec terminal to Container Card diff --git a/.changeset/four-masks-fry.md b/.changeset/four-masks-fry.md deleted file mode 100644 index 94bd929016..0000000000 --- a/.changeset/four-masks-fry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Update OpenAPI schema to relax the encoding validation of all request parameters. diff --git a/.changeset/four-parents-visit.md b/.changeset/four-parents-visit.md deleted file mode 100644 index 041380ce1e..0000000000 --- a/.changeset/four-parents-visit.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-common': patch ---- - -Avoid starting database keepalive loop in tests. diff --git a/.changeset/fresh-candles-warn.md b/.changeset/fresh-candles-warn.md deleted file mode 100644 index 49ca2e5402..0000000000 --- a/.changeset/fresh-candles-warn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-node': patch ---- - -The `BackstageIdentityResponse` interface now has an optional `expiresInSeconds` field that can be used to signal session expiration. The `prepareBackstageIdentityResponse` utility will now also read the expiration from the provided token, and include it in the response. diff --git a/.changeset/friendly-pugs-lick.md b/.changeset/friendly-pugs-lick.md deleted file mode 100644 index 3a82497da8..0000000000 --- a/.changeset/friendly-pugs-lick.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/config': minor ---- - -Added a `readDurationFromConfig` function diff --git a/.changeset/friendly-teachers-attend.md b/.changeset/friendly-teachers-attend.md deleted file mode 100644 index 6d5c3cf745..0000000000 --- a/.changeset/friendly-teachers-attend.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-common': patch ---- - -The root logger is now initialized lazily, fixing a circular dependency issue with `@backstage/backend-app-api` that would result in `Cannot read properties of undefined (reading 'redacter')`. diff --git a/.changeset/funny-ligers-matter.md b/.changeset/funny-ligers-matter.md deleted file mode 100644 index 0cec3eb333..0000000000 --- a/.changeset/funny-ligers-matter.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/backend-app-api': patch ---- - -Adds include and exclude configuration to feature discovery of backend packages -Adds alpha modules to feature discovery diff --git a/.changeset/funny-timers-retire.md b/.changeset/funny-timers-retire.md deleted file mode 100644 index 87cd4d8f0d..0000000000 --- a/.changeset/funny-timers-retire.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Added a new `repo fix` command that fixes auto-fixable problems in all packages. Initially the command fixes package export declarations, as well as marks all non-bundled frontend packages as side-effect free. Marking packages as free of side-effects can drastically reduce the Webpack bundle size. diff --git a/.changeset/giant-coats-brush.md b/.changeset/giant-coats-brush.md deleted file mode 100644 index e4fe391b9e..0000000000 --- a/.changeset/giant-coats-brush.md +++ /dev/null @@ -1,129 +0,0 @@ ---- -'@backstage/app-defaults': patch -'@backstage/catalog-client': patch -'@backstage/catalog-model': patch -'@backstage/config': patch -'@backstage/core-app-api': patch -'@backstage/core-components': patch -'@backstage/core-plugin-api': patch -'@backstage/dev-utils': patch -'@backstage/errors': patch -'@backstage/integration': patch -'@backstage/integration-react': patch -'@backstage/plugin-adr': patch -'@backstage/plugin-adr-common': patch -'@backstage/plugin-airbrake': patch -'@backstage/plugin-allure': patch -'@backstage/plugin-analytics-module-ga': patch -'@backstage/plugin-analytics-module-ga4': patch -'@backstage/plugin-analytics-module-newrelic-browser': patch -'@backstage/plugin-apache-airflow': patch -'@backstage/plugin-api-docs': patch -'@backstage/plugin-api-docs-module-protoc-gen-doc': patch -'@backstage/plugin-apollo-explorer': patch -'@backstage/plugin-azure-devops': patch -'@backstage/plugin-azure-devops-common': patch -'@backstage/plugin-azure-sites': patch -'@backstage/plugin-azure-sites-common': patch -'@backstage/plugin-badges': patch -'@backstage/plugin-bazaar': patch -'@backstage/plugin-bitbucket-cloud-common': patch -'@backstage/plugin-bitrise': patch -'@backstage/plugin-catalog': patch -'@backstage/plugin-catalog-common': patch -'@backstage/plugin-catalog-graph': patch -'@backstage/plugin-catalog-import': patch -'@backstage/plugin-catalog-react': patch -'@backstage/plugin-catalog-unprocessed-entities': patch -'@backstage/plugin-cicd-statistics': patch -'@backstage/plugin-cicd-statistics-module-gitlab': patch -'@backstage/plugin-circleci': patch -'@backstage/plugin-cloudbuild': patch -'@backstage/plugin-code-climate': patch -'@backstage/plugin-code-coverage': patch -'@backstage/plugin-codescene': patch -'@backstage/plugin-config-schema': patch -'@backstage/plugin-cost-insights': patch -'@backstage/plugin-cost-insights-common': patch -'@backstage/plugin-devtools': patch -'@backstage/plugin-devtools-common': patch -'@backstage/plugin-dynatrace': patch -'@backstage/plugin-entity-feedback': patch -'@backstage/plugin-entity-feedback-common': patch -'@backstage/plugin-entity-validation': patch -'@backstage/plugin-explore': patch -'@backstage/plugin-explore-common': patch -'@backstage/plugin-explore-react': patch -'@backstage/plugin-firehydrant': patch -'@backstage/plugin-fossa': patch -'@backstage/plugin-gcalendar': patch -'@backstage/plugin-gcp-projects': patch -'@backstage/plugin-git-release-manager': patch -'@backstage/plugin-github-actions': patch -'@backstage/plugin-github-deployments': patch -'@backstage/plugin-github-issues': patch -'@backstage/plugin-github-pull-requests-board': patch -'@backstage/plugin-gitops-profiles': patch -'@backstage/plugin-gocd': patch -'@backstage/plugin-graphiql': patch -'@backstage/plugin-graphql-voyager': patch -'@backstage/plugin-home': patch -'@backstage/plugin-home-react': patch -'@backstage/plugin-ilert': patch -'@backstage/plugin-jenkins': patch -'@backstage/plugin-jenkins-common': patch -'@backstage/plugin-kafka': patch -'@backstage/plugin-kubernetes': patch -'@backstage/plugin-kubernetes-common': patch -'@backstage/plugin-lighthouse': patch -'@backstage/plugin-lighthouse-common': patch -'@backstage/plugin-linguist': patch -'@backstage/plugin-linguist-common': patch -'@backstage/plugin-microsoft-calendar': patch -'@backstage/plugin-newrelic': patch -'@backstage/plugin-newrelic-dashboard': patch -'@backstage/plugin-nomad': patch -'@backstage/plugin-octopus-deploy': patch -'@backstage/plugin-opencost': patch -'@backstage/plugin-org': patch -'@backstage/plugin-org-react': patch -'@backstage/plugin-pagerduty': patch -'@backstage/plugin-periskop': patch -'@backstage/plugin-permission-common': patch -'@backstage/plugin-permission-react': patch -'@backstage/plugin-playlist': patch -'@backstage/plugin-playlist-common': patch -'@backstage/plugin-puppetdb': patch -'@backstage/plugin-rollbar': patch -'@backstage/plugin-scaffolder': patch -'@backstage/plugin-scaffolder-common': patch -'@backstage/plugin-scaffolder-react': patch -'@backstage/plugin-search': patch -'@backstage/plugin-search-common': patch -'@backstage/plugin-search-react': patch -'@backstage/plugin-sentry': patch -'@backstage/plugin-shortcuts': patch -'@backstage/plugin-sonarqube': patch -'@backstage/plugin-sonarqube-react': patch -'@backstage/plugin-splunk-on-call': patch -'@backstage/plugin-stack-overflow': patch -'@backstage/plugin-stackstorm': patch -'@backstage/plugin-tech-insights': patch -'@backstage/plugin-tech-insights-common': patch -'@backstage/plugin-tech-radar': patch -'@backstage/plugin-techdocs': patch -'@backstage/plugin-techdocs-addons-test-utils': patch -'@backstage/plugin-techdocs-module-addons-contrib': patch -'@backstage/plugin-techdocs-react': patch -'@backstage/plugin-todo': patch -'@backstage/plugin-user-settings': patch -'@backstage/plugin-vault': patch -'@backstage/plugin-xcmetrics': patch -'@backstage/release-manifests': patch -'@backstage/test-utils': patch -'@backstage/theme': patch -'@backstage/types': patch -'@backstage/version-bridge': patch ---- - -Mark package as being free of side effects, allowing more optimized Webpack builds. diff --git a/.changeset/gorgeous-coins-attack.md b/.changeset/gorgeous-coins-attack.md deleted file mode 100644 index d500459225..0000000000 --- a/.changeset/gorgeous-coins-attack.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-react': patch ---- - -Added delete alert popup when user delete the entity diff --git a/.changeset/great-chairs-swim.md b/.changeset/great-chairs-swim.md deleted file mode 100644 index e6b8ab0882..0000000000 --- a/.changeset/great-chairs-swim.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-app-api': minor ---- - -Fixed two bugs in how the `OAuth2Session` type represents the underlying data. The `expiresAt` and `backstageIdentity` are now both optional, since that's what they are in practice. This is not considered a breaking change since it was effectively a bug in the modelling of the state that this type represents, and the type was not used in any other external contract. diff --git a/.changeset/grumpy-bikes-beg.md b/.changeset/grumpy-bikes-beg.md deleted file mode 100644 index 6fe44ee748..0000000000 --- a/.changeset/grumpy-bikes-beg.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder': patch ---- - -Restored functionality to `OwnedEntityPicker` by converting deprecated `ui:options` input to `catalogFilter`. diff --git a/.changeset/grumpy-papayas-tie.md b/.changeset/grumpy-papayas-tie.md deleted file mode 100644 index 48580673d8..0000000000 --- a/.changeset/grumpy-papayas-tie.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/integration': patch ---- - -Additional fix for Gitiles auth links diff --git a/.changeset/grumpy-ties-know.md b/.changeset/grumpy-ties-know.md deleted file mode 100644 index 86e3b0ec7d..0000000000 --- a/.changeset/grumpy-ties-know.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/create-app': patch ---- - -Add a notification when `yarn install` is taking a long time. diff --git a/.changeset/healthy-spiders-arrive.md b/.changeset/healthy-spiders-arrive.md deleted file mode 100644 index e8d110ccaa..0000000000 --- a/.changeset/healthy-spiders-arrive.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-org': patch ---- - -Ensure direct relations are shown for User entities while keeping support for aggregating closest parent group ownership diff --git a/.changeset/healthy-tools-count.md b/.changeset/healthy-tools-count.md deleted file mode 100644 index 5d3f04159f..0000000000 --- a/.changeset/healthy-tools-count.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-backend': patch ---- - -Deprecated several exports that are now available from `@backstage/plugin-auth-node` instead. diff --git a/.changeset/hip-seahorses-exist.md b/.changeset/hip-seahorses-exist.md deleted file mode 100644 index e8e247cc0a..0000000000 --- a/.changeset/hip-seahorses-exist.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-home': patch ---- - -Align zod dependency to align with other packages. diff --git a/.changeset/honest-ads-rush.md b/.changeset/honest-ads-rush.md deleted file mode 100644 index 63510f7c1a..0000000000 --- a/.changeset/honest-ads-rush.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': patch ---- - -Add examples for `publish:bitbucket` scaffolder actions. diff --git a/.changeset/hungry-cherries-speak.md b/.changeset/hungry-cherries-speak.md deleted file mode 100644 index bd67f61446..0000000000 --- a/.changeset/hungry-cherries-speak.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-test-utils': patch ---- - -Add support for installing backend features via module imports, for example `startTestBackend({ features: [import('my-plugin')] })`. diff --git a/.changeset/hungry-dots-design.md b/.changeset/hungry-dots-design.md deleted file mode 100644 index 0dd8d415e9..0000000000 --- a/.changeset/hungry-dots-design.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-azure': patch -'@backstage/plugin-scaffolder-backend': patch -'@backstage/backend-common': patch ---- - -Use `DefaultAzureDevOpsCredentialsProvider` to retrieve credentials for Azure DevOps. diff --git a/.changeset/khaki-pigs-accept.md b/.changeset/khaki-pigs-accept.md deleted file mode 100644 index e00db1746f..0000000000 --- a/.changeset/khaki-pigs-accept.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/plugin-devtools-backend': patch -'@backstage/plugin-devtools-common': patch -'@backstage/plugin-devtools': patch ---- - -Show resource utilization in `DevTools` plugin diff --git a/.changeset/khaki-spiders-sniff.md b/.changeset/khaki-spiders-sniff.md deleted file mode 100644 index 53798a6cf0..0000000000 --- a/.changeset/khaki-spiders-sniff.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-user-settings': patch ---- - -conditionally rendering the user email in user profile card diff --git a/.changeset/late-cows-turn.md b/.changeset/late-cows-turn.md deleted file mode 100644 index 7fa775ce22..0000000000 --- a/.changeset/late-cows-turn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Fixed a link to the frontend Backstage plugin that had pointed to itself. diff --git a/.changeset/late-hounds-yell.md b/.changeset/late-hounds-yell.md deleted file mode 100644 index 903b161c35..0000000000 --- a/.changeset/late-hounds-yell.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/create-app': patch ---- - -Updated Dockerfile to include `apt-get update` when installing the SQLite dependency diff --git a/.changeset/late-roses-dream.md b/.changeset/late-roses-dream.md deleted file mode 100644 index b0c2316c95..0000000000 --- a/.changeset/late-roses-dream.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-code-coverage-backend': patch ---- - -Add text body parser for LCOV reports diff --git a/.changeset/lazy-pumas-hope.md b/.changeset/lazy-pumas-hope.md deleted file mode 100644 index 5e06014a3c..0000000000 --- a/.changeset/lazy-pumas-hope.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-user-settings': patch ---- - -changed auto theme tooltip title to camel case diff --git a/.changeset/lazy-pumas-shop.md b/.changeset/lazy-pumas-shop.md deleted file mode 100644 index 13524aa741..0000000000 --- a/.changeset/lazy-pumas-shop.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@backstage/plugin-kubernetes-backend': patch -'@backstage/plugin-permission-backend': patch -'@backstage/plugin-techdocs-backend': patch -'@backstage/plugin-permission-node': patch ---- - -Minor `package.json` update. diff --git a/.changeset/lazy-rice-rule.md b/.changeset/lazy-rice-rule.md deleted file mode 100644 index 1c3a3c3250..0000000000 --- a/.changeset/lazy-rice-rule.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': patch ---- - -Fixed the plugin and module ID of the alpha `catalogModuleTemplateKind` export. diff --git a/.changeset/lemon-donuts-clap.md b/.changeset/lemon-donuts-clap.md deleted file mode 100644 index 75408d2584..0000000000 --- a/.changeset/lemon-donuts-clap.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-plugin-api': patch ---- - -Ensure that root scoped services cannot accept (at a type level) plugin scoped deps diff --git a/.changeset/light-clocks-listen.md b/.changeset/light-clocks-listen.md deleted file mode 100644 index e3d841ad7d..0000000000 --- a/.changeset/light-clocks-listen.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-kubernetes': patch ---- - -Avoid eager use of `TextEncoder` in order not to break tests. diff --git a/.changeset/light-drinks-rush.md b/.changeset/light-drinks-rush.md deleted file mode 100644 index 08383ab089..0000000000 --- a/.changeset/light-drinks-rush.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Add experimental support for frontend package discovery. diff --git a/.changeset/long-flowers-sort.md b/.changeset/long-flowers-sort.md deleted file mode 100644 index 2f25260030..0000000000 --- a/.changeset/long-flowers-sort.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-org': patch ---- - -Entity relations toggle should by default be aggregated for User entities diff --git a/.changeset/loud-apricots-destroy.md b/.changeset/loud-apricots-destroy.md deleted file mode 100644 index e60be6dccf..0000000000 --- a/.changeset/loud-apricots-destroy.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-tech-radar': patch ---- - -Add description property for Rings which will be shown in the footer. diff --git a/.changeset/lovely-years-sniff.md b/.changeset/lovely-years-sniff.md deleted file mode 100644 index 09b86f7112..0000000000 --- a/.changeset/lovely-years-sniff.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-app-api': minor ---- - -The `OAuth` class which is used by all OAuth providers will now consider both the session expiration of both the Backstage identity as well as the upstream identity provider, and refresh the session with either of them is about to expire. diff --git a/.changeset/lucky-chicken-hear.md b/.changeset/lucky-chicken-hear.md deleted file mode 100644 index b7f0d6ec48..0000000000 --- a/.changeset/lucky-chicken-hear.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -'@backstage/plugin-code-coverage-backend': patch ---- - -Replace `express-xml-bodyparser` with `body-parser-xml`. - -`express-xml-bodyparser` was last updated 8 years ago -and currently depends on a version of `xml2js` which -contains a vulnerability. - -This change will swap it out in favor of `body-parser-xml` -which is more maintained and depends on a more recent `xml2js` -version without the vulnerability. diff --git a/.changeset/lucky-chicken-lie.md b/.changeset/lucky-chicken-lie.md deleted file mode 100644 index 6edb3a36f6..0000000000 --- a/.changeset/lucky-chicken-lie.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-backend-module-gitlab-provider': minor ---- - -New module for `@backstage/plugin-auth-backend` that adds a GitLab auth provider. diff --git a/.changeset/many-panthers-wink.md b/.changeset/many-panthers-wink.md deleted file mode 100644 index 724a3aada6..0000000000 --- a/.changeset/many-panthers-wink.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-components': patch ---- - -Added `` component which introduces an optional automatic logout mechanism on user inactivity diff --git a/.changeset/many-tips-attend.md b/.changeset/many-tips-attend.md deleted file mode 100644 index 34b5898803..0000000000 --- a/.changeset/many-tips-attend.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-search-react': patch ---- - -Optionally initializes the search context with default settings for search queries only when the config is defined, rather than always overriding it. diff --git a/.changeset/mean-carpets-provide.md b/.changeset/mean-carpets-provide.md deleted file mode 100644 index b5e9f551d4..0000000000 --- a/.changeset/mean-carpets-provide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-azure': patch ---- - -Remove duplications from Azure search before committing the new locations to the catalog. diff --git a/.changeset/mean-planes-smoke.md b/.changeset/mean-planes-smoke.md deleted file mode 100644 index b082023cde..0000000000 --- a/.changeset/mean-planes-smoke.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-app-api': patch ---- - -Internal refactor diff --git a/.changeset/mean-queens-act.md b/.changeset/mean-queens-act.md deleted file mode 100644 index a895ba5705..0000000000 --- a/.changeset/mean-queens-act.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-newrelic': patch ---- - -Fixed bug in NewRelicComponent component where table would not sort correctly for numerical values. diff --git a/.changeset/mighty-crabs-cheat.md b/.changeset/mighty-crabs-cheat.md deleted file mode 100644 index ef2abbada4..0000000000 --- a/.changeset/mighty-crabs-cheat.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-backend': patch ---- - -Added the ability to disable the built-in auth providers by passing `disableDefaultProviderFactories` to `createRouter`. diff --git a/.changeset/modern-trees-add.md b/.changeset/modern-trees-add.md deleted file mode 100644 index bb5ea78a5b..0000000000 --- a/.changeset/modern-trees-add.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-techdocs': minor -'@backstage/plugin-catalog': minor ---- - -This change allows a new annotation of `backstage.io/techdocs-entity` this ref allows you to reference another entity for its TechDocs. This allows you have a single TechDoc for all items in a system, for example you might have a frontend and a backend in the same repo. This would allow you to have TechDocs build under a `System` entity while referencing the system e.g.: `backstage.io/techdocs-entity: system:default/example` that will show the systems docs in both the TechDocs button and the TechDocs tab without needing to do duplicate builds and filling the TechDocs page with garbage. diff --git a/.changeset/nasty-cherries-exercise.md b/.changeset/nasty-cherries-exercise.md deleted file mode 100644 index bb4386e978..0000000000 --- a/.changeset/nasty-cherries-exercise.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-kubernetes-backend': patch ---- - -fix "undefined" kind for custom resources diff --git a/.changeset/nasty-forks-beg.md b/.changeset/nasty-forks-beg.md deleted file mode 100644 index 0662431453..0000000000 --- a/.changeset/nasty-forks-beg.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -'@backstage/plugin-search-react': minor -'@backstage/plugin-search': minor ---- - -The SearchPage component can now be configured via app-config.yaml with default query parameters to define how it behaves when it is first loaded or reset. Check out the following example: - -```yaml -search: - query: - pageLimit: 50 -``` - -Acceptable values for `pageLimit` are `10`, `25`, `50` or `100`. diff --git a/.changeset/nasty-snails-complain.md b/.changeset/nasty-snails-complain.md deleted file mode 100644 index d7d2cac319..0000000000 --- a/.changeset/nasty-snails-complain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-kubernetes': patch ---- - -fix logs dialog min height diff --git a/.changeset/nasty-worms-share.md b/.changeset/nasty-worms-share.md deleted file mode 100644 index 4be8315cce..0000000000 --- a/.changeset/nasty-worms-share.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-playlist': patch ---- - -Fix a bug that led to errors being thrown in guest mode diff --git a/.changeset/new-frogs-punch.md b/.changeset/new-frogs-punch.md deleted file mode 100644 index f4390e72c6..0000000000 --- a/.changeset/new-frogs-punch.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/plugin-kubernetes-backend': minor ---- - -Integrators can now bring their own auth strategies through the use of the `addAuthStrategy` method on `KubernetesBuilder`. - -**BREAKING** on the slight chance you were using the `setAuthTranslatorMap` method on `KubernetesBuilder`, it has been removed along with the entire `KubernetesAuthTranslator` interface. This notion has been replaced with the more focused concept of an `AuthenticationStrategy`. Converting a translator to a strategy should not be especially difficult. diff --git a/.changeset/new-sheep-cover.md b/.changeset/new-sheep-cover.md deleted file mode 100644 index 390de1a9b3..0000000000 --- a/.changeset/new-sheep-cover.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-linguist-backend': patch ---- - -When creating the router using `createRouterFromConfig` or using the plugin for the new backend system the `linguist.useSourceLocation` configuration is now optional. diff --git a/.changeset/nice-forks-remain.md b/.changeset/nice-forks-remain.md deleted file mode 100644 index 6d833ff283..0000000000 --- a/.changeset/nice-forks-remain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-code-coverage': patch ---- - -Use fetchApi to ensure authorization is used when fetching code-coverage data diff --git a/.changeset/nine-taxis-study.md b/.changeset/nine-taxis-study.md deleted file mode 100644 index 693534c2be..0000000000 --- a/.changeset/nine-taxis-study.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-components': patch ---- - -Minor internal tweak to handle `classnames` update diff --git a/.changeset/ninety-horses-remember.md b/.changeset/ninety-horses-remember.md deleted file mode 100644 index 22ef53b340..0000000000 --- a/.changeset/ninety-horses-remember.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-app-api': patch ---- - -The experimental backend feature discovery now only considers default exports from packages. It no longer filters packages to include based on the package role, except that `'cli'` packages are ignored. However, the `"backstage"` field is still required in `package.json`. diff --git a/.changeset/ninety-news-visit.md b/.changeset/ninety-news-visit.md deleted file mode 100644 index 1b990f9ac7..0000000000 --- a/.changeset/ninety-news-visit.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-backend': patch ---- - -The algorithm used when generating Backstage tokens can be configured via `auth.identityTokenAlgorithm`. diff --git a/.changeset/old-geese-drive.md b/.changeset/old-geese-drive.md deleted file mode 100644 index ddaa7ad30a..0000000000 --- a/.changeset/old-geese-drive.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-test-utils': patch ---- - -Extended `mockService` to also include mocked variants, for example `mockServices.lifecycle.mock()`. The returned mocked implementation will have a `factory` property which is a service factory for itself. You can also pass a partial implementation of the service to the mock function to use a mock implementation of specific methods. diff --git a/.changeset/old-windows-argue.md b/.changeset/old-windows-argue.md deleted file mode 100644 index f687d1b08c..0000000000 --- a/.changeset/old-windows-argue.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-import': minor ---- - -Slight change to the `PreparePullRequestFormProps`, because of an update to `react-hook-form`. diff --git a/.changeset/orange-houses-fly.md b/.changeset/orange-houses-fly.md deleted file mode 100644 index 546484304c..0000000000 --- a/.changeset/orange-houses-fly.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/integration': patch ---- - -Gitiles: Fixed auth prefix issue diff --git a/.changeset/pink-cups-rescue.md b/.changeset/pink-cups-rescue.md deleted file mode 100644 index abb69e88b7..0000000000 --- a/.changeset/pink-cups-rescue.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -'@backstage/plugin-auth-node': minor ---- - -Introduced a new system for building auth providers for `@backstage/plugin-auth-backend`, which both increases the amount of code re-use across providers, and also works better with the new backend system. - -Many existing types have been moved from `@backstage/plugin-auth-backend` in order to avoid a direct dependency on the plugin from modules. - -Auth provider integrations are now primarily implemented through a pattern of creating "authenticators", which are in turn specific to each kind of integrations. Initially there are two types: `createOAuthAuthenticator` and `createProxyAuthenticator`. These come paired with functions that let you create the corresponding route handlers, `createOAuthRouteHandlers` and `createProxyAuthRouteHandlers`, as well as provider factories, `createOAuthProviderFactory` and `createProxyAuthProviderFactory`. This new authenticator pattern allows the sign-in logic to be separated from the auth integration logic, allowing it to be completely re-used across all providers of the same kind. - -The new provider factories also implement a new declarative way to configure sign-in resolvers, rather than configuration through code. Sign-in resolvers can now be configured through the `resolvers` configuration key, where the first resolver that provides an identity will be used, for example: - -```yaml -auth: - providers: - google: - development: - clientId: ... - clientSecret: ... - signIn: - resolvers: - - resolver: emailMatchingUserEntityAnnotation - - resolver: emailLocalPartMatchingUserEntityName -``` - -These configurable resolvers are created with a new `createSignInResolverFactory` function, which creates a sign-in resolver factory, optionally with an options schema that will be used both when configuring the sign-in resolver through configuration and code. - -The internal helpers from `@backstage/plugin-auth-backend` that were used to implement auth providers using passport strategies have now also been made available as public API, through `PassportHelpers` and `PassportOAuthAuthenticatorHelper`. diff --git a/.changeset/pink-months-hammer.md b/.changeset/pink-months-hammer.md deleted file mode 100644 index 20a484a389..0000000000 --- a/.changeset/pink-months-hammer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-permission-backend': patch ---- - -Moved `permissionModuleAllowAllPolicy` to `@backstage/plugin-permission-backend-module-allow-all-policy` diff --git a/.changeset/plenty-lamps-pump.md b/.changeset/plenty-lamps-pump.md deleted file mode 100644 index 04d0f2f4f0..0000000000 --- a/.changeset/plenty-lamps-pump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-adr': patch ---- - -support for i18n feature diff --git a/.changeset/polite-forks-grin.md b/.changeset/polite-forks-grin.md deleted file mode 100644 index 8f6570ccbc..0000000000 --- a/.changeset/polite-forks-grin.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Fixed validation of the `fullTextFilterFields` query parameter. diff --git a/.changeset/polite-plums-share.md b/.changeset/polite-plums-share.md deleted file mode 100644 index 09c980b921..0000000000 --- a/.changeset/polite-plums-share.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Added some examples to the catalog OpenAPI definition diff --git a/.changeset/poor-olives-own.md b/.changeset/poor-olives-own.md deleted file mode 100644 index 6eb8b5ac2b..0000000000 --- a/.changeset/poor-olives-own.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Fixes an issue where `order` was not a recognized parameter for the `/entities` endpoint. diff --git a/.changeset/poor-years-appear.md b/.changeset/poor-years-appear.md deleted file mode 100644 index d5b53a7051..0000000000 --- a/.changeset/poor-years-appear.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-entity-feedback-backend': patch ---- - -Improve backend logging if method calls fail diff --git a/.changeset/popular-clocks-whisper.md b/.changeset/popular-clocks-whisper.md deleted file mode 100644 index 7c1d86ab03..0000000000 --- a/.changeset/popular-clocks-whisper.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Fixed a bug where package exports entry points could not be `.tsx` files. diff --git a/.changeset/popular-coins-tap.md b/.changeset/popular-coins-tap.md deleted file mode 100644 index 3ece9e20b1..0000000000 --- a/.changeset/popular-coins-tap.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-tasks': patch ---- - -Use `readDurationFromConfig` from the config package diff --git a/.changeset/popular-readers-allow.md b/.changeset/popular-readers-allow.md deleted file mode 100644 index b89e0c264e..0000000000 --- a/.changeset/popular-readers-allow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-plugin-api': minor ---- - -Added the optional `expiresAt` field that may now be part of a `BackstageIdentityResponse`. diff --git a/.changeset/pre.json b/.changeset/pre.json deleted file mode 100644 index d824680e8f..0000000000 --- a/.changeset/pre.json +++ /dev/null @@ -1,399 +0,0 @@ -{ - "mode": "exit", - "tag": "next", - "initialVersions": { - "example-app": "0.2.86", - "@backstage/app-defaults": "1.4.2", - "example-backend": "0.2.86", - "@backstage/backend-app-api": "0.5.0", - "@backstage/backend-common": "0.19.2", - "@backstage/backend-defaults": "0.2.0", - "@backstage/backend-dev-utils": "0.1.1", - "example-backend-next": "0.0.14", - "@backstage/backend-openapi-utils": "0.0.3", - "@backstage/backend-plugin-api": "0.6.0", - "@backstage/backend-tasks": "0.5.5", - "@backstage/backend-test-utils": "0.2.0", - "@backstage/catalog-client": "1.4.3", - "@backstage/catalog-model": "1.4.1", - "@backstage/cli": "0.22.10", - "@backstage/cli-common": "0.1.12", - "@backstage/cli-node": "0.1.3", - "@backstage/codemods": "0.1.45", - "@backstage/config": "1.0.8", - "@backstage/config-loader": "1.4.0", - "@backstage/core-app-api": "1.9.1", - "@backstage/core-components": "0.13.4", - "@backstage/core-plugin-api": "1.5.3", - "@backstage/create-app": "0.5.4", - "@backstage/dev-utils": "1.0.18", - "e2e-test": "0.2.6", - "@backstage/errors": "1.2.1", - "@backstage/eslint-plugin": "0.1.3", - "@backstage/integration": "1.6.0", - "@backstage/integration-aws-node": "0.1.5", - "@backstage/integration-react": "1.1.16", - "@backstage/release-manifests": "0.0.9", - "@backstage/repo-tools": "0.3.3", - "@techdocs/cli": "1.4.5", - "techdocs-cli-embedded-app": "0.2.85", - "@backstage/test-utils": "1.4.2", - "@backstage/theme": "0.4.1", - "@backstage/types": "1.1.0", - "@backstage/version-bridge": "1.0.4", - "@backstage/plugin-adr": "0.6.4", - "@backstage/plugin-adr-backend": "0.3.6", - "@backstage/plugin-adr-common": "0.2.12", - "@backstage/plugin-airbrake": "0.3.21", - "@backstage/plugin-airbrake-backend": "0.2.21", - "@backstage/plugin-allure": "0.1.37", - "@backstage/plugin-analytics-module-ga": "0.1.32", - "@backstage/plugin-analytics-module-ga4": "0.1.3", - "@backstage/plugin-analytics-module-newrelic-browser": "0.0.1", - "@backstage/plugin-apache-airflow": "0.2.14", - "@backstage/plugin-api-docs": "0.9.7", - "@backstage/plugin-api-docs-module-protoc-gen-doc": "0.1.2", - "@backstage/plugin-apollo-explorer": "0.1.14", - "@backstage/plugin-app-backend": "0.3.48", - "@backstage/plugin-app-node": "0.1.0", - "@backstage/plugin-auth-backend": "0.18.6", - "@backstage/plugin-auth-node": "0.2.17", - "@backstage/plugin-azure-devops": "0.3.3", - "@backstage/plugin-azure-devops-backend": "0.3.27", - "@backstage/plugin-azure-devops-common": "0.3.0", - "@backstage/plugin-azure-sites": "0.1.10", - "@backstage/plugin-azure-sites-backend": "0.1.10", - "@backstage/plugin-azure-sites-common": "0.1.0", - "@backstage/plugin-badges": "0.2.45", - "@backstage/plugin-badges-backend": "0.2.3", - "@backstage/plugin-bazaar": "0.2.12", - "@backstage/plugin-bazaar-backend": "0.2.11", - "@backstage/plugin-bitbucket-cloud-common": "0.2.9", - "@backstage/plugin-bitrise": "0.1.48", - "@backstage/plugin-catalog": "1.12.1", - "@backstage/plugin-catalog-backend": "1.12.0", - "@backstage/plugin-catalog-backend-module-aws": "0.2.3", - "@backstage/plugin-catalog-backend-module-azure": "0.1.19", - "@backstage/plugin-catalog-backend-module-bitbucket": "0.2.15", - "@backstage/plugin-catalog-backend-module-bitbucket-cloud": "0.1.15", - "@backstage/plugin-catalog-backend-module-bitbucket-server": "0.1.13", - "@backstage/plugin-catalog-backend-module-gcp": "0.1.0", - "@backstage/plugin-catalog-backend-module-gerrit": "0.1.16", - "@backstage/plugin-catalog-backend-module-github": "0.3.3", - "@backstage/plugin-catalog-backend-module-gitlab": "0.2.4", - "@backstage/plugin-catalog-backend-module-incremental-ingestion": "0.4.1", - "@backstage/plugin-catalog-backend-module-ldap": "0.5.15", - "@backstage/plugin-catalog-backend-module-msgraph": "0.5.7", - "@backstage/plugin-catalog-backend-module-openapi": "0.1.14", - "@backstage/plugin-catalog-backend-module-puppetdb": "0.1.5", - "@backstage/plugin-catalog-backend-module-unprocessed": "0.2.0", - "@backstage/plugin-catalog-common": "1.0.15", - "@internal/plugin-catalog-customized": "0.0.13", - "@backstage/plugin-catalog-graph": "0.2.33", - "@backstage/plugin-catalog-graphql": "0.3.22", - "@backstage/plugin-catalog-import": "0.9.11", - "@backstage/plugin-catalog-node": "1.4.1", - "@backstage/plugin-catalog-react": "1.8.1", - "@backstage/plugin-catalog-unprocessed-entities": "0.1.2", - "@backstage/plugin-cicd-statistics": "0.1.23", - "@backstage/plugin-cicd-statistics-module-gitlab": "0.1.17", - "@backstage/plugin-circleci": "0.3.21", - "@backstage/plugin-cloudbuild": "0.3.21", - "@backstage/plugin-code-climate": "0.1.21", - "@backstage/plugin-code-coverage": "0.2.14", - "@backstage/plugin-code-coverage-backend": "0.2.14", - "@backstage/plugin-codescene": "0.1.16", - "@backstage/plugin-config-schema": "0.1.44", - "@backstage/plugin-cost-insights": "0.12.10", - "@backstage/plugin-cost-insights-common": "0.1.1", - "@backstage/plugin-devtools": "0.1.3", - "@backstage/plugin-devtools-backend": "0.1.3", - "@backstage/plugin-devtools-common": "0.1.3", - "@backstage/plugin-dynatrace": "7.0.1", - "@backstage/plugin-entity-feedback": "0.2.4", - "@backstage/plugin-entity-feedback-backend": "0.1.6", - "@backstage/plugin-entity-feedback-common": "0.1.2", - "@backstage/plugin-entity-validation": "0.1.6", - "@backstage/plugin-events-backend": "0.2.9", - "@backstage/plugin-events-backend-module-aws-sqs": "0.2.3", - "@backstage/plugin-events-backend-module-azure": "0.1.10", - "@backstage/plugin-events-backend-module-bitbucket-cloud": "0.1.10", - "@backstage/plugin-events-backend-module-gerrit": "0.1.10", - "@backstage/plugin-events-backend-module-github": "0.1.10", - "@backstage/plugin-events-backend-module-gitlab": "0.1.10", - "@backstage/plugin-events-backend-test-utils": "0.1.10", - "@backstage/plugin-events-node": "0.2.9", - "@internal/plugin-todo-list": "1.0.16", - "@internal/plugin-todo-list-backend": "1.0.16", - "@internal/plugin-todo-list-common": "1.0.12", - "@backstage/plugin-explore": "0.4.7", - "@backstage/plugin-explore-backend": "0.0.10", - "@backstage/plugin-explore-common": "0.0.1", - "@backstage/plugin-explore-react": "0.0.30", - "@backstage/plugin-firehydrant": "0.2.5", - "@backstage/plugin-fossa": "0.2.53", - "@backstage/plugin-gcalendar": "0.3.17", - "@backstage/plugin-gcp-projects": "0.3.40", - "@backstage/plugin-git-release-manager": "0.3.34", - "@backstage/plugin-github-actions": "0.6.2", - "@backstage/plugin-github-deployments": "0.1.52", - "@backstage/plugin-github-issues": "0.2.10", - "@backstage/plugin-github-pull-requests-board": "0.1.15", - "@backstage/plugin-gitops-profiles": "0.3.39", - "@backstage/plugin-gocd": "0.1.27", - "@backstage/plugin-graphiql": "0.2.53", - "@backstage/plugin-graphql-backend": "0.1.38", - "@backstage/plugin-graphql-voyager": "0.1.6", - "@backstage/plugin-home": "0.5.5", - "@backstage/plugin-home-react": "0.1.2", - "@backstage/plugin-ilert": "0.2.10", - "@backstage/plugin-jenkins": "0.8.3", - "@backstage/plugin-jenkins-backend": "0.2.3", - "@backstage/plugin-jenkins-common": "0.1.18", - "@backstage/plugin-kafka": "0.3.21", - "@backstage/plugin-kafka-backend": "0.2.41", - "@backstage/plugin-kubernetes": "0.10.0", - "@backstage/plugin-kubernetes-backend": "0.11.3", - "@backstage/plugin-kubernetes-common": "0.6.5", - "@backstage/plugin-lighthouse": "0.4.6", - "@backstage/plugin-lighthouse-backend": "0.2.4", - "@backstage/plugin-lighthouse-common": "0.1.2", - "@backstage/plugin-linguist": "0.1.6", - "@backstage/plugin-linguist-backend": "0.4.0", - "@backstage/plugin-linguist-common": "0.1.1", - "@backstage/plugin-microsoft-calendar": "0.1.6", - "@backstage/plugin-newrelic": "0.3.39", - "@backstage/plugin-newrelic-dashboard": "0.2.14", - "@backstage/plugin-nomad": "0.1.2", - "@backstage/plugin-nomad-backend": "0.1.2", - "@backstage/plugin-octopus-deploy": "0.2.3", - "@backstage/plugin-org": "0.6.11", - "@backstage/plugin-org-react": "0.1.10", - "@backstage/plugin-pagerduty": "0.6.2", - "@backstage/plugin-periskop": "0.1.19", - "@backstage/plugin-periskop-backend": "0.1.19", - "@backstage/plugin-permission-backend": "0.5.23", - "@backstage/plugin-permission-common": "0.7.7", - "@backstage/plugin-permission-node": "0.7.11", - "@backstage/plugin-permission-react": "0.4.14", - "@backstage/plugin-playlist": "0.1.13", - "@backstage/plugin-playlist-backend": "0.3.4", - "@backstage/plugin-playlist-common": "0.1.9", - "@backstage/plugin-proxy-backend": "0.3.0", - "@backstage/plugin-puppetdb": "0.1.4", - "@backstage/plugin-rollbar": "0.4.21", - "@backstage/plugin-rollbar-backend": "0.1.45", - "@backstage/plugin-scaffolder": "1.14.2", - "@backstage/plugin-scaffolder-backend": "1.16.0", - "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown": "0.2.1", - "@backstage/plugin-scaffolder-backend-module-cookiecutter": "0.2.24", - "@backstage/plugin-scaffolder-backend-module-gitlab": "0.2.3", - "@backstage/plugin-scaffolder-backend-module-rails": "0.4.17", - "@backstage/plugin-scaffolder-backend-module-sentry": "0.1.8", - "@backstage/plugin-scaffolder-backend-module-yeoman": "0.2.21", - "@backstage/plugin-scaffolder-common": "1.4.0", - "@backstage/plugin-scaffolder-node": "0.2.0", - "@backstage/plugin-scaffolder-react": "1.5.2", - "@backstage/plugin-search": "1.3.4", - "@backstage/plugin-search-backend": "1.4.0", - "@backstage/plugin-search-backend-module-catalog": "0.1.4", - "@backstage/plugin-search-backend-module-elasticsearch": "1.3.3", - "@backstage/plugin-search-backend-module-explore": "0.1.4", - "@backstage/plugin-search-backend-module-pg": "0.5.9", - "@backstage/plugin-search-backend-module-techdocs": "0.1.4", - "@backstage/plugin-search-backend-node": "1.2.4", - "@backstage/plugin-search-common": "1.2.5", - "@backstage/plugin-search-react": "1.6.4", - "@backstage/plugin-sentry": "0.5.6", - "@backstage/plugin-shortcuts": "0.3.13", - "@backstage/plugin-sonarqube": "0.7.2", - "@backstage/plugin-sonarqube-backend": "0.2.2", - "@backstage/plugin-sonarqube-react": "0.1.7", - "@backstage/plugin-splunk-on-call": "0.4.10", - "@backstage/plugin-stack-overflow": "0.1.19", - "@backstage/plugin-stack-overflow-backend": "0.2.4", - "@backstage/plugin-stackstorm": "0.1.5", - "@backstage/plugin-tech-insights": "0.3.13", - "@backstage/plugin-tech-insights-backend": "0.5.14", - "@backstage/plugin-tech-insights-backend-module-jsonfc": "0.1.32", - "@backstage/plugin-tech-insights-common": "0.2.11", - "@backstage/plugin-tech-insights-node": "0.4.6", - "@backstage/plugin-tech-radar": "0.6.7", - "@backstage/plugin-techdocs": "1.6.6", - "@backstage/plugin-techdocs-addons-test-utils": "1.0.17", - "@backstage/plugin-techdocs-backend": "1.6.5", - "@backstage/plugin-techdocs-module-addons-contrib": "1.0.16", - "@backstage/plugin-techdocs-node": "1.7.4", - "@backstage/plugin-techdocs-react": "1.1.9", - "@backstage/plugin-todo": "0.2.23", - "@backstage/plugin-todo-backend": "0.2.0", - "@backstage/plugin-user-settings": "0.7.6", - "@backstage/plugin-user-settings-backend": "0.1.12", - "@backstage/plugin-vault": "0.1.15", - "@backstage/plugin-vault-backend": "0.3.4", - "@backstage/plugin-xcmetrics": "0.2.41", - "@backstage/plugin-auth-backend-module-gcp-iap-provider": "0.0.0", - "@backstage/plugin-auth-backend-module-github-provider": "0.0.0", - "@backstage/plugin-auth-backend-module-google-provider": "0.0.0", - "@backstage/plugin-opencost": "0.1.0", - "example-app-next": "0.0.0", - "@backstage/frontend-app-api": "0.0.0", - "@backstage/frontend-plugin-api": "0.0.0", - "@backstage/plugin-auth-backend-module-gitlab-provider": "0.0.0", - "@backstage/backend-plugin-manager": "0.0.0", - "@backstage/plugin-permission-backend-module-allow-all-policy": "0.0.0", - "app-next-example-plugin": "0.0.0", - "@backstage/plugin-auth-backend-module-oauth2-provider": "0.0.0", - "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "0.0.0" - }, - "changesets": [ - "big-bananas-sleep", - "big-masks-divide", - "big-spies-agree", - "blue-rats-drop", - "brave-books-pretend", - "brave-carrots-occur", - "calm-cups-smile", - "catalog-everybody-to-the-limit", - "chatty-goats-mate", - "chatty-spiders-serve", - "chilly-balloons-enjoy", - "chilly-parrots-yell", - "clean-houses-invent", - "cold-apricots-poke", - "create-app-1692704146", - "create-app-1693311380", - "cuddly-avocados-warn", - "curvy-roses-march", - "cyan-roses-relate", - "dirty-boxes-give", - "dirty-carrots-notice", - "dirty-cars-poke", - "dirty-cars-smoke", - "dirty-garlics-kiss", - "dirty-years-travel", - "dry-wasps-occur", - "dull-eyes-pay", - "dull-tables-joke", - "early-rules-taste", - "early-trains.draw", - "eight-radios-listen", - "eight-timers-sin", - "eighty-emus-float", - "eighty-fans-provide", - "empty-rings-type", - "fair-paws-flash", - "few-nails-smile", - "fifty-adults-shake", - "forty-rocks-jog", - "four-masks-fry", - "fresh-candles-warn", - "friendly-pugs-lick", - "funny-ligers-matter", - "funny-timers-retire", - "giant-coats-brush", - "gorgeous-coins-attack", - "great-chairs-swim", - "grumpy-bikes-beg", - "grumpy-papayas-tie", - "grumpy-ties-know", - "healthy-spiders-arrive", - "healthy-tools-count", - "hip-seahorses-exist", - "honest-ads-rush", - "hungry-cherries-speak", - "hungry-dots-design", - "khaki-pigs-accept", - "khaki-spiders-sniff", - "late-cows-turn", - "late-hounds-yell", - "late-roses-dream", - "lazy-pumas-hope", - "lazy-pumas-shop", - "lazy-rice-rule", - "lemon-donuts-clap", - "light-drinks-rush", - "long-flowers-sort", - "loud-apricots-destroy", - "lovely-years-sniff", - "lucky-chicken-hear", - "lucky-chicken-lie", - "many-tips-attend", - "mean-carpets-provide", - "mean-planes-smoke", - "mean-queens-act", - "mighty-crabs-cheat", - "modern-trees-add", - "nasty-cherries-exercise", - "nasty-forks-beg", - "nasty-snails-complain", - "nasty-worms-share", - "new-sheep-cover", - "nice-forks-remain", - "ninety-horses-remember", - "ninety-news-visit", - "old-geese-drive", - "orange-houses-fly", - "pink-cups-rescue", - "pink-months-hammer", - "plenty-lamps-pump", - "polite-forks-grin", - "polite-plums-share", - "poor-olives-own", - "poor-years-appear", - "popular-clocks-whisper", - "popular-coins-tap", - "popular-readers-allow", - "pretty-otters-whisper", - "proud-lamps-cross", - "red-pens-knock", - "renovate-2ebf420", - "renovate-36e7f58", - "renovate-76185f9", - "renovate-b129f45", - "renovate-bbda8e8", - "repo-p-lisa", - "repo-tools-boo-descriptions-two-electric-boogaloo", - "repo-tools-boo-descriptions", - "repo-tools-ci-toldya-so", - "rotten-bees-wave", - "rude-dolphins-reply", - "short-planets-argue", - "silent-icons-deny", - "silent-numbers-retire", - "silly-emus-remain", - "six-radios-smile", - "six-wolves-admire", - "slow-ducks-hunt", - "slow-queens-visit", - "smart-islands-jog", - "stale-points-breathe", - "strange-frogs-count", - "stupid-ants-change", - "sweet-hairs-complain", - "sweet-pens-hunt", - "swift-frogs-drop", - "tall-countries-float", - "tall-items-clap", - "tall-peas-visit", - "tame-jokes-do", - "tender-garlics-report", - "thick-pets-drive", - "thin-dryers-repeat", - "three-hounds-wonder", - "tricky-melons-fold", - "twelve-elephants-pay", - "twenty-worms-enjoy", - "warm-llamas-bake", - "warm-panthers-lick", - "weak-tomatoes-dance", - "wet-donuts-fry", - "wise-tables-add", - "witty-ants-cover", - "witty-pans-flash", - "yellow-trains-protect", - "yellow-yaks-behave", - "young-ants-nail", - "young-panthers-mix" - ] -} diff --git a/.changeset/pretty-otters-whisper.md b/.changeset/pretty-otters-whisper.md deleted file mode 100644 index 7019596b38..0000000000 --- a/.changeset/pretty-otters-whisper.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-techdocs-node': minor -'@backstage/plugin-techdocs-backend': minor ---- - -Add a `techdocs.publisher.azureBlobStorage.connectionString` app-config setting, which can be leveraged for improved Azurite support. diff --git a/.changeset/proud-lamps-cross.md b/.changeset/proud-lamps-cross.md deleted file mode 100644 index cd2528a94c..0000000000 --- a/.changeset/proud-lamps-cross.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-code-coverage-backend': patch ---- - -Include auth token when fetching entity diff --git a/.changeset/purple-hotels-doubt.md b/.changeset/purple-hotels-doubt.md deleted file mode 100644 index 476d8071de..0000000000 --- a/.changeset/purple-hotels-doubt.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-proxy-backend': patch ---- - -Add back the legacy proxy config, to get secret redaction diff --git a/.changeset/red-pens-knock.md b/.changeset/red-pens-knock.md deleted file mode 100644 index 98ee51b894..0000000000 --- a/.changeset/red-pens-knock.md +++ /dev/null @@ -1,93 +0,0 @@ ---- -'@backstage/plugin-analytics-module-newrelic-browser': patch -'@backstage/plugin-techdocs-module-addons-contrib': patch -'@backstage/plugin-catalog-unprocessed-entities': patch -'@backstage/plugin-github-pull-requests-board': patch -'@backstage/plugin-techdocs-addons-test-utils': patch -'@backstage/plugin-analytics-module-ga4': patch -'@backstage/plugin-analytics-module-ga': patch -'@backstage/plugin-git-release-manager': patch -'@backstage/integration-react': patch -'@backstage/release-manifests': patch -'@backstage/plugin-github-deployments': patch -'@backstage/plugin-microsoft-calendar': patch -'@backstage/plugin-entity-validation': patch -'@backstage/core-components': patch -'@backstage/core-plugin-api': patch -'@backstage/plugin-apollo-explorer': patch -'@backstage/plugin-entity-feedback': patch -'@backstage/plugin-gitops-profiles': patch -'@backstage/plugin-graphql-voyager': patch -'@backstage/config-loader': patch -'@backstage/plugin-apache-airflow': patch -'@backstage/plugin-badges-backend': patch -'@backstage/plugin-github-actions': patch -'@backstage/plugin-octopus-deploy': patch -'@backstage/plugin-splunk-on-call': patch -'@backstage/plugin-stack-overflow': patch -'@backstage/app-defaults': patch -'@backstage/core-app-api': patch -'@backstage/plugin-code-coverage': patch -'@backstage/plugin-config-schema': patch -'@backstage/plugin-cost-insights': patch -'@backstage/plugin-explore-react': patch -'@backstage/plugin-github-issues': patch -'@backstage/plugin-tech-insights': patch -'@backstage/plugin-user-settings': patch -'@backstage/plugin-azure-devops': patch -'@backstage/plugin-code-climate': patch -'@backstage/plugin-gcp-projects': patch -'@backstage/create-app': patch -'@backstage/test-utils': patch -'@backstage/plugin-azure-sites': patch -'@backstage/plugin-firehydrant': patch -'@backstage/dev-utils': patch -'@backstage/plugin-cloudbuild': patch -'@backstage/plugin-home-react': patch -'@backstage/plugin-kubernetes': patch -'@backstage/plugin-lighthouse': patch -'@backstage/plugin-scaffolder': patch -'@backstage/plugin-stackstorm': patch -'@backstage/plugin-tech-radar': patch -'@backstage/plugin-codescene': patch -'@backstage/plugin-dynatrace': patch -'@backstage/plugin-gcalendar': patch -'@backstage/plugin-org-react': patch -'@backstage/plugin-pagerduty': patch -'@backstage/plugin-shortcuts': patch -'@backstage/plugin-sonarqube': patch -'@backstage/plugin-xcmetrics': patch -'@backstage/plugin-airbrake': patch -'@backstage/plugin-api-docs': patch -'@backstage/plugin-circleci': patch -'@backstage/plugin-devtools': patch -'@backstage/plugin-graphiql': patch -'@backstage/plugin-linguist': patch -'@backstage/plugin-newrelic': patch -'@backstage/plugin-periskop': patch -'@backstage/plugin-playlist': patch -'@backstage/plugin-puppetdb': patch -'@backstage/plugin-techdocs': patch -'@backstage/config': patch -'@backstage/plugin-bitrise': patch -'@backstage/plugin-explore': patch -'@backstage/plugin-jenkins': patch -'@backstage/plugin-rollbar': patch -'@backstage/plugin-allure': patch -'@backstage/plugin-badges': patch -'@backstage/plugin-search': patch -'@backstage/plugin-sentry': patch -'@backstage/plugin-fossa': patch -'@backstage/plugin-ilert': patch -'@backstage/plugin-kafka': patch -'@backstage/plugin-nomad': patch -'@backstage/plugin-vault': patch -'@backstage/cli': patch -'@backstage/plugin-gocd': patch -'@backstage/plugin-home': patch -'@backstage/plugin-todo': patch -'@backstage/plugin-adr': patch -'@backstage/plugin-org': patch ---- - -Removed `@types/node` dependency diff --git a/.changeset/renovate-2ebf420.md b/.changeset/renovate-2ebf420.md deleted file mode 100644 index cbd1e76538..0000000000 --- a/.changeset/renovate-2ebf420.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/core-components': patch -'@backstage/plugin-codescene': patch -'@backstage/plugin-sonarqube': patch ---- - -Updated dependency `rc-progress` to `3.5.1`. diff --git a/.changeset/renovate-36e7f58.md b/.changeset/renovate-36e7f58.md deleted file mode 100644 index ed84727e2d..0000000000 --- a/.changeset/renovate-36e7f58.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -'@backstage/plugin-home-react': patch -'@backstage/plugin-home': patch -'@backstage/plugin-scaffolder-react': patch -'@backstage/plugin-scaffolder': patch ---- - -Updated dependency `@rjsf/utils` to `5.13.0`. -Updated dependency `@rjsf/core-v5` to `npm:@rjsf/core@5.13.0`. -Updated dependency `@rjsf/material-ui-v5` to `npm:@rjsf/material-ui@5.13.0`. -Updated dependency `@rjsf/validator-ajv8` to `5.13.0`. diff --git a/.changeset/renovate-76185f9.md b/.changeset/renovate-76185f9.md deleted file mode 100644 index 5e23f3cfda..0000000000 --- a/.changeset/renovate-76185f9.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-cost-insights': patch ---- - -Updated dependency `@types/pluralize` to `^0.0.30`. diff --git a/.changeset/renovate-b129f45.md b/.changeset/renovate-b129f45.md deleted file mode 100644 index 0f747fba5b..0000000000 --- a/.changeset/renovate-b129f45.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Updated dependency `run-script-webpack-plugin` to `^0.2.0`. diff --git a/.changeset/renovate-bbda8e8.md b/.changeset/renovate-bbda8e8.md deleted file mode 100644 index a43e1c55a9..0000000000 --- a/.changeset/renovate-bbda8e8.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-react': patch ---- - -Updated dependency `use-immer` to `^0.9.0`. diff --git a/.changeset/repo-p-lisa.md b/.changeset/repo-p-lisa.md deleted file mode 100644 index d6a0fa56f4..0000000000 --- a/.changeset/repo-p-lisa.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/repo-tools': patch ---- - -The `generate-catalog-info` command now uses the first listed `CODEOWNER` as Component owner when initially -creating the `catalog-info.yaml` file. It continues to allow any one listed `CODEOWNER` when updating -entity metadata. diff --git a/.changeset/repo-tools-boo-descriptions-two-electric-boogaloo.md b/.changeset/repo-tools-boo-descriptions-two-electric-boogaloo.md deleted file mode 100644 index 8cb6d49153..0000000000 --- a/.changeset/repo-tools-boo-descriptions-two-electric-boogaloo.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/repo-tools': patch ---- - -Fixed a bug with the `generate-catalog-info` command that could cause `metadata.description` values to be overwritten by `package.json` description values only because unrelated attributes were being changed. diff --git a/.changeset/repo-tools-boo-descriptions.md b/.changeset/repo-tools-boo-descriptions.md deleted file mode 100644 index 5973dd7127..0000000000 --- a/.changeset/repo-tools-boo-descriptions.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/repo-tools': patch ---- - -Fixed a bug with the `generate-catalog-info` command that could cause the `--dry-run` flag to indicate changes to files when no changes would actually be made if the command were run without the flag. diff --git a/.changeset/repo-tools-ci-toldya-so.md b/.changeset/repo-tools-ci-toldya-so.md deleted file mode 100644 index 20425fc631..0000000000 --- a/.changeset/repo-tools-ci-toldya-so.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/repo-tools': patch ---- - -Added a `--ci` flag to the `generate-catalog-info` command. This flag behaves similarly to the same flag on `api-reports`: if `catalog-info.yaml` files would have been added or modified, then the process exits with status code `1`, and instructions are printed. diff --git a/.changeset/rich-fishes-deny.md b/.changeset/rich-fishes-deny.md deleted file mode 100644 index c90d76f20d..0000000000 --- a/.changeset/rich-fishes-deny.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-tasks': patch ---- - -Avoid starting task janitor in tests. diff --git a/.changeset/rotten-bees-wave.md b/.changeset/rotten-bees-wave.md deleted file mode 100644 index a5ce8cae85..0000000000 --- a/.changeset/rotten-bees-wave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-github': minor ---- - -Added a `catalogModuleGithubOrgEntityProvider` for the new backend system diff --git a/.changeset/rude-dolphins-reply.md b/.changeset/rude-dolphins-reply.md deleted file mode 100644 index 89545cde1f..0000000000 --- a/.changeset/rude-dolphins-reply.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-techdocs-module-addons-contrib': minor ---- - -Enable zoom icon for techdocs images inside lightbox diff --git a/.changeset/short-planets-argue.md b/.changeset/short-planets-argue.md deleted file mode 100644 index c3134a59eb..0000000000 --- a/.changeset/short-planets-argue.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -When running `version:bump` it will now log duplicates instead of throwing an error diff --git a/.changeset/silent-icons-deny.md b/.changeset/silent-icons-deny.md deleted file mode 100644 index 3dd7d75c90..0000000000 --- a/.changeset/silent-icons-deny.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-app-api': patch ---- - -Extension points are now tracked via their ID rather than reference, in order to support package duplication. diff --git a/.changeset/silent-numbers-retire.md b/.changeset/silent-numbers-retire.md deleted file mode 100644 index ff5f11ecee..0000000000 --- a/.changeset/silent-numbers-retire.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-vault-backend': patch -'@backstage/plugin-vault': patch ---- - -Added ability to override vault secret engine value on catalog entity level using annotation `vault.io/secrets-engine` diff --git a/.changeset/silly-emus-remain.md b/.changeset/silly-emus-remain.md deleted file mode 100644 index 4fe605080a..0000000000 --- a/.changeset/silly-emus-remain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': patch ---- - -Add examples for `github:actions:dispatch` scaffolder actions. diff --git a/.changeset/silver-bananas-kick.md b/.changeset/silver-bananas-kick.md deleted file mode 100644 index b678f403a4..0000000000 --- a/.changeset/silver-bananas-kick.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-test-utils': patch ---- - -Serialize test database shutdown, and add logging diff --git a/.changeset/six-radios-smile.md b/.changeset/six-radios-smile.md deleted file mode 100644 index e4f4eed450..0000000000 --- a/.changeset/six-radios-smile.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-code-coverage-backend': patch ---- - -Correct the line hits calculation for Cobertura reports diff --git a/.changeset/six-wolves-admire.md b/.changeset/six-wolves-admire.md deleted file mode 100644 index efc80826c2..0000000000 --- a/.changeset/six-wolves-admire.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -'@backstage/integration': minor ---- - -Added `AzureDevOpsCredentialsProvider` to support multiple Azure DevOps organizations and **deprecated** `AzureIntegrationConfig.credential` and `AzureIntegrationConfig.token` in favour of `AzureIntegrationConfig.credentials`. You can now use specific credentials for different Azure DevOps (Server) organizations by specifying the `organizations` field on a credential: - -```yaml -integrations: - azure: - - host: dev.azure.com - credentials: - - organizations: - - my-org - - my-other-org - clientId: ${AZURE_CLIENT_ID} - clientSecret: ${AZURE_CLIENT_SECRET} - tenantId: ${AZURE_TENANT_ID} - - organizations: - - yet-another-org - personalAccessToken: ${PERSONAL_ACCESS_TOKEN} -``` - -See the [Azure integration documentation](https://backstage.io/docs/integrations/azure/locations) for more information. diff --git a/.changeset/slow-ducks-hunt.md b/.changeset/slow-ducks-hunt.md deleted file mode 100644 index 0aac3056cf..0000000000 --- a/.changeset/slow-ducks-hunt.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Added support for the `dev/index` entry point for backend plugins and modules. diff --git a/.changeset/slow-queens-visit.md b/.changeset/slow-queens-visit.md deleted file mode 100644 index 2df948e477..0000000000 --- a/.changeset/slow-queens-visit.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-opencost': minor ---- - -New OpenCost plugin provides an port of the latest OpenCost UI to Backstage with updated dependencies. The plugin's README covers installation and configuration diff --git a/.changeset/slow-suits-rescue.md b/.changeset/slow-suits-rescue.md deleted file mode 100644 index 96a963f19f..0000000000 --- a/.changeset/slow-suits-rescue.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-gcp': patch ---- - -Fix GKE endpoint parsing - -Endpoint is an IP, not url. It is always https on default (443) port -ref: https://cloud.google.com/kubernetes-engine/docs/reference/rest/v1/projects.locations.clusters#Cluster diff --git a/.changeset/smart-islands-jog.md b/.changeset/smart-islands-jog.md deleted file mode 100644 index 50bc36191f..0000000000 --- a/.changeset/smart-islands-jog.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Fix OpenAPI schema for the facets endpoint diff --git a/.changeset/sour-rules-press.md b/.changeset/sour-rules-press.md deleted file mode 100644 index a47194d176..0000000000 --- a/.changeset/sour-rules-press.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-common': patch ---- - -Added retries for initial database creation, as well as set minimum connection pool size for the database creation client to 0 and lowered the connection acquisition timeout. diff --git a/.changeset/stale-points-breathe.md b/.changeset/stale-points-breathe.md deleted file mode 100644 index 36c01697d0..0000000000 --- a/.changeset/stale-points-breathe.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-tech-radar': patch ---- - -Fixed `RadarTimeline` text formatting. diff --git a/.changeset/strange-frogs-count.md b/.changeset/strange-frogs-count.md deleted file mode 100644 index 94fa6b9fb6..0000000000 --- a/.changeset/strange-frogs-count.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-components': patch ---- - -Add loading indicator to Table diff --git a/.changeset/stupid-ants-change.md b/.changeset/stupid-ants-change.md deleted file mode 100644 index c78c5e4250..0000000000 --- a/.changeset/stupid-ants-change.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-tech-insights-backend-module-jsonfc': patch ---- - -Handle extracting facts from 'not' conditions too diff --git a/.changeset/sweet-hairs-complain.md b/.changeset/sweet-hairs-complain.md deleted file mode 100644 index 56dede5617..0000000000 --- a/.changeset/sweet-hairs-complain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-backend-module-google-provider': minor ---- - -New module for `@backstage/plugin-auth-backend` that adds a Google auth provider. diff --git a/.changeset/sweet-pens-hunt.md b/.changeset/sweet-pens-hunt.md deleted file mode 100644 index 03e79ecebb..0000000000 --- a/.changeset/sweet-pens-hunt.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -'@backstage/config-loader': minor ---- - -Deep visibility now also applies to values that are not covered by the configuration schema. - -For example, given the following configuration schema: - -```ts -// plugins/a/config.schema.ts -export interface Config { - /** @deepVisibility frontend */ - a?: unknown; -} - -// plugins/a/config.schema.ts -export interface Config { - a?: { - b?: string; - }; -} -``` - -All values under `a` are now visible to the frontend, while previously only `a` and `a/b` would've been visible. diff --git a/.changeset/swift-frogs-drop.md b/.changeset/swift-frogs-drop.md deleted file mode 100644 index 3edff21ca2..0000000000 --- a/.changeset/swift-frogs-drop.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-playlist': patch ---- - -Limit the use of the same playlist name when adding a playlist diff --git a/.changeset/tall-countries-float.md b/.changeset/tall-countries-float.md deleted file mode 100644 index d6c6946b7a..0000000000 --- a/.changeset/tall-countries-float.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Add `"sideEffects": false` to `package.json` in frontend package templates. This can be added to existing packages using the new `yarn fix` command. diff --git a/.changeset/tall-items-clap.md b/.changeset/tall-items-clap.md deleted file mode 100644 index 613c280cbe..0000000000 --- a/.changeset/tall-items-clap.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-permission-backend-module-allow-all-policy': minor ---- - -Created package with policy `permissionModuleAllowAllPolicy` diff --git a/.changeset/tall-peas-visit.md b/.changeset/tall-peas-visit.md deleted file mode 100644 index 3e3ca76e46..0000000000 --- a/.changeset/tall-peas-visit.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Fix issue with `catalogFileName` not being a required property for `/analyze-location` diff --git a/.changeset/tame-jokes-do.md b/.changeset/tame-jokes-do.md deleted file mode 100644 index 8e9b5a6056..0000000000 --- a/.changeset/tame-jokes-do.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': minor ---- - -Improved the `parseEntityRef` Scaffolder filter by introducing the ability for users to provide default kind and/or namespace values. The filter now takes -2 arguments, similarly to the original [parseEntityRef](https://github.com/backstage/backstage/blob/v1.17.2/packages/catalog-model/src/entity/ref.ts#L77). diff --git a/.changeset/ten-wasps-serve.md b/.changeset/ten-wasps-serve.md deleted file mode 100644 index ee93c82c3b..0000000000 --- a/.changeset/ten-wasps-serve.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-github': patch -'@backstage/core-components': patch -'@backstage/plugin-search-react': patch -'@backstage/plugin-playlist': patch ---- - -Internal restructure to avoid circular imports diff --git a/.changeset/tender-garlics-report.md b/.changeset/tender-garlics-report.md deleted file mode 100644 index 919af4d4f8..0000000000 --- a/.changeset/tender-garlics-report.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Removed the experimental `package fix` command that was used to automatically add dependencies to `package.json`, but has since been replaced by the `no-undeclared-imports` rule from `@backstage/eslint-plugin`. diff --git a/.changeset/tender-seals-yawn.md b/.changeset/tender-seals-yawn.md deleted file mode 100644 index c709d9b6fb..0000000000 --- a/.changeset/tender-seals-yawn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/test-utils': patch ---- - -Add a new `MockTranslationApi` as an `/alpha` export. diff --git a/.changeset/thick-pets-drive.md b/.changeset/thick-pets-drive.md deleted file mode 100644 index ee09f8af06..0000000000 --- a/.changeset/thick-pets-drive.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-gitlab': minor ---- - -Fix Gitlab.com user ingestion by scoping GitlabOrgDiscoveryEntityProvider to a group. - -**BREAKING** The `group` parameter is now required Gitlab.com Org Data integrations and the backend will fail to start without this option configured. - -```diff -catalog: - providers: - gitlab: - yourProviderId: - host: gitlab.com - orgEnabled: true -+ group: org/teams -``` diff --git a/.changeset/thin-dryers-repeat.md b/.changeset/thin-dryers-repeat.md deleted file mode 100644 index bcf62f21de..0000000000 --- a/.changeset/thin-dryers-repeat.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-app-api': patch ---- - -Add support for installing features as package imports, for example `backend.add(import('my-plugin'))`. diff --git a/.changeset/thin-ladybugs-lick.md b/.changeset/thin-ladybugs-lick.md deleted file mode 100644 index 41707e22d0..0000000000 --- a/.changeset/thin-ladybugs-lick.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-common': patch ---- - -Minor internal refactor diff --git a/.changeset/three-hounds-wonder.md b/.changeset/three-hounds-wonder.md deleted file mode 100644 index fd4cb486bc..0000000000 --- a/.changeset/three-hounds-wonder.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder': minor ---- - -adding a .zip download to dry run results page, including zip.js as dependency diff --git a/.changeset/three-nails-remember.md b/.changeset/three-nails-remember.md deleted file mode 100644 index 6df9b43801..0000000000 --- a/.changeset/three-nails-remember.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/test-utils': patch ---- - -Add support for React Testing Library 13+, and thus React 18. - -We're exposing an additional option to the `render*` methods to enable the [`legacyRoot`](https://testing-library.com/docs/react-testing-library/api/#legacyroot) flow. diff --git a/.changeset/tiny-bulldogs-grow.md b/.changeset/tiny-bulldogs-grow.md deleted file mode 100644 index 3c999b8762..0000000000 --- a/.changeset/tiny-bulldogs-grow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': minor ---- - -set azure annotation `dev.azure.com/project-repo` in `AnnotateScmSlugEntityProcessor` to find the project and repo information for the repos that contains `dev.azure.com` in the url diff --git a/.changeset/tricky-melons-fold.md b/.changeset/tricky-melons-fold.md deleted file mode 100644 index 036413ea8e..0000000000 --- a/.changeset/tricky-melons-fold.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-app-api': patch ---- - -Backend startup will now fail if any circular service dependencies are detected. diff --git a/.changeset/twelve-elephants-pay.md b/.changeset/twelve-elephants-pay.md deleted file mode 100644 index 08fb983b6f..0000000000 --- a/.changeset/twelve-elephants-pay.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/plugin-techdocs-backend': minor -'@backstage/plugin-techdocs-node': minor -'@techdocs/cli': minor ---- - -Add optional config and cli option for techdocs to specify default mkdocs plugins. diff --git a/.changeset/twenty-worms-enjoy.md b/.changeset/twenty-worms-enjoy.md deleted file mode 100644 index ef820a3c9e..0000000000 --- a/.changeset/twenty-worms-enjoy.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': minor ---- - -**DEPRECATION**: Deprecated `ScaffolderEntitiesProcessor`, which should now instead be imported from `@backstage/plugin-catalog-backend-module-scaffolder-entity-model`. - -`catalogModuleTemplateKind` was also moved to that package and renamed to `catalogModuleScaffolderEntityModel`, without any deprecation since it was an alpha export. diff --git a/.changeset/warm-llamas-bake.md b/.changeset/warm-llamas-bake.md deleted file mode 100644 index 3da4a9b94d..0000000000 --- a/.changeset/warm-llamas-bake.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/config-loader': patch ---- - -Do not unnecessarily notify subscribers when no-op updates to config happen diff --git a/.changeset/warm-panthers-lick.md b/.changeset/warm-panthers-lick.md deleted file mode 100644 index b06809fac1..0000000000 --- a/.changeset/warm-panthers-lick.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-backend-module-github-provider': minor ---- - -New module for `@backstage/plugin-auth-backend` that adds a GitHub auth provider. diff --git a/.changeset/weak-tomatoes-dance.md b/.changeset/weak-tomatoes-dance.md deleted file mode 100644 index 446051e16f..0000000000 --- a/.changeset/weak-tomatoes-dance.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-github': patch ---- - -Properly support custom `userTransformer` returning `undefined` in `GithubMultiOrgEntityProvider` diff --git a/.changeset/wet-donuts-fry.md b/.changeset/wet-donuts-fry.md deleted file mode 100644 index 1f4c8dc4fc..0000000000 --- a/.changeset/wet-donuts-fry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-scaffolder-entity-model': minor ---- - -Added a dedicated module to collect the `ScaffolderEntitiesProcessor` and `catalogModuleTemplateKind`. diff --git a/.changeset/wise-boxes-kiss.md b/.changeset/wise-boxes-kiss.md deleted file mode 100644 index ea3abd594d..0000000000 --- a/.changeset/wise-boxes-kiss.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Include default alpha export during package detection diff --git a/.changeset/wise-tables-add.md b/.changeset/wise-tables-add.md deleted file mode 100644 index 987c74cf53..0000000000 --- a/.changeset/wise-tables-add.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-plugin-api': patch ---- - -Service factory functions are now marked as feature factories that can be installed in the backend. diff --git a/.changeset/witty-ants-cover.md b/.changeset/witty-ants-cover.md deleted file mode 100644 index 7f499a88ae..0000000000 --- a/.changeset/witty-ants-cover.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-home': patch ---- - -Allow specifying static widgets to custom home page diff --git a/.changeset/witty-pans-flash.md b/.changeset/witty-pans-flash.md deleted file mode 100644 index 107ef90973..0000000000 --- a/.changeset/witty-pans-flash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-playlist': patch ---- - -Fix the Ui style of the search bar diff --git a/.changeset/yellow-trains-protect.md b/.changeset/yellow-trains-protect.md deleted file mode 100644 index 4b8c50ac3e..0000000000 --- a/.changeset/yellow-trains-protect.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -'@backstage/plugin-code-coverage-backend': patch -'@backstage/plugin-tech-insights-backend': patch -'@backstage/plugin-linguist-backend': patch -'@backstage/backend-common': patch -'@backstage/plugin-catalog-backend': patch -'@backstage/backend-tasks': patch -'@backstage/plugin-app-backend': patch -'@backstage/plugin-bazaar-backend': patch -'@backstage/plugin-scaffolder-backend': patch ---- - -Changes needed to support MySQL diff --git a/.changeset/yellow-yaks-behave.md b/.changeset/yellow-yaks-behave.md deleted file mode 100644 index 546d74c3e4..0000000000 --- a/.changeset/yellow-yaks-behave.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/core-plugin-api': minor -'@backstage/core-app-api': minor -'@backstage/plugin-user-settings': patch ---- - -Introduced experimental support for internationalization. diff --git a/.changeset/young-ants-nail.md b/.changeset/young-ants-nail.md deleted file mode 100644 index 6648098687..0000000000 --- a/.changeset/young-ants-nail.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-github': patch ---- - -Allow github user and team transforms to return any Entity diff --git a/.changeset/young-panthers-mix.md b/.changeset/young-panthers-mix.md deleted file mode 100644 index cbaf3b3704..0000000000 --- a/.changeset/young-panthers-mix.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -'@backstage/plugin-tech-insights-backend': patch -'@backstage/plugin-microsoft-calendar': patch -'@backstage/plugin-scaffolder-backend': patch -'@backstage/plugin-catalog-backend': patch -'@backstage/backend-tasks': patch -'@backstage/plugin-cloudbuild': patch -'@backstage/plugin-gcalendar': patch -'@backstage/plugin-xcmetrics': patch -'@backstage/plugin-ilert': patch ---- - -Update to handle invalid luxon values diff --git a/docs/releases/v1.18.0-changelog.md b/docs/releases/v1.18.0-changelog.md new file mode 100644 index 0000000000..aa06a6e8cd --- /dev/null +++ b/docs/releases/v1.18.0-changelog.md @@ -0,0 +1,4483 @@ +# Release v1.18.0 + +## @backstage/config@1.1.0 + +### Minor Changes + +- 62f448edb0b5: Added a `readDurationFromConfig` function + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## @backstage/config-loader@1.5.0 + +### Minor Changes + +- 9606ba0939e6: Deep visibility now also applies to values that are not covered by the configuration schema. + + For example, given the following configuration schema: + + ```ts + // plugins/a/config.schema.ts + export interface Config { + /** @deepVisibility frontend */ + a?: unknown; + } + + // plugins/a/config.schema.ts + export interface Config { + a?: { + b?: string; + }; + } + ``` + + All values under `a` are now visible to the frontend, while previously only `a` and `a/b` would've been visible. + +### Patch Changes + +- 8cec7664e146: Removed `@types/node` dependency +- f9657b891b00: Do not unnecessarily notify subscribers when no-op updates to config happen +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/cli-common@0.1.12 + +## @backstage/core-app-api@1.10.0 + +### Minor Changes + +- 18619f793c94: Fixed two bugs in how the `OAuth2Session` type represents the underlying data. The `expiresAt` and `backstageIdentity` are now both optional, since that's what they are in practice. This is not considered a breaking change since it was effectively a bug in the modelling of the state that this type represents, and the type was not used in any other external contract. +- 18619f793c94: The `OAuth` class which is used by all OAuth providers will now consider both the session expiration of both the Backstage identity as well as the upstream identity provider, and refresh the session with either of them is about to expire. +- 6e30769cc627: Introduced experimental support for internationalization. + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 9fe827b380e1: Internal refactor +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + +## @backstage/core-plugin-api@1.6.0 + +### Minor Changes + +- 18619f793c94: Added the optional `expiresAt` field that may now be part of a `BackstageIdentityResponse`. +- 6e30769cc627: Introduced experimental support for internationalization. + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + +## @backstage/frontend-app-api@0.1.0 + +### Minor Changes + +- 628ca7e458e4: Initial release + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-graphiql@0.2.54 + - @backstage/frontend-plugin-api@0.1.0 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/types@1.1.1 + +## @backstage/frontend-plugin-api@0.1.0 + +### Minor Changes + +- 628ca7e458e4: Initial release + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.6.0 + - @backstage/types@1.1.1 + +## @backstage/integration@1.7.0 + +### Minor Changes + +- 5f1a92b9f19f: Added `AzureDevOpsCredentialsProvider` to support multiple Azure DevOps organizations and **deprecated** `AzureIntegrationConfig.credential` and `AzureIntegrationConfig.token` in favour of `AzureIntegrationConfig.credentials`. You can now use specific credentials for different Azure DevOps (Server) organizations by specifying the `organizations` field on a credential: + + ```yaml + integrations: + azure: + - host: dev.azure.com + credentials: + - organizations: + - my-org + - my-other-org + clientId: ${AZURE_CLIENT_ID} + clientSecret: ${AZURE_CLIENT_SECRET} + tenantId: ${AZURE_TENANT_ID} + - organizations: + - yet-another-org + personalAccessToken: ${PERSONAL_ACCESS_TOKEN} + ``` + + See the [Azure integration documentation](https://backstage.io/docs/integrations/azure/locations) for more information. + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 2d2fc9d20ebb: Additional fix for Gitiles auth links +- cb2e19d82d95: Gitiles: Fixed auth prefix issue +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + +## @techdocs/cli@1.5.0 + +### Minor Changes + +- 10a86bd4ae12: Add optional config and cli option for techdocs to specify default mkdocs plugins. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-techdocs-node@1.8.0 + - @backstage/cli-common@0.1.12 + +## @backstage/plugin-adr-backend@0.4.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 + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-adr-common@0.2.15 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-airbrake-backend@0.3.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 + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-auth-backend@0.19.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 + +- 080cc7794700: Migrated the GitLab auth provider to be implemented using the new `@backstage/plugin-auth-backend-module-gitlab-provider` module. +- 7944d43f4790: Added `authPlugin` export for the new backend system. The plugin does not include any built-in auth providers, they must instead be added by installing additional modules, for example `authModuleGoogleProvider` from `@backstage/plugin-auth-backend-module-google-provider`. +- 8513cd7d00e3: Deprecated several exports that are now available from `@backstage/plugin-auth-node` instead. +- 7944d43f4790: Added the ability to disable the built-in auth providers by passing `disableDefaultProviderFactories` to `createRouter`. +- 7944d43f4790: The algorithm used when generating Backstage tokens can be configured via `auth.identityTokenAlgorithm`. +- Updated dependencies + - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.1.0 + - @backstage/plugin-auth-backend-module-github-provider@0.1.0 + - @backstage/plugin-auth-backend-module-gitlab-provider@0.1.0 + - @backstage/plugin-auth-backend-module-google-provider@0.1.0 + - @backstage/plugin-auth-backend-module-oauth2-provider@0.1.0 + - @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/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + +## @backstage/plugin-auth-backend-module-gcp-iap-provider@0.1.0 + +### Minor Changes + +- 8513cd7d00e3: New module for `@backstage/plugin-auth-backend` that adds a GCP IAP auth provider. + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-auth-backend-module-github-provider@0.1.0 + +### Minor Changes + +- 23af27f5ce79: New module for `@backstage/plugin-auth-backend` that adds a GitHub auth provider. + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-auth-backend-module-gitlab-provider@0.1.0 + +### Minor Changes + +- 080cc7794700: New module for `@backstage/plugin-auth-backend` that adds a GitLab auth provider. + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-auth-backend-module-google-provider@0.1.0 + +### Minor Changes + +- 8513cd7d00e3: New module for `@backstage/plugin-auth-backend` that adds a Google auth provider. + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.0 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-auth-backend-module-oauth2-provider@0.1.0 + +### Minor Changes + +- 101cf1d13b04: New module for `@backstage/plugin-auth-backend` that adds a `oauth2` auth provider. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-auth-node@0.3.0 + +### Minor Changes + +- 8513cd7d00e3: Introduced a new system for building auth providers for `@backstage/plugin-auth-backend`, which both increases the amount of code re-use across providers, and also works better with the new backend system. + + Many existing types have been moved from `@backstage/plugin-auth-backend` in order to avoid a direct dependency on the plugin from modules. + + Auth provider integrations are now primarily implemented through a pattern of creating "authenticators", which are in turn specific to each kind of integrations. Initially there are two types: `createOAuthAuthenticator` and `createProxyAuthenticator`. These come paired with functions that let you create the corresponding route handlers, `createOAuthRouteHandlers` and `createProxyAuthRouteHandlers`, as well as provider factories, `createOAuthProviderFactory` and `createProxyAuthProviderFactory`. This new authenticator pattern allows the sign-in logic to be separated from the auth integration logic, allowing it to be completely re-used across all providers of the same kind. + + The new provider factories also implement a new declarative way to configure sign-in resolvers, rather than configuration through code. Sign-in resolvers can now be configured through the `resolvers` configuration key, where the first resolver that provides an identity will be used, for example: + + ```yaml + auth: + providers: + google: + development: + clientId: ... + clientSecret: ... + signIn: + resolvers: + - resolver: emailMatchingUserEntityAnnotation + - resolver: emailLocalPartMatchingUserEntityName + ``` + + These configurable resolvers are created with a new `createSignInResolverFactory` function, which creates a sign-in resolver factory, optionally with an options schema that will be used both when configuring the sign-in resolver through configuration and code. + + The internal helpers from `@backstage/plugin-auth-backend` that were used to implement auth providers using passport strategies have now also been made available as public API, through `PassportHelpers` and `PassportOAuthAuthenticatorHelper`. + +### Patch Changes + +- 18619f793c94: The `BackstageIdentityResponse` interface now has an optional `expiresInSeconds` field that can be used to signal session expiration. The `prepareBackstageIdentityResponse` utility will now also read the expiration from the provided token, and include it in the response. +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @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/backend-plugin-api@0.6.3 + +## @backstage/plugin-azure-devops-backend@0.4.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 + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-azure-devops-common@0.3.1 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-badges-backend@0.3.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 + +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @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/backend-plugin-api@0.6.3 + +## @backstage/plugin-bazaar-backend@0.3.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 + +- cfc3ca6ce060: Changes needed to support MySQL +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-catalog@1.13.0 + +### Minor Changes + +- e44f45ac4515: This change allows a new annotation of `backstage.io/techdocs-entity` this ref allows you to reference another entity for its TechDocs. This allows you have a single TechDoc for all items in a system, for example you might have a frontend and a backend in the same repo. This would allow you to have TechDocs build under a `System` entity while referencing the system e.g.: `backstage.io/techdocs-entity: system:default/example` that will show the systems docs in both the TechDocs button and the TechDocs tab without needing to do duplicate builds and filling the TechDocs page with garbage. + +### Patch Changes + +- 832eef72485b: Added title to props for `HasCards`. +- 163a41035e42: Fixed an issue where `EntitySwitch` was preventing the display of entity errors. +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-catalog-backend@1.13.0 + +### Minor Changes + +- 62f448edb0b5: Allow configuring the processing interval in your app-config, under the `catalog.processingInterval` key. +- 09cfc3cf467d: set azure annotation `dev.azure.com/project-repo` in `AnnotateScmSlugEntityProcessor` to find the project and repo information for the repos that contains `dev.azure.com` in the url + +### Patch Changes + +- 149361e81622: Fix to the `limit` parameter on entity queries. + +- 1fd2109739c1: Changed the processing loop task pipeline implementation from recursive to iterative + +- 71114ac50e02: 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')); + ``` + +- 0f8a97777489: Update OpenAPI schema to relax the encoding validation of all request parameters. + +- 0198aa596fd9: Fixed a link to the frontend Backstage plugin that had pointed to itself. + +- 2d32d8a611e3: Fixed validation of the `fullTextFilterFields` query parameter. + +- acffa17027b6: Added some examples to the catalog OpenAPI definition + +- 45947d3b2759: Fixes an issue where `order` was not a recognized parameter for the `/entities` endpoint. + +- 41d1b2d628ea: Fix OpenAPI schema for the facets endpoint + +- 618257f3e413: Fix issue with `catalogFileName` not being a required property for `/analyze-location` + +- cfc3ca6ce060: Changes needed to support MySQL + +- 814feeed7343: Update to handle invalid luxon values + +- Updated dependencies + - @backstage/plugin-search-backend-module-catalog@0.1.7 + - @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/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/plugin-search-common@1.2.6 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/backend-openapi-utils@0.0.4 + - @backstage/plugin-events-node@0.2.12 + +## @backstage/plugin-catalog-backend-module-github@0.4.0 + +### Minor Changes + +- fa7004d9722c: Added a `catalogModuleGithubOrgEntityProvider` for the new backend system + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- 3d63e60f3c36: Internal restructure to avoid circular imports + +- 96353bb7cb4a: Properly support custom `userTransformer` returning `undefined` in `GithubMultiOrgEntityProvider` + +- 3c44761b9191: Allow github user and team transforms to return any Entity + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-events-node@0.2.12 + +## @backstage/plugin-catalog-backend-module-gitlab@0.3.0 + +### Minor Changes + +- 3d73bafd85c9: Fix Gitlab.com user ingestion by scoping GitlabOrgDiscoveryEntityProvider to a group. + + **BREAKING** The `group` parameter is now required Gitlab.com Org Data integrations and the backend will fail to start without this option configured. + + ```diff + catalog: + providers: + gitlab: + yourProviderId: + host: gitlab.com + orgEnabled: true + + group: org/teams + ``` + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + +## @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.0 + +### Minor Changes + +- d5313ede3529: Added a dedicated module to collect the `ScaffolderEntitiesProcessor` and `catalogModuleTemplateKind`. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + +## @backstage/plugin-catalog-backend-module-unprocessed@0.3.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 + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.0 + - @backstage/catalog-model@1.4.2 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-catalog-import@0.10.0 + +### Minor Changes + +- c3c1fd3a1765: Slight change to the `PreparePullRequestFormProps`, because of an update to `react-hook-form`. + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + +## @backstage/plugin-devtools-backend@0.2.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 + +- 12e644aa4eef: Show resource utilization in `DevTools` plugin +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-devtools-common@0.1.4 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/config-loader@1.5.0 + - @backstage/cli-common@0.1.12 + +## @backstage/plugin-entity-feedback-backend@0.2.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 + +- 740155e8e976: Improve backend logging if method calls fail +- Updated dependencies + - @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/plugin-entity-feedback-common@0.1.3 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-kafka-backend@0.3.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 + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-kubernetes-backend@0.12.0 + +### Minor Changes + +- 0ad36158d980: Integrators can now bring their own auth strategies through the use of the `addAuthStrategy` method on `KubernetesBuilder`. + + **BREAKING** on the slight chance you were using the `setAuthTranslatorMap` method on `KubernetesBuilder`, it has been removed along with the entire `KubernetesAuthTranslator` interface. This notion has been replaced with the more focused concept of an `AuthenticationStrategy`. Converting a translator to a strategy should not be especially difficult. + +### Patch Changes + +- ccf00accb408: Add AWS Annotations to Kubernetes Cluster Resource + +- 72390ab2670d: Handle Proxy WS upgrade manually for WS handshakes + +- 71114ac50e02: 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')); + ``` + +- 024b2b66a332: Fixed a bug where requests to the proxy endpoint would fail for clusters with `caFile` configured + +- a8a614ba0d07: Minor `package.json` update. + +- 47ea122590f5: fix "undefined" kind for custom resources + +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.6.6 + - @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-permission-common@0.7.8 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/integration-aws-node@0.1.6 + +## @backstage/plugin-lighthouse-backend@0.3.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 + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-lighthouse-common@0.1.3 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + +## @backstage/plugin-linguist-backend@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 + +## @backstage/plugin-opencost@0.2.0 + +### Minor Changes + +- 1380a689ab56: New OpenCost plugin provides an port of the latest OpenCost UI to Backstage with updated dependencies. The plugin's README covers installation and configuration + +### 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. +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-periskop-backend@0.2.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 + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-permission-backend-module-allow-all-policy@0.1.0 + +### Minor Changes + +- 5f7b2153526b: Created package with policy `permissionModuleAllowAllPolicy` + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-proxy-backend@0.4.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 + +- 02ba0a2efd2a: Add the route name to an error message that appears when the backend + proxy wasn't well configured. This will help users to understand the + issue and fix the right configuration. +- 03691f0f3270: Add back the legacy proxy config, to get secret redaction +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-scaffolder@1.15.0 + +### Minor Changes + +- 0119c326394a: adding a .zip download to dry run results page, including zip.js as dependency + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 6e69c11a3535: Restored functionality to `OwnedEntityPicker` by converting deprecated `ui:options` input to `catalogFilter`. +- 8cec7664e146: Removed `@types/node` dependency +- b16c341ced45: Updated dependency `@rjsf/utils` to `5.13.0`. + Updated dependency `@rjsf/core-v5` to `npm:@rjsf/core@5.13.0`. + Updated dependency `@rjsf/material-ui-v5` to `npm:@rjsf/material-ui@5.13.0`. + Updated dependency `@rjsf/validator-ajv8` to `5.13.0`. +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/plugin-scaffolder-react@1.5.5 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-scaffolder-backend@1.17.0 + +### Minor Changes + +- b5f239b50bcf: Improved the `parseEntityRef` Scaffolder filter by introducing the ability for users to provide default kind and/or namespace values. The filter now takes + 2 arguments, similarly to the original [parseEntityRef](https://github.com/backstage/backstage/blob/v1.17.2/packages/catalog-model/src/entity/ref.ts#L77). +- d5313ede3529: **DEPRECATION**: Deprecated `ScaffolderEntitiesProcessor`, which should now instead be imported from `@backstage/plugin-catalog-backend-module-scaffolder-entity-model`. + + `catalogModuleTemplateKind` was also moved to that package and renamed to `catalogModuleScaffolderEntityModel`, without any deprecation since it was an alpha export. + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- a4989552d828: Add examples for `publish:github` and `publish:gitlab` scaffolder actions. + +- ded27b83ead2: Add examples for `publish:bitbucket` scaffolder actions. + +- 5f1a92b9f19f: Use `DefaultAzureDevOpsCredentialsProvider` to retrieve credentials for Azure DevOps. + +- fb57a4694fc6: Fixed the plugin and module ID of the alpha `catalogModuleTemplateKind` export. + +- f3c0b95e3ef1: Add examples for `github:actions:dispatch` scaffolder actions. + +- cfc3ca6ce060: Changes needed to support MySQL + +- 814feeed7343: Update to handle invalid luxon values + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.13.0 + - @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/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.0 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-scaffolder-node@0.2.3 + +## @backstage/plugin-search@1.4.0 + +### Minor Changes + +- b78f570f44d3: The SearchPage component can now be configured via app-config.yaml with default query parameters to define how it behaves when it is first loaded or reset. Check out the following example: + + ```yaml + search: + query: + pageLimit: 50 + ``` + + Acceptable values for `pageLimit` are `10`, `25`, `50` or `100`. + +### Patch Changes + +- 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/errors@1.2.2 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + +## @backstage/plugin-search-react@1.7.0 + +### Minor Changes + +- b78f570f44d3: The SearchPage component can now be configured via app-config.yaml with default query parameters to define how it behaves when it is first loaded or reset. Check out the following example: + + ```yaml + search: + query: + pageLimit: 50 + ``` + + Acceptable values for `pageLimit` are `10`, `25`, `50` or `100`. + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 45f8a95e1068: Optionally initializes the search context with default settings for search queries only when the config is defined, rather than always overriding it. +- 3d63e60f3c36: Internal restructure to avoid circular imports +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + +## @backstage/plugin-techdocs@1.7.0 + +### Minor Changes + +- e44f45ac4515: This change allows a new annotation of `backstage.io/techdocs-entity` this ref allows you to reference another entity for its TechDocs. This allows you have a single TechDoc for all items in a system, for example you might have a frontend and a backend in the same repo. This would allow you to have TechDocs build under a `System` entity while referencing the system e.g.: `backstage.io/techdocs-entity: system:default/example` that will show the systems docs in both the TechDocs button and the TechDocs tab without needing to do duplicate builds and filling the TechDocs page with garbage. + +### Patch Changes + +- 88c9525a36f3: Fixed bug in styles that caused next and previous links in footer to overlap page content. +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @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/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/plugin-techdocs-react@1.1.10 + - @backstage/theme@0.4.2 + +## @backstage/plugin-techdocs-backend@1.7.0 + +### Minor Changes + +- 5985d458ee30: Add a `techdocs.publisher.azureBlobStorage.connectionString` app-config setting, which can be leveraged for improved Azurite support. +- 10a86bd4ae12: Add optional config and cli option for techdocs to specify default mkdocs plugins. + +### Patch Changes + +- 60af8017dd84: Expand techdocs.publisher.type with `googleGcs`,`awsS3`,`azureBlobStorage` and `openStackSwift` + +- 71114ac50e02: 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')); + ``` + +- a8a614ba0d07: Minor `package.json` update. + +- Updated dependencies + - @backstage/plugin-search-backend-module-techdocs@0.1.7 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-techdocs-node@1.8.0 + +## @backstage/plugin-techdocs-module-addons-contrib@1.1.0 + +### Minor Changes + +- 86c19906fe4b: Enable zoom icon for techdocs images inside lightbox + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/integration@1.7.0 + - @backstage/plugin-techdocs-react@1.1.10 + - @backstage/theme@0.4.2 + +## @backstage/plugin-techdocs-node@1.8.0 + +### Minor Changes + +- 5985d458ee30: Add a `techdocs.publisher.azureBlobStorage.connectionString` app-config setting, which can be leveraged for improved Azurite support. +- 10a86bd4ae12: Add optional config and cli option for techdocs to specify default mkdocs plugins. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/integration-aws-node@0.1.6 + +## @backstage/plugin-todo-backend@0.3.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 + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/backend-openapi-utils@0.0.4 + +## @backstage/plugin-user-settings-backend@0.2.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 + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/app-defaults@1.4.3 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/theme@0.4.2 + +## @backstage/backend-app-api@0.5.3 + +### Patch Changes + +- 154632d8753b: Add support for discovering additional service factories during startup. +- 37a20c7f14aa: Adds include and exclude configuration to feature discovery of backend packages + Adds alpha modules to feature discovery +- cb7fc410ed99: The experimental backend feature discovery now only considers default exports from packages. It no longer filters packages to include based on the package role, except that `'cli'` packages are ignored. However, the `"backstage"` field is still required in `package.json`. +- 3fc64b9e2f8f: Extension points are now tracked via their ID rather than reference, in order to support package duplication. +- 3b30b179cb38: Add support for installing features as package imports, for example `backend.add(import('my-plugin'))`. +- b219d097b3f4: Backend startup will now fail if any circular service dependencies are detected. +- 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/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/config-loader@1.5.0 + - @backstage/cli-common@0.1.12 + - @backstage/cli-node@0.1.4 + +## @backstage/backend-common@0.19.5 + +### Patch Changes + +- 6847cd6225d6: Avoid starting database keepalive loop in tests. +- fd3fdd0e3338: The root logger is now initialized lazily, fixing a circular dependency issue with `@backstage/backend-app-api` that would result in `Cannot read properties of undefined (reading 'redacter')`. +- 5f1a92b9f19f: Use `DefaultAzureDevOpsCredentialsProvider` to retrieve credentials for Azure DevOps. +- 19a140418cc8: Added retries for initial database creation, as well as set minimum connection pool size for the database creation client to 0 and lowered the connection acquisition timeout. +- 05508a9757d2: Minor internal refactor +- cfc3ca6ce060: Changes needed to support MySQL +- Updated dependencies + - @backstage/backend-app-api@0.5.3 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/config-loader@1.5.0 + - @backstage/backend-dev-utils@0.1.1 + - @backstage/cli-common@0.1.12 + - @backstage/integration-aws-node@0.1.6 + +## @backstage/backend-defaults@0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.5.3 + - @backstage/backend-common@0.19.5 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/backend-openapi-utils@0.0.4 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.2 + +## @backstage/backend-plugin-api@0.6.3 + +### Patch Changes + +- ba4506076e2d: Ensure that root scoped services cannot accept (at a type level) plugin scoped deps +- 474b792d6a43: Service factory functions are now marked as feature factories that can be installed in the backend. +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/types@1.1.1 + +## @backstage/backend-tasks@0.5.8 + +### Patch Changes + +- 8fd91547cd0b: When starting a task that existed before, with a faster schedule than it + previously had, the task will now correctly obey the faster schedule + immediately. Before this fix, the new schedule was only obeyed after the next + pending (according to the old schedule) run had completed. +- 62f448edb0b5: Use `readDurationFromConfig` from the config package +- 74604806aae8: Avoid starting task janitor in tests. +- cfc3ca6ce060: Changes needed to support MySQL +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## @backstage/backend-test-utils@0.2.3 + +### Patch Changes + +- 58cb5e5cea7b: Introduced a new utility for testing service factories, `ServiceFactoryTester`. +- 202e52c5e361: Add support for installing backend features via module imports, for example `startTestBackend({ features: [import('my-plugin')] })`. +- 9fb3b5373c45: Extended `mockService` to also include mocked variants, for example `mockServices.lifecycle.mock()`. The returned mocked implementation will have a `factory` property which is a service factory for itself. You can also pass a partial implementation of the service to the mock function to use a mock implementation of specific methods. +- eb1594da5812: Serialize test database shutdown, and add logging +- Updated dependencies + - @backstage/backend-app-api@0.5.3 + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/catalog-client@1.4.4 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + +## @backstage/catalog-model@1.4.2 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## @backstage/cli@0.22.13 + +### Patch Changes + +- 04eabd21bee4: Added the ability to specify the listen address for the `--inspect` and `--inspect-brk` command. You can now set the `ip` and port of the `inspect` and `inspectBrk` by adding for example `--inspect=0.0.0.0:9229` +- 278d9326eb40: Added the ability to create a plain backend module with the `new` command. +- 4d5eeec52d80: Add ESM loader for the experimental backend start command. +- 3494c502aba7: Added a new `repo fix` command that fixes auto-fixable problems in all packages. Initially the command fixes package export declarations, as well as marks all non-bundled frontend packages as side-effect free. Marking packages as free of side-effects can drastically reduce the Webpack bundle size. +- f36113ca2305: Add experimental support for frontend package discovery. +- a23fce763c6a: Fixed a bug where package exports entry points could not be `.tsx` files. +- 8cec7664e146: Removed `@types/node` dependency +- ea779492ad88: Updated dependency `run-script-webpack-plugin` to `^0.2.0`. +- 4af4defcc114: When running `version:bump` it will now log duplicates instead of throwing an error +- 71d4368ae5cc: Added support for the `dev/index` entry point for backend plugins and modules. +- 956d226eeeee: Add `"sideEffects": false` to `package.json` in frontend package templates. This can be added to existing packages using the new `yarn fix` command. +- cd7331587eb3: Removed the experimental `package fix` command that was used to automatically add dependencies to `package.json`, but has since been replaced by the `no-undeclared-imports` rule from `@backstage/eslint-plugin`. +- 219b46ae1a50: Include default alpha export during package detection +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/release-manifests@0.0.10 + - @backstage/types@1.1.1 + - @backstage/config-loader@1.5.0 + - @backstage/cli-common@0.1.12 + - @backstage/cli-node@0.1.4 + - @backstage/eslint-plugin@0.1.3 + +## @backstage/cli-node@0.1.4 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/cli-common@0.1.12 + +## @backstage/core-components@0.13.5 + +### Patch Changes + +- 0c9907645aab: Fixed an issue causing `StructuredMetadataTable` to crash in case metadata contained `null` values. +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 9b74166d11a1: Added `` component which introduces an optional automatic logout mechanism on user inactivity +- 117027636b10: Minor internal tweak to handle `classnames` update +- 8cec7664e146: Removed `@types/node` dependency +- db92d1244897: Updated dependency `rc-progress` to `3.5.1`. +- 47782f4bfa5b: Add loading indicator to Table +- 3d63e60f3c36: Internal restructure to avoid circular imports +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/version-bridge@1.0.5 + +## @backstage/create-app@0.5.5 + +### Patch Changes + +- 05508a9757d2: Updated the backend template to no longer create duplicate connection pools to plugins that use the task scheduler. + + To apply this change in your own repository, perform the following small update: + + ```diff + // in packages/backend/src/index.ts + - const taskScheduler = TaskScheduler.fromConfig(config); + + const taskScheduler = TaskScheduler.fromConfig(config, { databaseManager }); + ``` + +- a4c08241ad92: Switched the template to use TypeScript 5.2 by default. + +- f8c8e8de37b6: Bumped create-app version. + +- fc1a38bc5723: Bumped create-app version. + +- 4606e005df5d: Added a `fix` scripts that calls the new `backstage-cli repo fix` command. + + To apply this change to an existing app, make the following change to your root `package.json`: + + ```diff + "test": "backstage-cli repo test", + "test:all": "backstage-cli repo test --coverage", + + "fix": "backstage-cli repo fix", + "lint": "backstage-cli repo lint --since origin/master", + ``` + +- 612594022245: Add a notification when `yarn install` is taking a long time. + +- 8db70ecbb325: Updated Dockerfile to include `apt-get update` when installing the SQLite dependency + +- 8cec7664e146: Removed `@types/node` dependency + +- Updated dependencies + - @backstage/cli-common@0.1.12 + +## @backstage/dev-utils@1.0.21 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/test-utils@1.4.3 + - @backstage/app-defaults@1.4.3 + - @backstage/catalog-model@1.4.2 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/errors@1.2.2 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/types@1.1.1 + +## @backstage/integration-aws-node@0.1.6 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + +## @backstage/integration-react@1.1.19 + +### 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/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/integration@1.7.0 + - @backstage/theme@0.4.2 + +## @backstage/release-manifests@0.0.10 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency + +## @backstage/repo-tools@0.3.4 + +### Patch Changes + +- 0109d3f11159: The `generate-catalog-info` command now uses the first listed `CODEOWNER` as Component owner when initially + creating the `catalog-info.yaml` file. It continues to allow any one listed `CODEOWNER` when updating + entity metadata. +- 6f874cdb04eb: Fixed a bug with the `generate-catalog-info` command that could cause `metadata.description` values to be overwritten by `package.json` description values only because unrelated attributes were being changed. +- ec13d3e86028: Fixed a bug with the `generate-catalog-info` command that could cause the `--dry-run` flag to indicate changes to files when no changes would actually be made if the command were run without the flag. +- db60a16e0a54: Added a `--ci` flag to the `generate-catalog-info` command. This flag behaves similarly to the same flag on `api-reports`: if `catalog-info.yaml` files would have been added or modified, then the process exits with status code `1`, and instructions are printed. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/cli-common@0.1.12 + - @backstage/cli-node@0.1.4 + +## @backstage/test-utils@1.4.3 + +### Patch Changes + +- 7032c214f3b4: Add pod exec terminal to Container Card + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + +- 8cec7664e146: Removed `@types/node` dependency + +- b5fbddc15dca: Add a new `MockTranslationApi` as an `/alpha` export. + +- 9ceb6195275a: Add support for React Testing Library 13+, and thus React 18. + + We're exposing an additional option to the `render*` methods to enable the [`legacyRoot`](https://testing-library.com/docs/react-testing-library/api/#legacyroot) flow. + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## @backstage/theme@0.4.2 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + +## @backstage/types@1.1.1 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + +## @backstage/version-bridge@1.0.5 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + +## @backstage/plugin-adr@0.6.7 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- aa844e704a32: support for i18n feature +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @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/plugin-adr-common@0.2.15 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-adr-common@0.2.15 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-search-common@1.2.6 + +## @backstage/plugin-airbrake@0.3.24 + +### 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/test-utils@1.4.3 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/dev-utils@1.0.21 + - @backstage/theme@0.4.2 + +## @backstage/plugin-allure@0.1.40 + +### 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/theme@0.4.2 + +## @backstage/plugin-analytics-module-ga@0.1.33 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-analytics-module-ga4@0.1.4 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-analytics-module-newrelic-browser@0.0.2 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + +## @backstage/plugin-apache-airflow@0.2.15 + +### 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/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + +## @backstage/plugin-api-docs@0.9.11 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog@1.13.0 + - @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/theme@0.4.2 + +## @backstage/plugin-api-docs-module-protoc-gen-doc@0.1.3 + +### 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. + +## @backstage/plugin-apollo-explorer@0.1.15 + +### 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/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-app-backend@0.3.51 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- cfc3ca6ce060: Changes needed to support MySQL + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/config-loader@1.5.0 + - @backstage/plugin-app-node@0.1.3 + +## @backstage/plugin-app-node@0.1.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-azure-devops@0.3.6 + +### 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-azure-devops-common@0.3.1 + - @backstage/theme@0.4.2 + +## @backstage/plugin-azure-devops-common@0.3.1 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + +## @backstage/plugin-azure-sites@0.1.13 + +### 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/plugin-azure-sites-common@0.1.1 + - @backstage/theme@0.4.2 + +## @backstage/plugin-azure-sites-backend@0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-azure-sites-common@0.1.1 + +## @backstage/plugin-azure-sites-common@0.1.1 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + +## @backstage/plugin-badges@0.2.48 + +### 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/theme@0.4.2 + +## @backstage/plugin-bazaar@0.2.16 + +### 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. +- Updated dependencies + - @backstage/cli@0.22.13 + - @backstage/plugin-catalog@1.13.0 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-bitbucket-cloud-common@0.2.12 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/integration@1.7.0 + +## @backstage/plugin-bitrise@0.1.51 + +### 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/theme@0.4.2 + +## @backstage/plugin-catalog-backend-module-aws@0.2.6 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.6.6 + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/integration-aws-node@0.1.6 + +## @backstage/plugin-catalog-backend-module-azure@0.1.22 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- 94f96508491d: Improve consistency of results from the `AzureDevOpsEntityProvider`. + +- 5f1a92b9f19f: Use `DefaultAzureDevOpsCredentialsProvider` to retrieve credentials for Azure DevOps. + +- 044b4f2fb1e3: Remove duplications from Azure search before committing the new locations to the catalog. + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + +## @backstage/plugin-catalog-backend-module-bitbucket@0.2.18 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.12 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-node@1.4.4 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.1.18 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.12 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-events-node@0.2.12 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.1.16 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + +## @backstage/plugin-catalog-backend-module-gcp@0.1.3 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- 201f07c27f1e: Fix GKE endpoint parsing + + Endpoint is an IP, not url. It is always https on default (443) port + ref: + +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.6.6 + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + +## @backstage/plugin-catalog-backend-module-gerrit@0.1.19 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.4.6 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-events-node@0.2.12 + +## @backstage/plugin-catalog-backend-module-ldap@0.5.18 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-node@1.4.4 + +## @backstage/plugin-catalog-backend-module-msgraph@0.5.10 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + +## @backstage/plugin-catalog-backend-module-openapi@0.1.19 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-node@1.4.4 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.1.8 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + +## @backstage/plugin-catalog-common@1.0.16 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + +## @backstage/plugin-catalog-graph@0.2.36 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-catalog-graphql@0.3.23 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-catalog-node@1.4.4 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-catalog-react@1.8.4 + +### Patch Changes + +- bd817209ddd7: Export the `EntityAutocompletePicker` component. +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 7029ba1ce0af: Added delete alert popup when user delete the entity +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + +## @backstage/plugin-catalog-unprocessed-entities@0.1.3 + +### 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/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 + +## @backstage/plugin-cicd-statistics@0.1.26 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + +## @backstage/plugin-cicd-statistics-module-gitlab@0.1.20 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-cicd-statistics@0.1.26 + +## @backstage/plugin-circleci@0.3.24 + +### 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/theme@0.4.2 + +## @backstage/plugin-cloudbuild@0.3.24 + +### 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 +- 814feeed7343: Update to handle invalid luxon values +- 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/theme@0.4.2 + +## @backstage/plugin-code-climate@0.1.24 + +### 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/theme@0.4.2 + +## @backstage/plugin-code-coverage@0.2.17 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 1d8f4f0a7486: Use fetchApi to ensure authorization is used when fetching code-coverage data +- 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/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-code-coverage-backend@0.2.17 + +### Patch Changes + +- 3f1367b956c6: Added support for LCOV coverage reports + +- df005d9932fb: Add text body parser for LCOV reports + +- 91ccb56fb418: Replace `express-xml-bodyparser` with `body-parser-xml`. + + `express-xml-bodyparser` was last updated 8 years ago + and currently depends on a version of `xml2js` which + contains a vulnerability. + + This change will swap it out in favor of `body-parser-xml` + which is more maintained and depends on a more recent `xml2js` + version without the vulnerability. + +- 33e606a797ef: Include auth token when fetching entity + +- d409ed988aed: Correct the line hits calculation for Cobertura reports + +- cfc3ca6ce060: Changes needed to support MySQL + +- Updated dependencies + - @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/integration@1.7.0 + +## @backstage/plugin-codescene@0.1.17 + +### 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 +- db92d1244897: Updated dependency `rc-progress` to `3.5.1`. +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-config-schema@0.1.45 + +### 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/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-cost-insights@0.12.13 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- a54cd411639e: Updated dependency `@types/pluralize` to `^0.0.30`. +- 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/plugin-cost-insights-common@0.1.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-cost-insights-common@0.1.2 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + +## @backstage/plugin-devtools@0.1.4 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 12e644aa4eef: Show resource utilization in `DevTools` plugin +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-devtools-common@0.1.4 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-devtools-common@0.1.4 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 12e644aa4eef: Show resource utilization in `DevTools` plugin +- Updated dependencies + - @backstage/plugin-permission-common@0.7.8 + - @backstage/types@1.1.1 + +## @backstage/plugin-dynatrace@7.0.4 + +### 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/theme@0.4.2 + +## @backstage/plugin-entity-feedback@0.2.7 + +### Patch Changes + +- 5e2e06db747a: Improve README to note that Backstage identity is required to be configured +- 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-entity-feedback-common@0.1.3 + - @backstage/theme@0.4.2 + +## @backstage/plugin-entity-feedback-common@0.1.3 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + +## @backstage/plugin-entity-validation@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-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/theme@0.4.2 + +## @backstage/plugin-events-backend@0.2.12 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + +## @backstage/plugin-events-backend-module-aws-sqs@0.2.6 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + +## @backstage/plugin-events-backend-module-azure@0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + +## @backstage/plugin-events-backend-module-bitbucket-cloud@0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + +## @backstage/plugin-events-backend-module-gerrit@0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + +## @backstage/plugin-events-backend-module-github@0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + +## @backstage/plugin-events-backend-module-gitlab@0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + +## @backstage/plugin-events-backend-test-utils@0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.12 + +## @backstage/plugin-events-node@0.2.12 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-explore@0.4.10 + +### Patch Changes + +- 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-explore-common@0.0.2 + - @backstage/plugin-explore-react@0.0.31 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-explore-backend@0.0.13 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-explore@0.1.7 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-explore-common@0.0.2 + - @backstage/plugin-search-common@1.2.6 + - @backstage/types@1.1.1 + +## @backstage/plugin-explore-common@0.0.2 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + +## @backstage/plugin-explore-react@0.0.31 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-explore-common@0.0.2 + +## @backstage/plugin-firehydrant@0.2.8 + +### 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/theme@0.4.2 + +## @backstage/plugin-fossa@0.2.56 + +### 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/theme@0.4.2 + +## @backstage/plugin-gcalendar@0.3.18 + +### 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 +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-gcp-projects@0.3.41 + +### 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/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-git-release-manager@0.3.37 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/integration@1.7.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-github-actions@0.6.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/integration-react@1.1.19 + - @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/integration@1.7.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-github-deployments@0.1.55 + +### 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/integration-react@1.1.19 + - @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/integration@1.7.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-github-issues@0.2.13 + +### 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/integration@1.7.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-github-pull-requests-board@0.1.18 + +### 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/integration@1.7.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-gitops-profiles@0.3.40 + +### 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/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-gocd@0.1.30 + +### Patch Changes + +- 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/theme@0.4.2 + +## @backstage/plugin-graphiql@0.2.54 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- b2fbeed5403b: Add support for using the FetchApi +- cf950c3b6eab: Added experimental exports for the new frontend system under `/alpha`. +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/frontend-plugin-api@0.1.0 + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-graphql-backend@0.1.41 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-catalog-graphql@0.3.23 + +## @backstage/plugin-graphql-voyager@0.1.7 + +### 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/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-home@0.5.8 + +### Patch Changes + +- 2bc96ce69eea: Fixed a bug where customizable home page cards would render missing their normal borders. +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 98bb77c1f0b8: Align zod dependency to align with other packages. +- 8cec7664e146: Removed `@types/node` dependency +- b16c341ced45: Updated dependency `@rjsf/utils` to `5.13.0`. + Updated dependency `@rjsf/core-v5` to `npm:@rjsf/core@5.13.0`. + Updated dependency `@rjsf/material-ui-v5` to `npm:@rjsf/material-ui@5.13.0`. + Updated dependency `@rjsf/validator-ajv8` to `5.13.0`. +- 1853ffa09b50: Allow specifying static widgets to custom home page +- Updated dependencies + - @backstage/plugin-home-react@0.1.3 + - @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 + +## @backstage/plugin-home-react@0.1.3 + +### 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 +- b16c341ced45: Updated dependency `@rjsf/utils` to `5.13.0`. + Updated dependency `@rjsf/core-v5` to `npm:@rjsf/core@5.13.0`. + Updated dependency `@rjsf/material-ui-v5` to `npm:@rjsf/material-ui@5.13.0`. + Updated dependency `@rjsf/validator-ajv8` to `5.13.0`. +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + +## @backstage/plugin-ilert@0.2.13 + +### 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 +- 814feeed7343: Update to handle invalid luxon values +- 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/theme@0.4.2 + +## @backstage/plugin-jenkins@0.8.6 + +### 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-jenkins-common@0.1.19 + - @backstage/theme@0.4.2 + +## @backstage/plugin-jenkins-backend@0.2.6 + +### Patch Changes + +- Updated dependencies + - @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-jenkins-common@0.1.19 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.14 + +## @backstage/plugin-jenkins-common@0.1.19 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + +## @backstage/plugin-kafka@0.3.24 + +### 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 + +## @backstage/plugin-kubernetes@0.10.3 + +### Patch Changes + +- 0ad36158d980: Loosened the type of the `auth` field in the body of requests to the `retrieveObjectsByServiceId` endpoint. Now any JSON object is allowed, which should make it easier for integrators to write their own custom auth strategies for Kubernetes. +- 7032c214f3b4: Add pod exec terminal to Container Card +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 6ddeade58b4c: Avoid eager use of `TextEncoder` in order not to break tests. +- 6a5e04e20e6e: fix logs dialog min height +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.6.6 + - @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/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-kubernetes-common@0.6.6 + +### Patch Changes + +- 0ad36158d980: Loosened the type of the `auth` field in the body of requests to the `retrieveObjectsByServiceId` endpoint. Now any JSON object is allowed, which should make it easier for integrators to write their own custom auth strategies for Kubernetes. +- ccf00accb408: Add AWS Annotations to Kubernetes Cluster Resource +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-permission-common@0.7.8 + +## @backstage/plugin-lighthouse@0.4.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/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-lighthouse-common@0.1.3 + - @backstage/theme@0.4.2 + +## @backstage/plugin-lighthouse-common@0.1.3 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/config@1.1.0 + +## @backstage/plugin-linguist@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 + +## @backstage/plugin-linguist-common@0.1.2 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + +## @backstage/plugin-microsoft-calendar@0.1.7 + +### 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 +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-newrelic@0.3.40 + +### 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. +- 55cb7061e072: Fixed bug in NewRelicComponent component where table would not sort correctly for numerical values. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-newrelic-dashboard@0.2.17 + +### 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. +- 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-nomad@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 + +## @backstage/plugin-nomad-backend@0.1.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + +## @backstage/plugin-octopus-deploy@0.2.6 + +### 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/theme@0.4.2 + +## @backstage/plugin-org@0.6.14 + +### 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. +- 43a2137bb829: Ensure direct relations are shown for User entities while keeping support for aggregating closest parent group ownership +- dd9329caea1c: Entity relations toggle should by default be aggregated for User entities +- 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/theme@0.4.2 + +## @backstage/plugin-org-react@0.1.13 + +### 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-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-pagerduty@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 + +## @backstage/plugin-periskop@0.1.22 + +### 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/theme@0.4.2 + +## @backstage/plugin-permission-backend@0.5.26 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- a8a614ba0d07: Minor `package.json` update. + +- 84ad6fccd4d5: Moved `permissionModuleAllowAllPolicy` to `@backstage/plugin-permission-backend-module-allow-all-policy` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-permission-common@0.7.8 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-permission-node@0.7.14 + +### Patch Changes + +- a8a614ba0d07: Minor `package.json` update. +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-permission-react@0.4.15 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-permission-common@0.7.8 + +## @backstage/plugin-playlist@0.1.16 + +### Patch Changes + +- 79847cb73ed7: Updated latest playlist screen in readme document +- ec4b0f8cd957: change color of delete icon to secondary in playlist table +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 2f3215bbbffe: Fix a bug that led to errors being thrown in guest mode +- 8cec7664e146: Removed `@types/node` dependency +- b5ba33a92750: Limit the use of the same playlist name when adding a playlist +- 3d63e60f3c36: Internal restructure to avoid circular imports +- fdbf215a8d8e: Fix the Ui style of the search bar +- 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-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/plugin-playlist-common@0.1.10 + - @backstage/plugin-search-react@1.7.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-playlist-backend@0.3.7 + +### Patch Changes + +- Updated dependencies + - @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-permission-common@0.7.8 + - @backstage/plugin-playlist-common@0.1.10 + - @backstage/plugin-permission-node@0.7.14 + +## @backstage/plugin-playlist-common@0.1.10 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/plugin-permission-common@0.7.8 + +## @backstage/plugin-puppetdb@0.1.7 + +### 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/theme@0.4.2 + +## @backstage/plugin-rollbar@0.4.24 + +### 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/theme@0.4.2 + +## @backstage/plugin-rollbar-backend@0.1.48 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.4 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-node@0.2.3 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.27 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-node@0.2.3 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.2.6 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-scaffolder-node@0.2.3 + +## @backstage/plugin-scaffolder-backend-module-rails@0.4.20 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-node@0.2.3 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.1.11 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-scaffolder-node@0.2.3 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.2.24 + +### Patch Changes + +- 4fa1c74cbadc: Enables dry-run functionality for the run:yeoman scaffolder action +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-node@0.2.3 + +## @backstage/plugin-scaffolder-common@1.4.1 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/types@1.1.1 + +## @backstage/plugin-scaffolder-node@0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-scaffolder-react@1.5.5 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- b16c341ced45: Updated dependency `@rjsf/utils` to `5.13.0`. + Updated dependency `@rjsf/core-v5` to `npm:@rjsf/core@5.13.0`. + Updated dependency `@rjsf/material-ui-v5` to `npm:@rjsf/material-ui@5.13.0`. + Updated dependency `@rjsf/validator-ajv8` to `5.13.0`. +- 27fef07f9229: Updated dependency `use-immer` to `^0.9.0`. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + +## @backstage/plugin-search-backend@1.4.3 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/backend-openapi-utils@0.0.4 + - @backstage/plugin-search-backend-node@1.2.7 + +## @backstage/plugin-search-backend-module-catalog@0.1.7 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-search-backend-node@1.2.7 + +## @backstage/plugin-search-backend-module-elasticsearch@1.3.6 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/integration-aws-node@0.1.6 + - @backstage/plugin-search-backend-node@1.2.7 + +## @backstage/plugin-search-backend-module-explore@0.1.7 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-explore-common@0.0.2 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-search-backend-node@1.2.7 + +## @backstage/plugin-search-backend-module-pg@0.5.12 + +### Patch Changes + +- 4ccf9204bc95: Added `indexerBatchSize` option to be able to control the size of the batches being indexed. Also added a debug log entry to list out all the entities in the batch + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-search-backend-node@1.2.7 + +## @backstage/plugin-search-backend-module-techdocs@0.1.7 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-techdocs-node@1.8.0 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-search-backend-node@1.2.7 + +## @backstage/plugin-search-backend-node@1.2.7 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-search-common@1.2.6 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/plugin-permission-common@0.7.8 + - @backstage/types@1.1.1 + +## @backstage/plugin-sentry@0.5.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/theme@0.4.2 + +## @backstage/plugin-shortcuts@0.3.14 + +### 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/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-sonarqube@0.7.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 +- db92d1244897: Updated dependency `rc-progress` to `3.5.1`. +- 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/plugin-sonarqube-react@0.1.8 + - @backstage/theme@0.4.2 + +## @backstage/plugin-sonarqube-backend@0.2.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + +## @backstage/plugin-sonarqube-react@0.1.8 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + +## @backstage/plugin-splunk-on-call@0.4.13 + +### 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/theme@0.4.2 + +## @backstage/plugin-stack-overflow@0.1.20 + +### Patch Changes + +- 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/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-stack-overflow-backend@0.2.7 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-search-common@1.2.6 + +## @backstage/plugin-stackstorm@0.1.6 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-tech-insights@0.3.16 + +### Patch Changes + +- 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-tech-insights-common@0.2.12 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-tech-insights-backend@0.5.17 + +### Patch Changes + +- cfc3ca6ce060: Changes needed to support MySQL +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-tech-insights-common@0.2.12 + - @backstage/types@1.1.1 + - @backstage/plugin-tech-insights-node@0.4.9 + +## @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.35 + +### Patch Changes + +- 51b801f743b2: Handle extracting facts from 'not' conditions too +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-tech-insights-common@0.2.12 + - @backstage/plugin-tech-insights-node@0.4.9 + +## @backstage/plugin-tech-insights-common@0.2.12 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/types@1.1.1 + +## @backstage/plugin-tech-insights-node@0.4.9 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-tech-insights-common@0.2.12 + - @backstage/types@1.1.1 + +## @backstage/plugin-tech-radar@0.6.8 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- b45d0ac68191: Add names to blip entry links in the radar to improve accessibility +- 80b4d0b34f14: Fixed the width of the tech radar dialog so that the content fits +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 6d35e9ea2afa: Add description property for Rings which will be shown in the footer. +- 8cec7664e146: Removed `@types/node` dependency +- c357f62052af: Fixed `RadarTimeline` text formatting. +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-techdocs-addons-test-utils@1.0.21 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog@1.13.0 + - @backstage/plugin-techdocs@1.7.0 + - @backstage/core-components@0.13.5 + - @backstage/test-utils@1.4.3 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-search-react@1.7.0 + - @backstage/plugin-techdocs-react@1.1.10 + - @backstage/theme@0.4.2 + +## @backstage/plugin-techdocs-react@1.1.10 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @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/version-bridge@1.0.5 + +## @backstage/plugin-todo@0.2.26 + +### 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/theme@0.4.2 + +## @backstage/plugin-user-settings@0.7.9 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- ce77b23423cb: conditionally rendering the user email in user profile card +- e03f3ee2be94: changed auto theme tooltip title to camel case +- 8cec7664e146: Removed `@types/node` dependency +- 6e30769cc627: Introduced experimental support for internationalization. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-vault@0.1.18 + +### 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 +- 858a18800870: Added ability to override vault secret engine value on catalog entity level using annotation `vault.io/secrets-engine` +- 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/theme@0.4.2 + +## @backstage/plugin-vault-backend@0.3.7 + +### Patch Changes + +- 858a18800870: Added ability to override vault secret engine value on catalog entity level using annotation `vault.io/secrets-engine` +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + +## @backstage/plugin-xcmetrics@0.2.42 + +### 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 +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## example-app@0.2.87 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes@0.10.3 + - @backstage/plugin-playlist@0.1.16 + - @backstage/plugin-home@0.5.8 + - @backstage/cli@0.22.13 + - @backstage/plugin-catalog-unprocessed-entities@0.1.3 + - @backstage/integration-react@1.1.19 + - @backstage/plugin-microsoft-calendar@0.1.7 + - @backstage/plugin-newrelic-dashboard@0.2.17 + - @backstage/plugin-apache-airflow@0.2.15 + - @backstage/plugin-github-actions@0.6.5 + - @backstage/plugin-octopus-deploy@0.2.6 + - @backstage/plugin-azure-devops@0.3.6 + - @backstage/plugin-gcp-projects@0.3.41 + - @backstage/plugin-azure-sites@0.1.13 + - @backstage/plugin-cloudbuild@0.3.24 + - @backstage/plugin-lighthouse@0.4.9 + - @backstage/plugin-tech-radar@0.6.8 + - @backstage/plugin-dynatrace@7.0.4 + - @backstage/plugin-gcalendar@0.3.18 + - @backstage/plugin-shortcuts@0.3.14 + - @backstage/plugin-airbrake@0.3.24 + - @backstage/plugin-circleci@0.3.24 + - @backstage/plugin-graphiql@0.2.54 + - @backstage/plugin-linguist@0.1.9 + - @backstage/plugin-newrelic@0.3.40 + - @backstage/plugin-puppetdb@0.1.7 + - @backstage/plugin-jenkins@0.8.6 + - @backstage/plugin-rollbar@0.4.24 + - @backstage/plugin-badges@0.2.48 + - @backstage/plugin-sentry@0.5.9 + - @backstage/plugin-kafka@0.3.24 + - @backstage/plugin-nomad@0.1.5 + - @backstage/plugin-todo@0.2.26 + - @backstage/plugin-org@0.6.14 + - @backstage/frontend-app-api@0.1.0 + - @backstage/plugin-techdocs@1.7.0 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/plugin-entity-feedback@0.2.7 + - @backstage/plugin-pagerduty@0.6.5 + - @backstage/config@1.1.0 + - @backstage/app-defaults@1.4.3 + - @backstage/catalog-model@1.4.2 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-adr@0.6.7 + - @backstage/plugin-api-docs@0.9.11 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-graph@0.2.36 + - @backstage/plugin-catalog-import@0.10.0 + - @backstage/plugin-code-coverage@0.2.17 + - @backstage/plugin-cost-insights@0.12.13 + - @backstage/plugin-devtools@0.1.4 + - @backstage/plugin-explore@0.4.10 + - @backstage/plugin-gocd@0.1.30 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/plugin-scaffolder@1.15.0 + - @backstage/plugin-scaffolder-react@1.5.5 + - @backstage/plugin-search@1.4.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/plugin-stack-overflow@0.1.20 + - @backstage/plugin-stackstorm@0.1.6 + - @backstage/plugin-tech-insights@0.3.16 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.0 + - @backstage/plugin-techdocs-react@1.1.10 + - @backstage/plugin-user-settings@0.7.9 + - @backstage/theme@0.4.2 + - @internal/plugin-catalog-customized@0.0.14 + +## example-app-next@0.0.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes@0.10.3 + - @backstage/plugin-playlist@0.1.16 + - @backstage/plugin-home@0.5.8 + - @backstage/cli@0.22.13 + - @backstage/plugin-catalog-unprocessed-entities@0.1.3 + - @backstage/integration-react@1.1.19 + - @backstage/plugin-microsoft-calendar@0.1.7 + - @backstage/plugin-newrelic-dashboard@0.2.17 + - @backstage/plugin-apache-airflow@0.2.15 + - @backstage/plugin-github-actions@0.6.5 + - @backstage/plugin-octopus-deploy@0.2.6 + - @backstage/plugin-azure-devops@0.3.6 + - @backstage/plugin-gcp-projects@0.3.41 + - @backstage/plugin-azure-sites@0.1.13 + - @backstage/plugin-cloudbuild@0.3.24 + - @backstage/plugin-lighthouse@0.4.9 + - @backstage/plugin-tech-radar@0.6.8 + - @backstage/plugin-dynatrace@7.0.4 + - @backstage/plugin-gcalendar@0.3.18 + - @backstage/plugin-shortcuts@0.3.14 + - @backstage/plugin-airbrake@0.3.24 + - @backstage/plugin-circleci@0.3.24 + - @backstage/plugin-graphiql@0.2.54 + - @backstage/plugin-linguist@0.1.9 + - @backstage/plugin-newrelic@0.3.40 + - @backstage/plugin-puppetdb@0.1.7 + - @backstage/plugin-jenkins@0.8.6 + - @backstage/plugin-rollbar@0.4.24 + - @backstage/plugin-badges@0.2.48 + - @backstage/plugin-sentry@0.5.9 + - @backstage/plugin-kafka@0.3.24 + - @backstage/plugin-todo@0.2.26 + - @backstage/plugin-org@0.6.14 + - @backstage/frontend-plugin-api@0.1.0 + - @backstage/frontend-app-api@0.1.0 + - @backstage/plugin-techdocs@1.7.0 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/plugin-entity-feedback@0.2.7 + - @backstage/plugin-pagerduty@0.6.5 + - @backstage/config@1.1.0 + - @backstage/app-defaults@1.4.3 + - @backstage/catalog-model@1.4.2 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-adr@0.6.7 + - @backstage/plugin-api-docs@0.9.11 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-graph@0.2.36 + - @backstage/plugin-catalog-import@0.10.0 + - @backstage/plugin-code-coverage@0.2.17 + - @backstage/plugin-cost-insights@0.12.13 + - @backstage/plugin-devtools@0.1.4 + - @backstage/plugin-explore@0.4.10 + - @backstage/plugin-gocd@0.1.30 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/plugin-scaffolder@1.15.0 + - @backstage/plugin-scaffolder-react@1.5.5 + - @backstage/plugin-search@1.4.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/plugin-stack-overflow@0.1.20 + - @backstage/plugin-stackstorm@0.1.6 + - @backstage/plugin-tech-insights@0.3.16 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.0 + - @backstage/plugin-techdocs-react@1.1.10 + - @backstage/plugin-user-settings@0.7.9 + - @backstage/theme@0.4.2 + - app-next-example-plugin@0.0.1 + - @internal/plugin-catalog-customized@0.0.14 + +## app-next-example-plugin@0.0.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.1.0 + - @backstage/core-components@0.13.5 + +## example-backend@0.2.87 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-pg@0.5.12 + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/plugin-kubernetes-backend@0.12.0 + - @backstage/plugin-techdocs-backend@1.7.0 + - @backstage/plugin-auth-backend@0.19.0 + - @backstage/plugin-proxy-backend@0.4.0 + - @backstage/plugin-adr-backend@0.4.0 + - @backstage/plugin-azure-devops-backend@0.4.0 + - @backstage/plugin-badges-backend@0.3.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.0 + - @backstage/plugin-devtools-backend@0.2.0 + - @backstage/plugin-entity-feedback-backend@0.2.0 + - @backstage/plugin-kafka-backend@0.3.0 + - @backstage/plugin-lighthouse-backend@0.3.0 + - @backstage/plugin-linguist-backend@0.5.0 + - @backstage/plugin-todo-backend@0.3.0 + - @backstage/plugin-app-backend@0.3.51 + - @backstage/plugin-events-backend@0.2.12 + - @backstage/plugin-permission-backend@0.5.26 + - @backstage/plugin-scaffolder-backend@1.17.0 + - @backstage/plugin-search-backend@1.4.3 + - @backstage/plugin-search-backend-module-catalog@0.1.7 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.6 + - @backstage/plugin-search-backend-module-explore@0.1.7 + - @backstage/plugin-search-backend-module-techdocs@0.1.7 + - @backstage/plugin-code-coverage-backend@0.2.17 + - @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/integration@1.7.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.35 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.0 + - @backstage/plugin-tech-insights-backend@0.5.17 + - example-app@0.2.87 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-playlist-backend@0.3.7 + - @backstage/plugin-rollbar-backend@0.1.48 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.4 + - @backstage/plugin-azure-sites-backend@0.1.13 + - @backstage/plugin-events-node@0.2.12 + - @backstage/plugin-explore-backend@0.0.13 + - @backstage/plugin-graphql-backend@0.1.41 + - @backstage/plugin-jenkins-backend@0.2.6 + - @backstage/plugin-nomad-backend@0.1.5 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.20 + - @backstage/plugin-search-backend-node@1.2.7 + - @backstage/plugin-tech-insights-node@0.4.9 + +## example-backend-next@0.0.15 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/plugin-kubernetes-backend@0.12.0 + - @backstage/plugin-techdocs-backend@1.7.0 + - @backstage/plugin-proxy-backend@0.4.0 + - @backstage/plugin-adr-backend@0.4.0 + - @backstage/plugin-azure-devops-backend@0.4.0 + - @backstage/plugin-badges-backend@0.3.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.0 + - @backstage/plugin-devtools-backend@0.2.0 + - @backstage/plugin-entity-feedback-backend@0.2.0 + - @backstage/plugin-lighthouse-backend@0.3.0 + - @backstage/plugin-linguist-backend@0.5.0 + - @backstage/plugin-todo-backend@0.3.0 + - @backstage/plugin-app-backend@0.3.51 + - @backstage/plugin-permission-backend@0.5.26 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.0 + - @backstage/plugin-scaffolder-backend@1.17.0 + - @backstage/plugin-search-backend@1.4.3 + - @backstage/plugin-search-backend-module-catalog@0.1.7 + - @backstage/plugin-search-backend-module-explore@0.1.7 + - @backstage/plugin-search-backend-module-techdocs@0.1.7 + - @backstage/backend-tasks@0.5.8 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.0 + - @backstage/backend-defaults@0.2.3 + - @backstage/plugin-search-backend-node@1.2.7 + +## @backstage/backend-plugin-manager@0.0.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/plugin-events-backend@0.2.12 + - @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/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/cli-common@0.1.12 + - @backstage/cli-node@0.1.4 + - @backstage/plugin-events-node@0.2.12 + - @backstage/plugin-scaffolder-node@0.2.3 + - @backstage/plugin-search-backend-node@1.2.7 + +## e2e-test@0.2.7 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.5 + - @backstage/errors@1.2.2 + - @backstage/cli-common@0.1.12 + +## techdocs-cli-embedded-app@0.2.86 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.22.13 + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog@1.13.0 + - @backstage/plugin-techdocs@1.7.0 + - @backstage/core-components@0.13.5 + - @backstage/test-utils@1.4.3 + - @backstage/config@1.1.0 + - @backstage/app-defaults@1.4.3 + - @backstage/catalog-model@1.4.2 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-techdocs-react@1.1.10 + - @backstage/theme@0.4.2 + +## @internal/plugin-catalog-customized@0.0.14 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.13.0 + - @backstage/plugin-catalog-react@1.8.4 + +## @internal/plugin-todo-list@1.0.17 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @internal/plugin-todo-list-backend@1.0.17 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/backend-plugin-api@0.6.3 + +## @internal/plugin-todo-list-common@1.0.13 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.8 diff --git a/package.json b/package.json index fe1e7ebce5..b1b4f0f268 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "@types/react": "^17", "@types/react-dom": "^17" }, - "version": "1.18.0-next.3", + "version": "1.18.0", "dependencies": { "@backstage/errors": "workspace:^", "@manypkg/get-packages": "^1.1.3" diff --git a/packages/app-defaults/CHANGELOG.md b/packages/app-defaults/CHANGELOG.md index 45947300a9..84681ef715 100644 --- a/packages/app-defaults/CHANGELOG.md +++ b/packages/app-defaults/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/app-defaults +## 1.4.3 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/theme@0.4.2 + ## 1.4.3-next.3 ### Patch Changes diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json index 711f831bad..d18ade17a1 100644 --- a/packages/app-defaults/package.json +++ b/packages/app-defaults/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/app-defaults", "description": "Provides the default wiring of a Backstage App", - "version": "1.4.3-next.3", + "version": "1.4.3", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/app-next-example-plugin/CHANGELOG.md b/packages/app-next-example-plugin/CHANGELOG.md index 9b244b4dd3..e833efee8b 100644 --- a/packages/app-next-example-plugin/CHANGELOG.md +++ b/packages/app-next-example-plugin/CHANGELOG.md @@ -1,5 +1,13 @@ # app-next-example-plugin +## 0.0.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.1.0 + - @backstage/core-components@0.13.5 + ## 0.0.1-next.0 ### Patch Changes diff --git a/packages/app-next-example-plugin/package.json b/packages/app-next-example-plugin/package.json index 258b58fccd..5d86099d2a 100644 --- a/packages/app-next-example-plugin/package.json +++ b/packages/app-next-example-plugin/package.json @@ -1,7 +1,7 @@ { "name": "app-next-example-plugin", "description": "Backstage internal example plugin", - "version": "0.0.1-next.0", + "version": "0.0.1", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/app-next/CHANGELOG.md b/packages/app-next/CHANGELOG.md index ebd4891200..f6e8142480 100644 --- a/packages/app-next/CHANGELOG.md +++ b/packages/app-next/CHANGELOG.md @@ -1,5 +1,82 @@ # example-app-next +## 0.0.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes@0.10.3 + - @backstage/plugin-playlist@0.1.16 + - @backstage/plugin-home@0.5.8 + - @backstage/cli@0.22.13 + - @backstage/plugin-catalog-unprocessed-entities@0.1.3 + - @backstage/integration-react@1.1.19 + - @backstage/plugin-microsoft-calendar@0.1.7 + - @backstage/plugin-newrelic-dashboard@0.2.17 + - @backstage/plugin-apache-airflow@0.2.15 + - @backstage/plugin-github-actions@0.6.5 + - @backstage/plugin-octopus-deploy@0.2.6 + - @backstage/plugin-azure-devops@0.3.6 + - @backstage/plugin-gcp-projects@0.3.41 + - @backstage/plugin-azure-sites@0.1.13 + - @backstage/plugin-cloudbuild@0.3.24 + - @backstage/plugin-lighthouse@0.4.9 + - @backstage/plugin-tech-radar@0.6.8 + - @backstage/plugin-dynatrace@7.0.4 + - @backstage/plugin-gcalendar@0.3.18 + - @backstage/plugin-shortcuts@0.3.14 + - @backstage/plugin-airbrake@0.3.24 + - @backstage/plugin-circleci@0.3.24 + - @backstage/plugin-graphiql@0.2.54 + - @backstage/plugin-linguist@0.1.9 + - @backstage/plugin-newrelic@0.3.40 + - @backstage/plugin-puppetdb@0.1.7 + - @backstage/plugin-jenkins@0.8.6 + - @backstage/plugin-rollbar@0.4.24 + - @backstage/plugin-badges@0.2.48 + - @backstage/plugin-sentry@0.5.9 + - @backstage/plugin-kafka@0.3.24 + - @backstage/plugin-todo@0.2.26 + - @backstage/plugin-org@0.6.14 + - @backstage/frontend-plugin-api@0.1.0 + - @backstage/frontend-app-api@0.1.0 + - @backstage/plugin-techdocs@1.7.0 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/plugin-entity-feedback@0.2.7 + - @backstage/plugin-pagerduty@0.6.5 + - @backstage/config@1.1.0 + - @backstage/app-defaults@1.4.3 + - @backstage/catalog-model@1.4.2 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-adr@0.6.7 + - @backstage/plugin-api-docs@0.9.11 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-graph@0.2.36 + - @backstage/plugin-catalog-import@0.10.0 + - @backstage/plugin-code-coverage@0.2.17 + - @backstage/plugin-cost-insights@0.12.13 + - @backstage/plugin-devtools@0.1.4 + - @backstage/plugin-explore@0.4.10 + - @backstage/plugin-gocd@0.1.30 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/plugin-scaffolder@1.15.0 + - @backstage/plugin-scaffolder-react@1.5.5 + - @backstage/plugin-search@1.4.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/plugin-stack-overflow@0.1.20 + - @backstage/plugin-stackstorm@0.1.6 + - @backstage/plugin-tech-insights@0.3.16 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.0 + - @backstage/plugin-techdocs-react@1.1.10 + - @backstage/plugin-user-settings@0.7.9 + - @backstage/theme@0.4.2 + - app-next-example-plugin@0.0.1 + - @internal/plugin-catalog-customized@0.0.14 + ## 0.0.1-next.2 ### Patch Changes diff --git a/packages/app-next/package.json b/packages/app-next/package.json index e9897fd348..e374f31dd9 100644 --- a/packages/app-next/package.json +++ b/packages/app-next/package.json @@ -1,6 +1,6 @@ { "name": "example-app-next", - "version": "0.0.1-next.2", + "version": "0.0.1", "private": true, "backstage": { "role": "frontend" diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index 28bda23989..9d232123db 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,81 @@ # example-app +## 0.2.87 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes@0.10.3 + - @backstage/plugin-playlist@0.1.16 + - @backstage/plugin-home@0.5.8 + - @backstage/cli@0.22.13 + - @backstage/plugin-catalog-unprocessed-entities@0.1.3 + - @backstage/integration-react@1.1.19 + - @backstage/plugin-microsoft-calendar@0.1.7 + - @backstage/plugin-newrelic-dashboard@0.2.17 + - @backstage/plugin-apache-airflow@0.2.15 + - @backstage/plugin-github-actions@0.6.5 + - @backstage/plugin-octopus-deploy@0.2.6 + - @backstage/plugin-azure-devops@0.3.6 + - @backstage/plugin-gcp-projects@0.3.41 + - @backstage/plugin-azure-sites@0.1.13 + - @backstage/plugin-cloudbuild@0.3.24 + - @backstage/plugin-lighthouse@0.4.9 + - @backstage/plugin-tech-radar@0.6.8 + - @backstage/plugin-dynatrace@7.0.4 + - @backstage/plugin-gcalendar@0.3.18 + - @backstage/plugin-shortcuts@0.3.14 + - @backstage/plugin-airbrake@0.3.24 + - @backstage/plugin-circleci@0.3.24 + - @backstage/plugin-graphiql@0.2.54 + - @backstage/plugin-linguist@0.1.9 + - @backstage/plugin-newrelic@0.3.40 + - @backstage/plugin-puppetdb@0.1.7 + - @backstage/plugin-jenkins@0.8.6 + - @backstage/plugin-rollbar@0.4.24 + - @backstage/plugin-badges@0.2.48 + - @backstage/plugin-sentry@0.5.9 + - @backstage/plugin-kafka@0.3.24 + - @backstage/plugin-nomad@0.1.5 + - @backstage/plugin-todo@0.2.26 + - @backstage/plugin-org@0.6.14 + - @backstage/frontend-app-api@0.1.0 + - @backstage/plugin-techdocs@1.7.0 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/plugin-entity-feedback@0.2.7 + - @backstage/plugin-pagerduty@0.6.5 + - @backstage/config@1.1.0 + - @backstage/app-defaults@1.4.3 + - @backstage/catalog-model@1.4.2 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-adr@0.6.7 + - @backstage/plugin-api-docs@0.9.11 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-graph@0.2.36 + - @backstage/plugin-catalog-import@0.10.0 + - @backstage/plugin-code-coverage@0.2.17 + - @backstage/plugin-cost-insights@0.12.13 + - @backstage/plugin-devtools@0.1.4 + - @backstage/plugin-explore@0.4.10 + - @backstage/plugin-gocd@0.1.30 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/plugin-scaffolder@1.15.0 + - @backstage/plugin-scaffolder-react@1.5.5 + - @backstage/plugin-search@1.4.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/plugin-stack-overflow@0.1.20 + - @backstage/plugin-stackstorm@0.1.6 + - @backstage/plugin-tech-insights@0.3.16 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.0 + - @backstage/plugin-techdocs-react@1.1.10 + - @backstage/plugin-user-settings@0.7.9 + - @backstage/theme@0.4.2 + - @internal/plugin-catalog-customized@0.0.14 + ## 0.2.87-next.3 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index a4fa62b216..290c4211ff 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "example-app", - "version": "0.2.87-next.3", + "version": "0.2.87", "private": true, "backstage": { "role": "frontend" diff --git a/packages/backend-app-api/CHANGELOG.md b/packages/backend-app-api/CHANGELOG.md index 390103ae91..3d7864d95c 100644 --- a/packages/backend-app-api/CHANGELOG.md +++ b/packages/backend-app-api/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/backend-app-api +## 0.5.3 + +### Patch Changes + +- 154632d8753b: Add support for discovering additional service factories during startup. +- 37a20c7f14aa: Adds include and exclude configuration to feature discovery of backend packages + Adds alpha modules to feature discovery +- cb7fc410ed99: The experimental backend feature discovery now only considers default exports from packages. It no longer filters packages to include based on the package role, except that `'cli'` packages are ignored. However, the `"backstage"` field is still required in `package.json`. +- 3fc64b9e2f8f: Extension points are now tracked via their ID rather than reference, in order to support package duplication. +- 3b30b179cb38: Add support for installing features as package imports, for example `backend.add(import('my-plugin'))`. +- b219d097b3f4: Backend startup will now fail if any circular service dependencies are detected. +- 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/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/config-loader@1.5.0 + - @backstage/cli-common@0.1.12 + - @backstage/cli-node@0.1.4 + ## 0.5.3-next.3 ### Patch Changes diff --git a/packages/backend-app-api/package.json b/packages/backend-app-api/package.json index 46d5e9e4f4..0881be4ca8 100644 --- a/packages/backend-app-api/package.json +++ b/packages/backend-app-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-app-api", "description": "Core API used by Backstage backend apps", - "version": "0.5.3-next.3", + "version": "0.5.3", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-common/CHANGELOG.md b/packages/backend-common/CHANGELOG.md index fb425e0c97..66b9600222 100644 --- a/packages/backend-common/CHANGELOG.md +++ b/packages/backend-common/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/backend-common +## 0.19.5 + +### Patch Changes + +- 6847cd6225d6: Avoid starting database keepalive loop in tests. +- fd3fdd0e3338: The root logger is now initialized lazily, fixing a circular dependency issue with `@backstage/backend-app-api` that would result in `Cannot read properties of undefined (reading 'redacter')`. +- 5f1a92b9f19f: Use `DefaultAzureDevOpsCredentialsProvider` to retrieve credentials for Azure DevOps. +- 19a140418cc8: Added retries for initial database creation, as well as set minimum connection pool size for the database creation client to 0 and lowered the connection acquisition timeout. +- 05508a9757d2: Minor internal refactor +- cfc3ca6ce060: Changes needed to support MySQL +- Updated dependencies + - @backstage/backend-app-api@0.5.3 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/config-loader@1.5.0 + - @backstage/backend-dev-utils@0.1.1 + - @backstage/cli-common@0.1.12 + - @backstage/integration-aws-node@0.1.6 + ## 0.19.5-next.3 ### Patch Changes diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index 3e7d0f0f4d..20476e04be 100644 --- a/packages/backend-common/package.json +++ b/packages/backend-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-common", "description": "Common functionality library for Backstage backends", - "version": "0.19.5-next.3", + "version": "0.19.5", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md index a09255c269..b70db2e92d 100644 --- a/packages/backend-defaults/CHANGELOG.md +++ b/packages/backend-defaults/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/backend-defaults +## 0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.5.3 + - @backstage/backend-common@0.19.5 + - @backstage/backend-plugin-api@0.6.3 + ## 0.2.3-next.3 ### Patch Changes diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index e4d62b311c..cff7d00bb9 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-defaults", "description": "Backend defaults used by Backstage backend apps", - "version": "0.2.3-next.3", + "version": "0.2.3", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-next/CHANGELOG.md b/packages/backend-next/CHANGELOG.md index 980569a9b6..ab19eee8d9 100644 --- a/packages/backend-next/CHANGELOG.md +++ b/packages/backend-next/CHANGELOG.md @@ -1,5 +1,40 @@ # example-backend-next +## 0.0.15 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/plugin-kubernetes-backend@0.12.0 + - @backstage/plugin-techdocs-backend@1.7.0 + - @backstage/plugin-proxy-backend@0.4.0 + - @backstage/plugin-adr-backend@0.4.0 + - @backstage/plugin-azure-devops-backend@0.4.0 + - @backstage/plugin-badges-backend@0.3.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.0 + - @backstage/plugin-devtools-backend@0.2.0 + - @backstage/plugin-entity-feedback-backend@0.2.0 + - @backstage/plugin-lighthouse-backend@0.3.0 + - @backstage/plugin-linguist-backend@0.5.0 + - @backstage/plugin-todo-backend@0.3.0 + - @backstage/plugin-app-backend@0.3.51 + - @backstage/plugin-permission-backend@0.5.26 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.0 + - @backstage/plugin-scaffolder-backend@1.17.0 + - @backstage/plugin-search-backend@1.4.3 + - @backstage/plugin-search-backend-module-catalog@0.1.7 + - @backstage/plugin-search-backend-module-explore@0.1.7 + - @backstage/plugin-search-backend-module-techdocs@0.1.7 + - @backstage/backend-tasks@0.5.8 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.0 + - @backstage/backend-defaults@0.2.3 + - @backstage/plugin-search-backend-node@1.2.7 + ## 0.0.15-next.3 ### Patch Changes diff --git a/packages/backend-next/package.json b/packages/backend-next/package.json index edda247a5a..de0a19228c 100644 --- a/packages/backend-next/package.json +++ b/packages/backend-next/package.json @@ -1,6 +1,6 @@ { "name": "example-backend-next", - "version": "0.0.15-next.3", + "version": "0.0.15", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/backend-openapi-utils/CHANGELOG.md b/packages/backend-openapi-utils/CHANGELOG.md index f94fc1e1e8..65c508997b 100644 --- a/packages/backend-openapi-utils/CHANGELOG.md +++ b/packages/backend-openapi-utils/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/backend-openapi-utils +## 0.0.4 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.2 + ## 0.0.4-next.0 ### Patch Changes diff --git a/packages/backend-openapi-utils/package.json b/packages/backend-openapi-utils/package.json index f6441e3864..8fa83bd584 100644 --- a/packages/backend-openapi-utils/package.json +++ b/packages/backend-openapi-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-openapi-utils", "description": "OpenAPI typescript support.", - "version": "0.0.4-next.0", + "version": "0.0.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/backend-plugin-api/CHANGELOG.md b/packages/backend-plugin-api/CHANGELOG.md index 49ddc69c33..5f78bb435d 100644 --- a/packages/backend-plugin-api/CHANGELOG.md +++ b/packages/backend-plugin-api/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/backend-plugin-api +## 0.6.3 + +### Patch Changes + +- ba4506076e2d: Ensure that root scoped services cannot accept (at a type level) plugin scoped deps +- 474b792d6a43: Service factory functions are now marked as feature factories that can be installed in the backend. +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/types@1.1.1 + ## 0.6.3-next.3 ### Patch Changes diff --git a/packages/backend-plugin-api/package.json b/packages/backend-plugin-api/package.json index 57b877e1c7..9ca71972e1 100644 --- a/packages/backend-plugin-api/package.json +++ b/packages/backend-plugin-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-plugin-api", "description": "Core API used by Backstage backend plugins", - "version": "0.6.3-next.3", + "version": "0.6.3", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-plugin-manager/CHANGELOG.md b/packages/backend-plugin-manager/CHANGELOG.md index 3218866414..71443041d2 100644 --- a/packages/backend-plugin-manager/CHANGELOG.md +++ b/packages/backend-plugin-manager/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/backend-plugin-manager +## 0.0.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/plugin-events-backend@0.2.12 + - @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/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/cli-common@0.1.12 + - @backstage/cli-node@0.1.4 + - @backstage/plugin-events-node@0.2.12 + - @backstage/plugin-scaffolder-node@0.2.3 + - @backstage/plugin-search-backend-node@1.2.7 + ## 0.0.1-next.1 ### Patch Changes diff --git a/packages/backend-plugin-manager/package.json b/packages/backend-plugin-manager/package.json index bba0793cce..e4d737a328 100644 --- a/packages/backend-plugin-manager/package.json +++ b/packages/backend-plugin-manager/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-plugin-manager", "description": "Backstage plugin management backend", - "version": "0.0.1-next.1", + "version": "0.0.1", "private": true, "main": "src/index.ts", "types": "src/index.ts", diff --git a/packages/backend-tasks/CHANGELOG.md b/packages/backend-tasks/CHANGELOG.md index cb995f8e05..efcfa0c702 100644 --- a/packages/backend-tasks/CHANGELOG.md +++ b/packages/backend-tasks/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/backend-tasks +## 0.5.8 + +### Patch Changes + +- 8fd91547cd0b: When starting a task that existed before, with a faster schedule than it + previously had, the task will now correctly obey the faster schedule + immediately. Before this fix, the new schedule was only obeyed after the next + pending (according to the old schedule) run had completed. +- 62f448edb0b5: Use `readDurationFromConfig` from the config package +- 74604806aae8: Avoid starting task janitor in tests. +- cfc3ca6ce060: Changes needed to support MySQL +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + ## 0.5.8-next.3 ### Patch Changes diff --git a/packages/backend-tasks/package.json b/packages/backend-tasks/package.json index 10d07dbb40..a8d52d0b00 100644 --- a/packages/backend-tasks/package.json +++ b/packages/backend-tasks/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-tasks", "description": "Common distributed task management library for Backstage backends", - "version": "0.5.8-next.3", + "version": "0.5.8", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md index d6cde7697b..a725f8037b 100644 --- a/packages/backend-test-utils/CHANGELOG.md +++ b/packages/backend-test-utils/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/backend-test-utils +## 0.2.3 + +### Patch Changes + +- 58cb5e5cea7b: Introduced a new utility for testing service factories, `ServiceFactoryTester`. +- 202e52c5e361: Add support for installing backend features via module imports, for example `startTestBackend({ features: [import('my-plugin')] })`. +- 9fb3b5373c45: Extended `mockService` to also include mocked variants, for example `mockServices.lifecycle.mock()`. The returned mocked implementation will have a `factory` property which is a service factory for itself. You can also pass a partial implementation of the service to the mock function to use a mock implementation of specific methods. +- eb1594da5812: Serialize test database shutdown, and add logging +- Updated dependencies + - @backstage/backend-app-api@0.5.3 + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + ## 0.2.3-next.3 ### Patch Changes diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index 1ee0522b01..8777439e64 100644 --- a/packages/backend-test-utils/package.json +++ b/packages/backend-test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-test-utils", "description": "Test helpers library for Backstage backends", - "version": "0.2.3-next.3", + "version": "0.2.3", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index c0bf093f05..880eb33270 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,64 @@ # example-backend +## 0.2.87 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-pg@0.5.12 + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/plugin-kubernetes-backend@0.12.0 + - @backstage/plugin-techdocs-backend@1.7.0 + - @backstage/plugin-auth-backend@0.19.0 + - @backstage/plugin-proxy-backend@0.4.0 + - @backstage/plugin-adr-backend@0.4.0 + - @backstage/plugin-azure-devops-backend@0.4.0 + - @backstage/plugin-badges-backend@0.3.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.0 + - @backstage/plugin-devtools-backend@0.2.0 + - @backstage/plugin-entity-feedback-backend@0.2.0 + - @backstage/plugin-kafka-backend@0.3.0 + - @backstage/plugin-lighthouse-backend@0.3.0 + - @backstage/plugin-linguist-backend@0.5.0 + - @backstage/plugin-todo-backend@0.3.0 + - @backstage/plugin-app-backend@0.3.51 + - @backstage/plugin-events-backend@0.2.12 + - @backstage/plugin-permission-backend@0.5.26 + - @backstage/plugin-scaffolder-backend@1.17.0 + - @backstage/plugin-search-backend@1.4.3 + - @backstage/plugin-search-backend-module-catalog@0.1.7 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.6 + - @backstage/plugin-search-backend-module-explore@0.1.7 + - @backstage/plugin-search-backend-module-techdocs@0.1.7 + - @backstage/plugin-code-coverage-backend@0.2.17 + - @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/integration@1.7.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.35 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.0 + - @backstage/plugin-tech-insights-backend@0.5.17 + - example-app@0.2.87 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-playlist-backend@0.3.7 + - @backstage/plugin-rollbar-backend@0.1.48 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.4 + - @backstage/plugin-azure-sites-backend@0.1.13 + - @backstage/plugin-events-node@0.2.12 + - @backstage/plugin-explore-backend@0.0.13 + - @backstage/plugin-graphql-backend@0.1.41 + - @backstage/plugin-jenkins-backend@0.2.6 + - @backstage/plugin-nomad-backend@0.1.5 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.20 + - @backstage/plugin-search-backend-node@1.2.7 + - @backstage/plugin-tech-insights-node@0.4.9 + ## 0.2.87-next.3 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index 7ff8845ed6..362f0d1201 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "example-backend", - "version": "0.2.87-next.3", + "version": "0.2.87", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/catalog-client/CHANGELOG.md b/packages/catalog-client/CHANGELOG.md index 14af941a8f..06231c6c7a 100644 --- a/packages/catalog-client/CHANGELOG.md +++ b/packages/catalog-client/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/catalog-client +## 1.4.4 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + ## 1.4.4-next.2 ### Patch Changes diff --git a/packages/catalog-client/package.json b/packages/catalog-client/package.json index e1604976ae..b7fcdb549e 100644 --- a/packages/catalog-client/package.json +++ b/packages/catalog-client/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/catalog-client", "description": "An isomorphic client for the catalog backend", - "version": "1.4.4-next.2", + "version": "1.4.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/catalog-model/CHANGELOG.md b/packages/catalog-model/CHANGELOG.md index 628d080280..3972ea9761 100644 --- a/packages/catalog-model/CHANGELOG.md +++ b/packages/catalog-model/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/catalog-model +## 1.4.2 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + ## 1.4.2-next.2 ### Patch Changes diff --git a/packages/catalog-model/package.json b/packages/catalog-model/package.json index bf37cc107f..cb6dbb6f31 100644 --- a/packages/catalog-model/package.json +++ b/packages/catalog-model/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/catalog-model", "description": "Types and validators that help describe the model of a Backstage Catalog", - "version": "1.4.2-next.2", + "version": "1.4.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/cli-node/CHANGELOG.md b/packages/cli-node/CHANGELOG.md index f008ec556f..153bf1a5af 100644 --- a/packages/cli-node/CHANGELOG.md +++ b/packages/cli-node/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/cli-node +## 0.1.4 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/cli-common@0.1.12 + ## 0.1.4-next.0 ### Patch Changes diff --git a/packages/cli-node/package.json b/packages/cli-node/package.json index 084123ff5c..95c69284eb 100644 --- a/packages/cli-node/package.json +++ b/packages/cli-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/cli-node", "description": "Node.js library for Backstage CLIs", - "version": "0.1.4-next.0", + "version": "0.1.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 0ad4278b2e..3e97228116 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/cli +## 0.22.13 + +### Patch Changes + +- 04eabd21bee4: Added the ability to specify the listen address for the `--inspect` and `--inspect-brk` command. You can now set the `ip` and port of the `inspect` and `inspectBrk` by adding for example `--inspect=0.0.0.0:9229` +- 278d9326eb40: Added the ability to create a plain backend module with the `new` command. +- 4d5eeec52d80: Add ESM loader for the experimental backend start command. +- 3494c502aba7: Added a new `repo fix` command that fixes auto-fixable problems in all packages. Initially the command fixes package export declarations, as well as marks all non-bundled frontend packages as side-effect free. Marking packages as free of side-effects can drastically reduce the Webpack bundle size. +- f36113ca2305: Add experimental support for frontend package discovery. +- a23fce763c6a: Fixed a bug where package exports entry points could not be `.tsx` files. +- 8cec7664e146: Removed `@types/node` dependency +- ea779492ad88: Updated dependency `run-script-webpack-plugin` to `^0.2.0`. +- 4af4defcc114: When running `version:bump` it will now log duplicates instead of throwing an error +- 71d4368ae5cc: Added support for the `dev/index` entry point for backend plugins and modules. +- 956d226eeeee: Add `"sideEffects": false` to `package.json` in frontend package templates. This can be added to existing packages using the new `yarn fix` command. +- cd7331587eb3: Removed the experimental `package fix` command that was used to automatically add dependencies to `package.json`, but has since been replaced by the `no-undeclared-imports` rule from `@backstage/eslint-plugin`. +- 219b46ae1a50: Include default alpha export during package detection +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/release-manifests@0.0.10 + - @backstage/types@1.1.1 + - @backstage/config-loader@1.5.0 + - @backstage/cli-common@0.1.12 + - @backstage/cli-node@0.1.4 + - @backstage/eslint-plugin@0.1.3 + ## 0.22.13-next.3 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 6229432f91..0b641275f9 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/cli", "description": "CLI for developing Backstage plugins and apps", - "version": "0.22.13-next.3", + "version": "0.22.13", "publishConfig": { "access": "public" }, diff --git a/packages/config-loader/CHANGELOG.md b/packages/config-loader/CHANGELOG.md index e8cca42db4..625ee8c36e 100644 --- a/packages/config-loader/CHANGELOG.md +++ b/packages/config-loader/CHANGELOG.md @@ -1,5 +1,40 @@ # @backstage/config-loader +## 1.5.0 + +### Minor Changes + +- 9606ba0939e6: Deep visibility now also applies to values that are not covered by the configuration schema. + + For example, given the following configuration schema: + + ```ts + // plugins/a/config.schema.ts + export interface Config { + /** @deepVisibility frontend */ + a?: unknown; + } + + // plugins/a/config.schema.ts + export interface Config { + a?: { + b?: string; + }; + } + ``` + + All values under `a` are now visible to the frontend, while previously only `a` and `a/b` would've been visible. + +### Patch Changes + +- 8cec7664e146: Removed `@types/node` dependency +- f9657b891b00: Do not unnecessarily notify subscribers when no-op updates to config happen +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/cli-common@0.1.12 + ## 1.5.0-next.3 ### Patch Changes diff --git a/packages/config-loader/package.json b/packages/config-loader/package.json index 466dc42cd6..46c017217d 100644 --- a/packages/config-loader/package.json +++ b/packages/config-loader/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/config-loader", "description": "Config loading functionality used by Backstage backend, and CLI", - "version": "1.5.0-next.3", + "version": "1.5.0", "publishConfig": { "access": "public", "main": "dist/index.cjs.js", diff --git a/packages/config/CHANGELOG.md b/packages/config/CHANGELOG.md index 0cdf238ba5..a5dfb07366 100644 --- a/packages/config/CHANGELOG.md +++ b/packages/config/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/config +## 1.1.0 + +### Minor Changes + +- 62f448edb0b5: Added a `readDurationFromConfig` function + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + ## 1.1.0-next.2 ### Patch Changes diff --git a/packages/config/package.json b/packages/config/package.json index d772bf9663..d917df849b 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/config", "description": "Config API used by Backstage core, backend, and CLI", - "version": "1.1.0-next.2", + "version": "1.1.0", "publishConfig": { "access": "public", "main": "dist/index.cjs.js", diff --git a/packages/core-app-api/CHANGELOG.md b/packages/core-app-api/CHANGELOG.md index 7bb4134710..48241f0d22 100644 --- a/packages/core-app-api/CHANGELOG.md +++ b/packages/core-app-api/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/core-app-api +## 1.10.0 + +### Minor Changes + +- 18619f793c94: Fixed two bugs in how the `OAuth2Session` type represents the underlying data. The `expiresAt` and `backstageIdentity` are now both optional, since that's what they are in practice. This is not considered a breaking change since it was effectively a bug in the modelling of the state that this type represents, and the type was not used in any other external contract. +- 18619f793c94: The `OAuth` class which is used by all OAuth providers will now consider both the session expiration of both the Backstage identity as well as the upstream identity provider, and refresh the session with either of them is about to expire. +- 6e30769cc627: Introduced experimental support for internationalization. + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 9fe827b380e1: Internal refactor +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + ## 1.10.0-next.3 ### Patch Changes diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json index 99210bc361..5a687708e6 100644 --- a/packages/core-app-api/package.json +++ b/packages/core-app-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/core-app-api", "description": "Core app API used by Backstage apps", - "version": "1.10.0-next.3", + "version": "1.10.0", "publishConfig": { "access": "public" }, diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md index b3a475f357..28d1b95677 100644 --- a/packages/core-components/CHANGELOG.md +++ b/packages/core-components/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/core-components +## 0.13.5 + +### Patch Changes + +- 0c9907645aab: Fixed an issue causing `StructuredMetadataTable` to crash in case metadata contained `null` values. +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 9b74166d11a1: Added `` component which introduces an optional automatic logout mechanism on user inactivity +- 117027636b10: Minor internal tweak to handle `classnames` update +- 8cec7664e146: Removed `@types/node` dependency +- db92d1244897: Updated dependency `rc-progress` to `3.5.1`. +- 47782f4bfa5b: Add loading indicator to Table +- 3d63e60f3c36: Internal restructure to avoid circular imports +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/version-bridge@1.0.5 + ## 0.13.5-next.3 ### Patch Changes diff --git a/packages/core-components/package.json b/packages/core-components/package.json index 36c7296fdf..d8cc5057ff 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/core-components", "description": "Core components used by Backstage plugins and apps", - "version": "0.13.5-next.3", + "version": "0.13.5", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/core-plugin-api/CHANGELOG.md b/packages/core-plugin-api/CHANGELOG.md index 306974dc8a..0c9728434b 100644 --- a/packages/core-plugin-api/CHANGELOG.md +++ b/packages/core-plugin-api/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/core-plugin-api +## 1.6.0 + +### Minor Changes + +- 18619f793c94: Added the optional `expiresAt` field that may now be part of a `BackstageIdentityResponse`. +- 6e30769cc627: Introduced experimental support for internationalization. + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + ## 1.6.0-next.3 ### Patch Changes diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json index 53e993f0cf..34e2491ed5 100644 --- a/packages/core-plugin-api/package.json +++ b/packages/core-plugin-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/core-plugin-api", "description": "Core API used by Backstage plugins", - "version": "1.6.0-next.3", + "version": "1.6.0", "publishConfig": { "access": "public" }, diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index 81656967a9..6b7276679c 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,39 @@ # @backstage/create-app +## 0.5.5 + +### Patch Changes + +- 05508a9757d2: Updated the backend template to no longer create duplicate connection pools to plugins that use the task scheduler. + + To apply this change in your own repository, perform the following small update: + + ```diff + // in packages/backend/src/index.ts + - const taskScheduler = TaskScheduler.fromConfig(config); + + const taskScheduler = TaskScheduler.fromConfig(config, { databaseManager }); + ``` + +- a4c08241ad92: Switched the template to use TypeScript 5.2 by default. +- f8c8e8de37b6: Bumped create-app version. +- fc1a38bc5723: Bumped create-app version. +- 4606e005df5d: Added a `fix` scripts that calls the new `backstage-cli repo fix` command. + + To apply this change to an existing app, make the following change to your root `package.json`: + + ```diff + "test": "backstage-cli repo test", + "test:all": "backstage-cli repo test --coverage", + + "fix": "backstage-cli repo fix", + "lint": "backstage-cli repo lint --since origin/master", + ``` + +- 612594022245: Add a notification when `yarn install` is taking a long time. +- 8db70ecbb325: Updated Dockerfile to include `apt-get update` when installing the SQLite dependency +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/cli-common@0.1.12 + ## 0.5.5-next.3 ### Patch Changes diff --git a/packages/create-app/package.json b/packages/create-app/package.json index ce19ed6362..b562233452 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/create-app", "description": "A CLI that helps you create your own Backstage app", - "version": "0.5.5-next.3", + "version": "0.5.5", "publishConfig": { "access": "public" }, diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md index 1b9d30478c..434ede5d73 100644 --- a/packages/dev-utils/CHANGELOG.md +++ b/packages/dev-utils/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/dev-utils +## 1.0.21 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/test-utils@1.4.3 + - @backstage/app-defaults@1.4.3 + - @backstage/catalog-model@1.4.2 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 1.0.21-next.3 ### Patch Changes diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index ba417c02e1..0bf405772f 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/dev-utils", "description": "Utilities for developing Backstage plugins.", - "version": "1.0.21-next.3", + "version": "1.0.21", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/e2e-test/CHANGELOG.md b/packages/e2e-test/CHANGELOG.md index c061c8707f..cee3b7cc56 100644 --- a/packages/e2e-test/CHANGELOG.md +++ b/packages/e2e-test/CHANGELOG.md @@ -1,5 +1,14 @@ # e2e-test +## 0.2.7 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.5 + - @backstage/errors@1.2.2 + - @backstage/cli-common@0.1.12 + ## 0.2.7-next.3 ### Patch Changes diff --git a/packages/e2e-test/package.json b/packages/e2e-test/package.json index 3824804a4f..5e722777e5 100644 --- a/packages/e2e-test/package.json +++ b/packages/e2e-test/package.json @@ -1,7 +1,7 @@ { "name": "e2e-test", "description": "E2E test for verifying Backstage packages", - "version": "0.2.7-next.3", + "version": "0.2.7", "private": true, "backstage": { "role": "cli" diff --git a/packages/errors/CHANGELOG.md b/packages/errors/CHANGELOG.md index 901fe69c0c..689b3617fc 100644 --- a/packages/errors/CHANGELOG.md +++ b/packages/errors/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/errors +## 1.2.2 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/types@1.1.1 + ## 1.2.2-next.0 ### Patch Changes diff --git a/packages/errors/package.json b/packages/errors/package.json index 68e030aed8..8d274be401 100644 --- a/packages/errors/package.json +++ b/packages/errors/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/errors", "description": "Common utilities for error handling within Backstage", - "version": "1.2.2-next.0", + "version": "1.2.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/frontend-app-api/CHANGELOG.md b/packages/frontend-app-api/CHANGELOG.md index 5c669f4d3d..f944dd1e27 100644 --- a/packages/frontend-app-api/CHANGELOG.md +++ b/packages/frontend-app-api/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/frontend-app-api +## 0.1.0 + +### Minor Changes + +- 628ca7e458e4: Initial release + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-graphiql@0.2.54 + - @backstage/frontend-plugin-api@0.1.0 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/types@1.1.1 + ## 0.1.0-next.0 ### Minor Changes diff --git a/packages/frontend-app-api/package.json b/packages/frontend-app-api/package.json index 9a4c8a44da..772dd62a36 100644 --- a/packages/frontend-app-api/package.json +++ b/packages/frontend-app-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-app-api", - "version": "0.1.0-next.0", + "version": "0.1.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/frontend-plugin-api/CHANGELOG.md b/packages/frontend-plugin-api/CHANGELOG.md index 25b4f98648..bf0531ab43 100644 --- a/packages/frontend-plugin-api/CHANGELOG.md +++ b/packages/frontend-plugin-api/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/frontend-plugin-api +## 0.1.0 + +### Minor Changes + +- 628ca7e458e4: Initial release + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.6.0 + - @backstage/types@1.1.1 + ## 0.1.0-next.0 ### Minor Changes diff --git a/packages/frontend-plugin-api/package.json b/packages/frontend-plugin-api/package.json index adc0907ab6..957c207617 100644 --- a/packages/frontend-plugin-api/package.json +++ b/packages/frontend-plugin-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-plugin-api", - "version": "0.1.0-next.0", + "version": "0.1.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/integration-aws-node/CHANGELOG.md b/packages/integration-aws-node/CHANGELOG.md index dc02aa5eb6..e62b3ff7fe 100644 --- a/packages/integration-aws-node/CHANGELOG.md +++ b/packages/integration-aws-node/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/integration-aws-node +## 0.1.6 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + ## 0.1.6-next.2 ### Patch Changes diff --git a/packages/integration-aws-node/package.json b/packages/integration-aws-node/package.json index 225d5fa679..cfe691b85c 100644 --- a/packages/integration-aws-node/package.json +++ b/packages/integration-aws-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/integration-aws-node", "description": "Helpers for fetching AWS account credentials", - "version": "0.1.6-next.2", + "version": "0.1.6", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md index 0f6b18f5ab..ff0502e498 100644 --- a/packages/integration-react/CHANGELOG.md +++ b/packages/integration-react/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/integration-react +## 1.1.19 + +### 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/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/integration@1.7.0 + - @backstage/theme@0.4.2 + ## 1.1.19-next.3 ### Patch Changes diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index 253a775721..d08d3e0d4a 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/integration-react", "description": "Frontend package for managing integrations towards external systems", - "version": "1.1.19-next.3", + "version": "1.1.19", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/integration/CHANGELOG.md b/packages/integration/CHANGELOG.md index b13e96db9f..eabcfd9d4b 100644 --- a/packages/integration/CHANGELOG.md +++ b/packages/integration/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/integration +## 1.7.0 + +### Minor Changes + +- 5f1a92b9f19f: Added `AzureDevOpsCredentialsProvider` to support multiple Azure DevOps organizations and **deprecated** `AzureIntegrationConfig.credential` and `AzureIntegrationConfig.token` in favour of `AzureIntegrationConfig.credentials`. You can now use specific credentials for different Azure DevOps (Server) organizations by specifying the `organizations` field on a credential: + + ```yaml + integrations: + azure: + - host: dev.azure.com + credentials: + - organizations: + - my-org + - my-other-org + clientId: ${AZURE_CLIENT_ID} + clientSecret: ${AZURE_CLIENT_SECRET} + tenantId: ${AZURE_TENANT_ID} + - organizations: + - yet-another-org + personalAccessToken: ${PERSONAL_ACCESS_TOKEN} + ``` + + See the [Azure integration documentation](https://backstage.io/docs/integrations/azure/locations) for more information. + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 2d2fc9d20ebb: Additional fix for Gitiles auth links +- cb2e19d82d95: Gitiles: Fixed auth prefix issue +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + ## 1.7.0-next.3 ### Patch Changes diff --git a/packages/integration/package.json b/packages/integration/package.json index d522b0f803..83b137d347 100644 --- a/packages/integration/package.json +++ b/packages/integration/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/integration", "description": "Helpers for managing integrations towards external systems", - "version": "1.7.0-next.3", + "version": "1.7.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/release-manifests/CHANGELOG.md b/packages/release-manifests/CHANGELOG.md index df166cf1fc..001c7b2055 100644 --- a/packages/release-manifests/CHANGELOG.md +++ b/packages/release-manifests/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/release-manifests +## 0.0.10 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency + ## 0.0.10-next.1 ### Patch Changes diff --git a/packages/release-manifests/package.json b/packages/release-manifests/package.json index 4c95e92c27..24003eeaa4 100644 --- a/packages/release-manifests/package.json +++ b/packages/release-manifests/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/release-manifests", "description": "Helper library for receiving release manifests", - "version": "0.0.10-next.1", + "version": "0.0.10", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/repo-tools/CHANGELOG.md b/packages/repo-tools/CHANGELOG.md index 076e963437..0b03d4808e 100644 --- a/packages/repo-tools/CHANGELOG.md +++ b/packages/repo-tools/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/repo-tools +## 0.3.4 + +### Patch Changes + +- 0109d3f11159: The `generate-catalog-info` command now uses the first listed `CODEOWNER` as Component owner when initially + creating the `catalog-info.yaml` file. It continues to allow any one listed `CODEOWNER` when updating + entity metadata. +- 6f874cdb04eb: Fixed a bug with the `generate-catalog-info` command that could cause `metadata.description` values to be overwritten by `package.json` description values only because unrelated attributes were being changed. +- ec13d3e86028: Fixed a bug with the `generate-catalog-info` command that could cause the `--dry-run` flag to indicate changes to files when no changes would actually be made if the command were run without the flag. +- db60a16e0a54: Added a `--ci` flag to the `generate-catalog-info` command. This flag behaves similarly to the same flag on `api-reports`: if `catalog-info.yaml` files would have been added or modified, then the process exits with status code `1`, and instructions are printed. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/cli-common@0.1.12 + - @backstage/cli-node@0.1.4 + ## 0.3.4-next.3 ### Patch Changes diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json index 3b38ad01b1..eca544e397 100644 --- a/packages/repo-tools/package.json +++ b/packages/repo-tools/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/repo-tools", "description": "CLI for Backstage repo tooling ", - "version": "0.3.4-next.3", + "version": "0.3.4", "publishConfig": { "access": "public" }, diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md index ba99062427..ec60ebb2fd 100644 --- a/packages/techdocs-cli-embedded-app/CHANGELOG.md +++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md @@ -1,5 +1,24 @@ # techdocs-cli-embedded-app +## 0.2.86 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.22.13 + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog@1.13.0 + - @backstage/plugin-techdocs@1.7.0 + - @backstage/core-components@0.13.5 + - @backstage/test-utils@1.4.3 + - @backstage/config@1.1.0 + - @backstage/app-defaults@1.4.3 + - @backstage/catalog-model@1.4.2 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-techdocs-react@1.1.10 + - @backstage/theme@0.4.2 + ## 0.2.86-next.3 ### Patch Changes diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index 6237ac658f..4d49be6016 100644 --- a/packages/techdocs-cli-embedded-app/package.json +++ b/packages/techdocs-cli-embedded-app/package.json @@ -1,6 +1,6 @@ { "name": "techdocs-cli-embedded-app", - "version": "0.2.86-next.3", + "version": "0.2.86", "private": true, "backstage": { "role": "frontend" diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md index 889855e2c1..b0d620a056 100644 --- a/packages/techdocs-cli/CHANGELOG.md +++ b/packages/techdocs-cli/CHANGELOG.md @@ -1,5 +1,20 @@ # @techdocs/cli +## 1.5.0 + +### Minor Changes + +- 10a86bd4ae12: Add optional config and cli option for techdocs to specify default mkdocs plugins. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-techdocs-node@1.8.0 + - @backstage/cli-common@0.1.12 + ## 1.5.0-next.3 ### Patch Changes diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index 70bb000257..9fb5c8d0d5 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -1,7 +1,7 @@ { "name": "@techdocs/cli", "description": "Utility CLI for managing TechDocs sites in Backstage.", - "version": "1.5.0-next.3", + "version": "1.5.0", "publishConfig": { "access": "public" }, diff --git a/packages/test-utils/CHANGELOG.md b/packages/test-utils/CHANGELOG.md index 2d5abefcc2..b44f54e2ab 100644 --- a/packages/test-utils/CHANGELOG.md +++ b/packages/test-utils/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/test-utils +## 1.4.3 + +### Patch Changes + +- 7032c214f3b4: Add pod exec terminal to Container Card +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- b5fbddc15dca: Add a new `MockTranslationApi` as an `/alpha` export. +- 9ceb6195275a: Add support for React Testing Library 13+, and thus React 18. + + We're exposing an additional option to the `render*` methods to enable the [`legacyRoot`](https://testing-library.com/docs/react-testing-library/api/#legacyroot) flow. + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + ## 1.4.3-next.3 ### Patch Changes diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 294c22edc5..875f67ffbb 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/test-utils", "description": "Utilities to test Backstage plugins and apps.", - "version": "1.4.3-next.3", + "version": "1.4.3", "publishConfig": { "access": "public" }, diff --git a/packages/theme/CHANGELOG.md b/packages/theme/CHANGELOG.md index 695d5fb8fa..445bc6055a 100644 --- a/packages/theme/CHANGELOG.md +++ b/packages/theme/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/theme +## 0.4.2 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + ## 0.4.2-next.0 ### Patch Changes diff --git a/packages/theme/package.json b/packages/theme/package.json index abcc6a2b32..98be3baddd 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/theme", "description": "material-ui theme for use with Backstage.", - "version": "0.4.2-next.0", + "version": "0.4.2", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index 42fa968b3c..c8b9243adb 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/types +## 1.1.1 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + ## 1.1.1-next.0 ### Patch Changes diff --git a/packages/types/package.json b/packages/types/package.json index 4c2574f920..f1f634af3e 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/types", "description": "Common TypeScript types used within Backstage", - "version": "1.1.1-next.0", + "version": "1.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/version-bridge/CHANGELOG.md b/packages/version-bridge/CHANGELOG.md index 58b278c3d1..bd7136e3ed 100644 --- a/packages/version-bridge/CHANGELOG.md +++ b/packages/version-bridge/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/version-bridge +## 1.0.5 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + ## 1.0.5-next.0 ### Patch Changes diff --git a/packages/version-bridge/package.json b/packages/version-bridge/package.json index d0b5c33a7e..f14b263747 100644 --- a/packages/version-bridge/package.json +++ b/packages/version-bridge/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/version-bridge", "description": "Utilities used by @backstage packages to support multiple concurrent versions", - "version": "1.0.5-next.0", + "version": "1.0.5", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/plugins/adr-backend/CHANGELOG.md b/plugins/adr-backend/CHANGELOG.md index 6c50f1a51d..288acd07d6 100644 --- a/plugins/adr-backend/CHANGELOG.md +++ b/plugins/adr-backend/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/plugin-adr-backend +## 0.4.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 + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-adr-common@0.2.15 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + ## 0.4.0-next.3 ### Minor Changes diff --git a/plugins/adr-backend/package.json b/plugins/adr-backend/package.json index ed17cd3310..8b81223a56 100644 --- a/plugins/adr-backend/package.json +++ b/plugins/adr-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-adr-backend", - "version": "0.4.0-next.3", + "version": "0.4.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/adr-common/CHANGELOG.md b/plugins/adr-common/CHANGELOG.md index 6fb6984988..73d9660fe2 100644 --- a/plugins/adr-common/CHANGELOG.md +++ b/plugins/adr-common/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-adr-common +## 0.2.15 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-search-common@1.2.6 + ## 0.2.15-next.3 ### Patch Changes diff --git a/plugins/adr-common/package.json b/plugins/adr-common/package.json index 6df2fd8242..68cd5e6234 100644 --- a/plugins/adr-common/package.json +++ b/plugins/adr-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-adr-common", "description": "Common functionalities for the adr plugin", - "version": "0.2.15-next.3", + "version": "0.2.15", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/adr/CHANGELOG.md b/plugins/adr/CHANGELOG.md index 429632133c..e433fd174b 100644 --- a/plugins/adr/CHANGELOG.md +++ b/plugins/adr/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-adr +## 0.6.7 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- aa844e704a32: support for i18n feature +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @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/plugin-adr-common@0.2.15 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/theme@0.4.2 + ## 0.6.7-next.3 ### Patch Changes diff --git a/plugins/adr/package.json b/plugins/adr/package.json index ff61f8dd2d..5a8eabe337 100644 --- a/plugins/adr/package.json +++ b/plugins/adr/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-adr", - "version": "0.6.7-next.3", + "version": "0.6.7", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/airbrake-backend/CHANGELOG.md b/plugins/airbrake-backend/CHANGELOG.md index 15bfb467a3..d4e68fdf50 100644 --- a/plugins/airbrake-backend/CHANGELOG.md +++ b/plugins/airbrake-backend/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-airbrake-backend +## 0.3.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 + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + ## 0.3.0-next.3 ### Minor Changes diff --git a/plugins/airbrake-backend/package.json b/plugins/airbrake-backend/package.json index c6a34f5b24..dbe7054705 100644 --- a/plugins/airbrake-backend/package.json +++ b/plugins/airbrake-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-airbrake-backend", - "version": "0.3.0-next.3", + "version": "0.3.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/airbrake/CHANGELOG.md b/plugins/airbrake/CHANGELOG.md index de613ff54e..9cface3b85 100644 --- a/plugins/airbrake/CHANGELOG.md +++ b/plugins/airbrake/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-airbrake +## 0.3.24 + +### 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/test-utils@1.4.3 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/dev-utils@1.0.21 + - @backstage/theme@0.4.2 + ## 0.3.24-next.3 ### Patch Changes diff --git a/plugins/airbrake/package.json b/plugins/airbrake/package.json index 93d2684219..f5a8f1debe 100644 --- a/plugins/airbrake/package.json +++ b/plugins/airbrake/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-airbrake", - "version": "0.3.24-next.3", + "version": "0.3.24", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/allure/CHANGELOG.md b/plugins/allure/CHANGELOG.md index 9500903b34..5b7971054a 100644 --- a/plugins/allure/CHANGELOG.md +++ b/plugins/allure/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-allure +## 0.1.40 + +### 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/theme@0.4.2 + ## 0.1.40-next.3 ### Patch Changes diff --git a/plugins/allure/package.json b/plugins/allure/package.json index fd210c85b2..104dbc4313 100644 --- a/plugins/allure/package.json +++ b/plugins/allure/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-allure", "description": "A Backstage plugin that integrates with Allure", - "version": "0.1.40-next.3", + "version": "0.1.40", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/analytics-module-ga/CHANGELOG.md b/plugins/analytics-module-ga/CHANGELOG.md index 3e62f31e51..6829162be7 100644 --- a/plugins/analytics-module-ga/CHANGELOG.md +++ b/plugins/analytics-module-ga/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-analytics-module-ga +## 0.1.33 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.1.33-next.3 ### Patch Changes diff --git a/plugins/analytics-module-ga/package.json b/plugins/analytics-module-ga/package.json index 05610f836a..66a07699d2 100644 --- a/plugins/analytics-module-ga/package.json +++ b/plugins/analytics-module-ga/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-analytics-module-ga", - "version": "0.1.33-next.3", + "version": "0.1.33", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/analytics-module-ga4/CHANGELOG.md b/plugins/analytics-module-ga4/CHANGELOG.md index 369c9c281b..34dafc1f97 100644 --- a/plugins/analytics-module-ga4/CHANGELOG.md +++ b/plugins/analytics-module-ga4/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-analytics-module-ga4 +## 0.1.4 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.1.4-next.3 ### Patch Changes diff --git a/plugins/analytics-module-ga4/package.json b/plugins/analytics-module-ga4/package.json index 107aa1f3b2..eb72c1ed30 100644 --- a/plugins/analytics-module-ga4/package.json +++ b/plugins/analytics-module-ga4/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-analytics-module-ga4", - "version": "0.1.4-next.3", + "version": "0.1.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/analytics-module-newrelic-browser/CHANGELOG.md b/plugins/analytics-module-newrelic-browser/CHANGELOG.md index 2988aad119..58c4c4c575 100644 --- a/plugins/analytics-module-newrelic-browser/CHANGELOG.md +++ b/plugins/analytics-module-newrelic-browser/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-analytics-module-newrelic-browser +## 0.0.2 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + ## 0.0.2-next.3 ### Patch Changes diff --git a/plugins/analytics-module-newrelic-browser/package.json b/plugins/analytics-module-newrelic-browser/package.json index c2e7a254ca..815dd3fbaf 100644 --- a/plugins/analytics-module-newrelic-browser/package.json +++ b/plugins/analytics-module-newrelic-browser/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-analytics-module-newrelic-browser", - "version": "0.0.2-next.3", + "version": "0.0.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/apache-airflow/CHANGELOG.md b/plugins/apache-airflow/CHANGELOG.md index e83103d5b5..fd787df404 100644 --- a/plugins/apache-airflow/CHANGELOG.md +++ b/plugins/apache-airflow/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-apache-airflow +## 0.2.15 + +### 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/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + ## 0.2.15-next.3 ### Patch Changes diff --git a/plugins/apache-airflow/package.json b/plugins/apache-airflow/package.json index aa29fe84c9..a076265402 100644 --- a/plugins/apache-airflow/package.json +++ b/plugins/apache-airflow/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-apache-airflow", - "version": "0.2.15-next.3", + "version": "0.2.15", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/api-docs-module-protoc-gen-doc/CHANGELOG.md b/plugins/api-docs-module-protoc-gen-doc/CHANGELOG.md index 84db7d0e7b..3786ca011a 100644 --- a/plugins/api-docs-module-protoc-gen-doc/CHANGELOG.md +++ b/plugins/api-docs-module-protoc-gen-doc/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-api-docs-module-protoc-gen-doc +## 0.1.3 + +### 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. + ## 0.1.3-next.1 ### Patch Changes diff --git a/plugins/api-docs-module-protoc-gen-doc/package.json b/plugins/api-docs-module-protoc-gen-doc/package.json index 2066f6a620..e0ad10f4f0 100644 --- a/plugins/api-docs-module-protoc-gen-doc/package.json +++ b/plugins/api-docs-module-protoc-gen-doc/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-api-docs-module-protoc-gen-doc", "description": "Additional functionalities for the api-docs plugin that renders the output of the protoc-gen-doc", - "version": "0.1.3-next.1", + "version": "0.1.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md index e2b7274fe9..628cee37bb 100644 --- a/plugins/api-docs/CHANGELOG.md +++ b/plugins/api-docs/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-api-docs +## 0.9.11 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog@1.13.0 + - @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/theme@0.4.2 + ## 0.9.11-next.3 ### Patch Changes diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index 280b3bde07..a045d903f5 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-api-docs", "description": "A Backstage plugin that helps represent API entities in the frontend", - "version": "0.9.11-next.3", + "version": "0.9.11", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/apollo-explorer/CHANGELOG.md b/plugins/apollo-explorer/CHANGELOG.md index b67c6c3aaf..9af673faae 100644 --- a/plugins/apollo-explorer/CHANGELOG.md +++ b/plugins/apollo-explorer/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-apollo-explorer +## 0.1.15 + +### 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/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.1.15-next.3 ### Patch Changes diff --git a/plugins/apollo-explorer/package.json b/plugins/apollo-explorer/package.json index bd98d9b44f..d474094ed1 100644 --- a/plugins/apollo-explorer/package.json +++ b/plugins/apollo-explorer/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-apollo-explorer", - "version": "0.1.15-next.3", + "version": "0.1.15", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/app-backend/CHANGELOG.md b/plugins/app-backend/CHANGELOG.md index ecc0331afc..86eb85a42b 100644 --- a/plugins/app-backend/CHANGELOG.md +++ b/plugins/app-backend/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-app-backend +## 0.3.51 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- cfc3ca6ce060: Changes needed to support MySQL +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/config-loader@1.5.0 + - @backstage/plugin-app-node@0.1.3 + ## 0.3.51-next.3 ### Patch Changes diff --git a/plugins/app-backend/package.json b/plugins/app-backend/package.json index 54e6449013..c308b40720 100644 --- a/plugins/app-backend/package.json +++ b/plugins/app-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-app-backend", "description": "A Backstage backend plugin that serves the Backstage frontend app", - "version": "0.3.51-next.3", + "version": "0.3.51", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/app-node/CHANGELOG.md b/plugins/app-node/CHANGELOG.md index 33222b239a..871c31f902 100644 --- a/plugins/app-node/CHANGELOG.md +++ b/plugins/app-node/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-app-node +## 0.1.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.3 + ## 0.1.3-next.3 ### Patch Changes diff --git a/plugins/app-node/package.json b/plugins/app-node/package.json index 18edd3828e..05d49416dc 100644 --- a/plugins/app-node/package.json +++ b/plugins/app-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-app-node", "description": "Node.js library for the app plugin", - "version": "0.1.3-next.3", + "version": "0.1.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md b/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md index 126e6e8fe5..bfdf090263 100644 --- a/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-auth-backend-module-gcp-iap-provider +## 0.1.0 + +### Minor Changes + +- 8513cd7d00e3: New module for `@backstage/plugin-auth-backend` that adds a GCP IAP auth provider. + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + ## 0.1.0-next.3 ### Patch Changes diff --git a/plugins/auth-backend-module-gcp-iap-provider/package.json b/plugins/auth-backend-module-gcp-iap-provider/package.json index 75d16cd6ed..6764224b28 100644 --- a/plugins/auth-backend-module-gcp-iap-provider/package.json +++ b/plugins/auth-backend-module-gcp-iap-provider/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend-module-gcp-iap-provider", "description": "A GCP IAP auth provider module for the Backstage auth backend", - "version": "0.1.0-next.3", + "version": "0.1.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend-module-github-provider/CHANGELOG.md b/plugins/auth-backend-module-github-provider/CHANGELOG.md index 09319b6cb0..b7c928b62e 100644 --- a/plugins/auth-backend-module-github-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-github-provider/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-auth-backend-module-github-provider +## 0.1.0 + +### Minor Changes + +- 23af27f5ce79: New module for `@backstage/plugin-auth-backend` that adds a GitHub auth provider. + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/backend-plugin-api@0.6.3 + ## 0.1.0-next.3 ### Patch Changes diff --git a/plugins/auth-backend-module-github-provider/package.json b/plugins/auth-backend-module-github-provider/package.json index 40010cf0be..0b86025503 100644 --- a/plugins/auth-backend-module-github-provider/package.json +++ b/plugins/auth-backend-module-github-provider/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend-module-github-provider", "description": "The github-provider backend module for the auth plugin.", - "version": "0.1.0-next.3", + "version": "0.1.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md b/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md index 67f96087ed..3867635a91 100644 --- a/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-auth-backend-module-gitlab-provider +## 0.1.0 + +### Minor Changes + +- 080cc7794700: New module for `@backstage/plugin-auth-backend` that adds a GitLab auth provider. + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/backend-plugin-api@0.6.3 + ## 0.1.0-next.2 ### Patch Changes diff --git a/plugins/auth-backend-module-gitlab-provider/package.json b/plugins/auth-backend-module-gitlab-provider/package.json index 52f61d5d9a..49ebb0dca0 100644 --- a/plugins/auth-backend-module-gitlab-provider/package.json +++ b/plugins/auth-backend-module-gitlab-provider/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend-module-gitlab-provider", "description": "The gitlab-provider backend module for the auth plugin.", - "version": "0.1.0-next.2", + "version": "0.1.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend-module-google-provider/CHANGELOG.md b/plugins/auth-backend-module-google-provider/CHANGELOG.md index 4ca6bb78b9..b0de32217e 100644 --- a/plugins/auth-backend-module-google-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-google-provider/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-auth-backend-module-google-provider +## 0.1.0 + +### Minor Changes + +- 8513cd7d00e3: New module for `@backstage/plugin-auth-backend` that adds a Google auth provider. + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.0 + - @backstage/backend-plugin-api@0.6.3 + ## 0.1.0-next.3 ### Patch Changes diff --git a/plugins/auth-backend-module-google-provider/package.json b/plugins/auth-backend-module-google-provider/package.json index a9829db7c0..ac69fa91ae 100644 --- a/plugins/auth-backend-module-google-provider/package.json +++ b/plugins/auth-backend-module-google-provider/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend-module-google-provider", "description": "A Google auth provider module for the Backstage auth backend", - "version": "0.1.0-next.3", + "version": "0.1.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md b/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md index 583693a705..20753caa5e 100644 --- a/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-auth-backend-module-oauth2-provider +## 0.1.0 + +### Minor Changes + +- 101cf1d13b04: New module for `@backstage/plugin-auth-backend` that adds a `oauth2` auth provider. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/backend-plugin-api@0.6.3 + ## 0.1.0-next.0 ### Minor Changes diff --git a/plugins/auth-backend-module-oauth2-provider/package.json b/plugins/auth-backend-module-oauth2-provider/package.json index 85ffd64130..34632c4073 100644 --- a/plugins/auth-backend-module-oauth2-provider/package.json +++ b/plugins/auth-backend-module-oauth2-provider/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend-module-oauth2-provider", "description": "The oauth2-provider backend module for the auth plugin.", - "version": "0.1.0-next.0", + "version": "0.1.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend/CHANGELOG.md b/plugins/auth-backend/CHANGELOG.md index df99eedf83..a82d928581 100644 --- a/plugins/auth-backend/CHANGELOG.md +++ b/plugins/auth-backend/CHANGELOG.md @@ -1,5 +1,48 @@ # @backstage/plugin-auth-backend +## 0.19.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 + +- 080cc7794700: Migrated the GitLab auth provider to be implemented using the new `@backstage/plugin-auth-backend-module-gitlab-provider` module. +- 7944d43f4790: Added `authPlugin` export for the new backend system. The plugin does not include any built-in auth providers, they must instead be added by installing additional modules, for example `authModuleGoogleProvider` from `@backstage/plugin-auth-backend-module-google-provider`. +- 8513cd7d00e3: Deprecated several exports that are now available from `@backstage/plugin-auth-node` instead. +- 7944d43f4790: Added the ability to disable the built-in auth providers by passing `disableDefaultProviderFactories` to `createRouter`. +- 7944d43f4790: The algorithm used when generating Backstage tokens can be configured via `auth.identityTokenAlgorithm`. +- Updated dependencies + - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.1.0 + - @backstage/plugin-auth-backend-module-github-provider@0.1.0 + - @backstage/plugin-auth-backend-module-gitlab-provider@0.1.0 + - @backstage/plugin-auth-backend-module-google-provider@0.1.0 + - @backstage/plugin-auth-backend-module-oauth2-provider@0.1.0 + - @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/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + ## 0.19.0-next.3 ### Minor Changes diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index 5007a5fbd6..98c5e0bd8a 100644 --- a/plugins/auth-backend/package.json +++ b/plugins/auth-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend", "description": "A Backstage backend plugin that handles authentication", - "version": "0.19.0-next.3", + "version": "0.19.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-node/CHANGELOG.md b/plugins/auth-node/CHANGELOG.md index 4051844378..ba010a155a 100644 --- a/plugins/auth-node/CHANGELOG.md +++ b/plugins/auth-node/CHANGELOG.md @@ -1,5 +1,46 @@ # @backstage/plugin-auth-node +## 0.3.0 + +### Minor Changes + +- 8513cd7d00e3: Introduced a new system for building auth providers for `@backstage/plugin-auth-backend`, which both increases the amount of code re-use across providers, and also works better with the new backend system. + + Many existing types have been moved from `@backstage/plugin-auth-backend` in order to avoid a direct dependency on the plugin from modules. + + Auth provider integrations are now primarily implemented through a pattern of creating "authenticators", which are in turn specific to each kind of integrations. Initially there are two types: `createOAuthAuthenticator` and `createProxyAuthenticator`. These come paired with functions that let you create the corresponding route handlers, `createOAuthRouteHandlers` and `createProxyAuthRouteHandlers`, as well as provider factories, `createOAuthProviderFactory` and `createProxyAuthProviderFactory`. This new authenticator pattern allows the sign-in logic to be separated from the auth integration logic, allowing it to be completely re-used across all providers of the same kind. + + The new provider factories also implement a new declarative way to configure sign-in resolvers, rather than configuration through code. Sign-in resolvers can now be configured through the `resolvers` configuration key, where the first resolver that provides an identity will be used, for example: + + ```yaml + auth: + providers: + google: + development: + clientId: ... + clientSecret: ... + signIn: + resolvers: + - resolver: emailMatchingUserEntityAnnotation + - resolver: emailLocalPartMatchingUserEntityName + ``` + + These configurable resolvers are created with a new `createSignInResolverFactory` function, which creates a sign-in resolver factory, optionally with an options schema that will be used both when configuring the sign-in resolver through configuration and code. + + The internal helpers from `@backstage/plugin-auth-backend` that were used to implement auth providers using passport strategies have now also been made available as public API, through `PassportHelpers` and `PassportOAuthAuthenticatorHelper`. + +### Patch Changes + +- 18619f793c94: The `BackstageIdentityResponse` interface now has an optional `expiresInSeconds` field that can be used to signal session expiration. The `prepareBackstageIdentityResponse` utility will now also read the expiration from the provided token, and include it in the response. +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @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/backend-plugin-api@0.6.3 + ## 0.3.0-next.3 ### Patch Changes diff --git a/plugins/auth-node/package.json b/plugins/auth-node/package.json index 42a3732bd1..11859a899d 100644 --- a/plugins/auth-node/package.json +++ b/plugins/auth-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-node", - "version": "0.3.0-next.3", + "version": "0.3.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-devops-backend/CHANGELOG.md b/plugins/azure-devops-backend/CHANGELOG.md index a10b0bd688..34fd461a3b 100644 --- a/plugins/azure-devops-backend/CHANGELOG.md +++ b/plugins/azure-devops-backend/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-azure-devops-backend +## 0.4.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 + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-azure-devops-common@0.3.1 + - @backstage/backend-plugin-api@0.6.3 + ## 0.4.0-next.3 ### Minor Changes diff --git a/plugins/azure-devops-backend/package.json b/plugins/azure-devops-backend/package.json index be959406eb..a377425b51 100644 --- a/plugins/azure-devops-backend/package.json +++ b/plugins/azure-devops-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-devops-backend", - "version": "0.4.0-next.3", + "version": "0.4.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-devops-common/CHANGELOG.md b/plugins/azure-devops-common/CHANGELOG.md index e117d80b34..e5637a9ff4 100644 --- a/plugins/azure-devops-common/CHANGELOG.md +++ b/plugins/azure-devops-common/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/plugin-azure-devops-common +## 0.3.1 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + ## 0.3.1-next.0 ### Patch Changes diff --git a/plugins/azure-devops-common/package.json b/plugins/azure-devops-common/package.json index 6d3e8f5edb..7648e39539 100644 --- a/plugins/azure-devops-common/package.json +++ b/plugins/azure-devops-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-devops-common", - "version": "0.3.1-next.0", + "version": "0.3.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-devops/CHANGELOG.md b/plugins/azure-devops/CHANGELOG.md index 1de0ee585d..2712586d93 100644 --- a/plugins/azure-devops/CHANGELOG.md +++ b/plugins/azure-devops/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-azure-devops +## 0.3.6 + +### 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-azure-devops-common@0.3.1 + - @backstage/theme@0.4.2 + ## 0.3.6-next.3 ### Patch Changes diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json index 1676aafab7..740ab7d1d7 100644 --- a/plugins/azure-devops/package.json +++ b/plugins/azure-devops/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-devops", - "version": "0.3.6-next.3", + "version": "0.3.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-sites-backend/CHANGELOG.md b/plugins/azure-sites-backend/CHANGELOG.md index 85d3c02c81..66c4b92c4a 100644 --- a/plugins/azure-sites-backend/CHANGELOG.md +++ b/plugins/azure-sites-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-azure-sites-backend +## 0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-azure-sites-common@0.1.1 + ## 0.1.13-next.3 ### Patch Changes diff --git a/plugins/azure-sites-backend/package.json b/plugins/azure-sites-backend/package.json index 8cce936c7a..f6e08af1f2 100644 --- a/plugins/azure-sites-backend/package.json +++ b/plugins/azure-sites-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-sites-backend", - "version": "0.1.13-next.3", + "version": "0.1.13", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-sites-common/CHANGELOG.md b/plugins/azure-sites-common/CHANGELOG.md index a61756b3c2..99dfef3e5b 100644 --- a/plugins/azure-sites-common/CHANGELOG.md +++ b/plugins/azure-sites-common/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/plugin-azure-sites-common +## 0.1.1 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + ## 0.1.1-next.0 ### Patch Changes diff --git a/plugins/azure-sites-common/package.json b/plugins/azure-sites-common/package.json index 4ee8be6dd1..05815edd02 100644 --- a/plugins/azure-sites-common/package.json +++ b/plugins/azure-sites-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-azure-sites-common", "description": "Common functionalities for the azure plugin", - "version": "0.1.1-next.0", + "version": "0.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-sites/CHANGELOG.md b/plugins/azure-sites/CHANGELOG.md index 3b477fb4ee..1d9fac99a5 100644 --- a/plugins/azure-sites/CHANGELOG.md +++ b/plugins/azure-sites/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-azure-sites +## 0.1.13 + +### 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/plugin-azure-sites-common@0.1.1 + - @backstage/theme@0.4.2 + ## 0.1.13-next.3 ### Patch Changes diff --git a/plugins/azure-sites/package.json b/plugins/azure-sites/package.json index 544045573a..a6147e6c02 100644 --- a/plugins/azure-sites/package.json +++ b/plugins/azure-sites/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-sites", - "version": "0.1.13-next.3", + "version": "0.1.13", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/badges-backend/CHANGELOG.md b/plugins/badges-backend/CHANGELOG.md index 9f2191eea1..e778ba0eef 100644 --- a/plugins/badges-backend/CHANGELOG.md +++ b/plugins/badges-backend/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-badges-backend +## 0.3.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 + +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @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/backend-plugin-api@0.6.3 + ## 0.3.0-next.3 ### Minor Changes diff --git a/plugins/badges-backend/package.json b/plugins/badges-backend/package.json index 8fa4211e0c..7b6f2a65b3 100644 --- a/plugins/badges-backend/package.json +++ b/plugins/badges-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-badges-backend", "description": "A Backstage backend plugin that generates README badges for your entities", - "version": "0.3.0-next.3", + "version": "0.3.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/badges/CHANGELOG.md b/plugins/badges/CHANGELOG.md index 59b0eb9458..f5bc8cc130 100644 --- a/plugins/badges/CHANGELOG.md +++ b/plugins/badges/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-badges +## 0.2.48 + +### 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/theme@0.4.2 + ## 0.2.48-next.3 ### Patch Changes diff --git a/plugins/badges/package.json b/plugins/badges/package.json index 82361daef1..8dc33ee346 100644 --- a/plugins/badges/package.json +++ b/plugins/badges/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-badges", "description": "A Backstage plugin that generates README badges for your entities", - "version": "0.2.48-next.3", + "version": "0.2.48", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bazaar-backend/CHANGELOG.md b/plugins/bazaar-backend/CHANGELOG.md index 37b3f7d46d..e9fdaf4005 100644 --- a/plugins/bazaar-backend/CHANGELOG.md +++ b/plugins/bazaar-backend/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-bazaar-backend +## 0.3.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 + +- cfc3ca6ce060: Changes needed to support MySQL +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/backend-plugin-api@0.6.3 + ## 0.3.0-next.3 ### Minor Changes diff --git a/plugins/bazaar-backend/package.json b/plugins/bazaar-backend/package.json index 603c723fb8..2a2b453c6e 100644 --- a/plugins/bazaar-backend/package.json +++ b/plugins/bazaar-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bazaar-backend", - "version": "0.3.0-next.3", + "version": "0.3.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bazaar/CHANGELOG.md b/plugins/bazaar/CHANGELOG.md index f140081951..77f24dd5da 100644 --- a/plugins/bazaar/CHANGELOG.md +++ b/plugins/bazaar/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-bazaar +## 0.2.16 + +### 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. +- Updated dependencies + - @backstage/cli@0.22.13 + - @backstage/plugin-catalog@1.13.0 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + ## 0.2.16-next.3 ### Patch Changes diff --git a/plugins/bazaar/package.json b/plugins/bazaar/package.json index 4df78fe89f..05ae2c442a 100644 --- a/plugins/bazaar/package.json +++ b/plugins/bazaar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bazaar", - "version": "0.2.16-next.3", + "version": "0.2.16", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bitbucket-cloud-common/CHANGELOG.md b/plugins/bitbucket-cloud-common/CHANGELOG.md index 53b0f90d25..d3fb8b0eb2 100644 --- a/plugins/bitbucket-cloud-common/CHANGELOG.md +++ b/plugins/bitbucket-cloud-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-bitbucket-cloud-common +## 0.2.12 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/integration@1.7.0 + ## 0.2.12-next.3 ### Patch Changes diff --git a/plugins/bitbucket-cloud-common/package.json b/plugins/bitbucket-cloud-common/package.json index 2dc63ff61c..a0d0df7a91 100644 --- a/plugins/bitbucket-cloud-common/package.json +++ b/plugins/bitbucket-cloud-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-bitbucket-cloud-common", "description": "Common functionalities for bitbucket-cloud plugins", - "version": "0.2.12-next.3", + "version": "0.2.12", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bitrise/CHANGELOG.md b/plugins/bitrise/CHANGELOG.md index a19027d361..8564978855 100644 --- a/plugins/bitrise/CHANGELOG.md +++ b/plugins/bitrise/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-bitrise +## 0.1.51 + +### 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/theme@0.4.2 + ## 0.1.51-next.3 ### Patch Changes diff --git a/plugins/bitrise/package.json b/plugins/bitrise/package.json index e18e4aca8c..413257109b 100644 --- a/plugins/bitrise/package.json +++ b/plugins/bitrise/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-bitrise", "description": "A Backstage plugin that integrates towards Bitrise", - "version": "0.1.51-next.3", + "version": "0.1.51", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-aws/CHANGELOG.md b/plugins/catalog-backend-module-aws/CHANGELOG.md index 045e86cf82..70684170dd 100644 --- a/plugins/catalog-backend-module-aws/CHANGELOG.md +++ b/plugins/catalog-backend-module-aws/CHANGELOG.md @@ -1,5 +1,39 @@ # @backstage/plugin-catalog-backend-module-aws +## 0.2.6 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.6.6 + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/integration-aws-node@0.1.6 + ## 0.2.6-next.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json index 848bf34d47..3d0321e00c 100644 --- a/plugins/catalog-backend-module-aws/package.json +++ b/plugins/catalog-backend-module-aws/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-aws", "description": "A Backstage catalog backend module that helps integrate towards AWS", - "version": "0.2.6-next.3", + "version": "0.2.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-azure/CHANGELOG.md b/plugins/catalog-backend-module-azure/CHANGELOG.md index 92bdfd109b..75872ba873 100644 --- a/plugins/catalog-backend-module-azure/CHANGELOG.md +++ b/plugins/catalog-backend-module-azure/CHANGELOG.md @@ -1,5 +1,40 @@ # @backstage/plugin-catalog-backend-module-azure +## 0.1.22 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- 94f96508491d: Improve consistency of results from the `AzureDevOpsEntityProvider`. +- 5f1a92b9f19f: Use `DefaultAzureDevOpsCredentialsProvider` to retrieve credentials for Azure DevOps. +- 044b4f2fb1e3: Remove duplications from Azure search before committing the new locations to the catalog. +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + ## 0.1.22-next.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-azure/package.json b/plugins/catalog-backend-module-azure/package.json index 73b140d58a..92d27e63ed 100644 --- a/plugins/catalog-backend-module-azure/package.json +++ b/plugins/catalog-backend-module-azure/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-azure", "description": "A Backstage catalog backend module that helps integrate towards Azure", - "version": "0.1.22-next.3", + "version": "0.1.22", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md index e1eef3b2e2..a20cbb30a0 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/plugin-catalog-backend-module-bitbucket-cloud +## 0.1.18 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.12 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-events-node@0.2.12 + ## 0.1.18-next.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-cloud/package.json b/plugins/catalog-backend-module-bitbucket-cloud/package.json index b76688ce82..51f4f716b5 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/package.json +++ b/plugins/catalog-backend-module-bitbucket-cloud/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-cloud", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket Cloud", - "version": "0.1.18-next.3", + "version": "0.1.18", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md index 61ee4d7e09..766f4689a0 100644 --- a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-catalog-backend-module-bitbucket-server +## 0.1.16 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + ## 0.1.16-next.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-server/package.json b/plugins/catalog-backend-module-bitbucket-server/package.json index 79891dee21..d1819e9a3b 100644 --- a/plugins/catalog-backend-module-bitbucket-server/package.json +++ b/plugins/catalog-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-server", - "version": "0.1.16-next.3", + "version": "0.1.16", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-bitbucket/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket/CHANGELOG.md index 1fef938310..1782c518b5 100644 --- a/plugins/catalog-backend-module-bitbucket/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-bitbucket +## 0.2.18 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.12 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-node@1.4.4 + ## 0.2.18-next.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket/package.json b/plugins/catalog-backend-module-bitbucket/package.json index ff1d57603f..5fba12c51d 100644 --- a/plugins/catalog-backend-module-bitbucket/package.json +++ b/plugins/catalog-backend-module-bitbucket/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket", - "version": "0.2.18-next.3", + "version": "0.2.18", "deprecated": true, "main": "src/index.ts", "types": "src/index.ts", diff --git a/plugins/catalog-backend-module-gcp/CHANGELOG.md b/plugins/catalog-backend-module-gcp/CHANGELOG.md index d25891f15c..43f6f8dc03 100644 --- a/plugins/catalog-backend-module-gcp/CHANGELOG.md +++ b/plugins/catalog-backend-module-gcp/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/plugin-catalog-backend-module-gcp +## 0.1.3 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- 201f07c27f1e: Fix GKE endpoint parsing + + Endpoint is an IP, not url. It is always https on default (443) port + ref: https://cloud.google.com/kubernetes-engine/docs/reference/rest/v1/projects.locations.clusters#Cluster + +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.6.6 + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + ## 0.1.3-next.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-gcp/package.json b/plugins/catalog-backend-module-gcp/package.json index 7f9ec4fd90..6c802154f4 100644 --- a/plugins/catalog-backend-module-gcp/package.json +++ b/plugins/catalog-backend-module-gcp/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-gcp", "description": "A Backstage catalog backend module that helps integrate towards GCP", - "version": "0.1.3-next.3", + "version": "0.1.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-gerrit/CHANGELOG.md b/plugins/catalog-backend-module-gerrit/CHANGELOG.md index ae454f70b3..6e265c7fa7 100644 --- a/plugins/catalog-backend-module-gerrit/CHANGELOG.md +++ b/plugins/catalog-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-catalog-backend-module-gerrit +## 0.1.19 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + ## 0.1.19-next.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json index bb59f7ef14..7fae34fa1f 100644 --- a/plugins/catalog-backend-module-gerrit/package.json +++ b/plugins/catalog-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gerrit", - "version": "0.1.19-next.3", + "version": "0.1.19", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-github/CHANGELOG.md b/plugins/catalog-backend-module-github/CHANGELOG.md index 0021623e5a..a3def0e7f2 100644 --- a/plugins/catalog-backend-module-github/CHANGELOG.md +++ b/plugins/catalog-backend-module-github/CHANGELOG.md @@ -1,5 +1,47 @@ # @backstage/plugin-catalog-backend-module-github +## 0.4.0 + +### Minor Changes + +- fa7004d9722c: Added a `catalogModuleGithubOrgEntityProvider` for the new backend system + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- 3d63e60f3c36: Internal restructure to avoid circular imports +- 96353bb7cb4a: Properly support custom `userTransformer` returning `undefined` in `GithubMultiOrgEntityProvider` +- 3c44761b9191: Allow github user and team transforms to return any Entity +- Updated dependencies + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-events-node@0.2.12 + ## 0.4.0-next.3 ### Minor Changes diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json index 7600fe23ed..4e7d4bd933 100644 --- a/plugins/catalog-backend-module-github/package.json +++ b/plugins/catalog-backend-module-github/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-github", "description": "A Backstage catalog backend module that helps integrate towards GitHub", - "version": "0.4.0-next.3", + "version": "0.4.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-gitlab/CHANGELOG.md b/plugins/catalog-backend-module-gitlab/CHANGELOG.md index 121c32da16..ff2043d1c8 100644 --- a/plugins/catalog-backend-module-gitlab/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,52 @@ # @backstage/plugin-catalog-backend-module-gitlab +## 0.3.0 + +### Minor Changes + +- 3d73bafd85c9: Fix Gitlab.com user ingestion by scoping GitlabOrgDiscoveryEntityProvider to a group. + + **BREAKING** The `group` parameter is now required Gitlab.com Org Data integrations and the backend will fail to start without this option configured. + + ```diff + catalog: + providers: + gitlab: + yourProviderId: + host: gitlab.com + orgEnabled: true + + group: org/teams + ``` + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + ## 0.3.0-next.3 ### Minor Changes diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json index f5f97ed03b..b03f96aedd 100644 --- a/plugins/catalog-backend-module-gitlab/package.json +++ b/plugins/catalog-backend-module-gitlab/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-gitlab", "description": "A Backstage catalog backend module that helps integrate towards GitLab", - "version": "0.3.0-next.3", + "version": "0.3.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md index 59bfe73054..44ee123ceb 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md +++ b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-catalog-backend-module-incremental-ingestion +## 0.4.6 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-events-node@0.2.12 + ## 0.4.6-next.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-incremental-ingestion/package.json b/plugins/catalog-backend-module-incremental-ingestion/package.json index 9dc7133dd8..a5d1dc29eb 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/package.json +++ b/plugins/catalog-backend-module-incremental-ingestion/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-incremental-ingestion", "description": "An entity provider for streaming large asset sources into the catalog", - "version": "0.4.6-next.3", + "version": "0.4.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-ldap/CHANGELOG.md b/plugins/catalog-backend-module-ldap/CHANGELOG.md index 58bda32fee..bf2b433fff 100644 --- a/plugins/catalog-backend-module-ldap/CHANGELOG.md +++ b/plugins/catalog-backend-module-ldap/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-backend-module-ldap +## 0.5.18 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-node@1.4.4 + ## 0.5.18-next.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-ldap/package.json b/plugins/catalog-backend-module-ldap/package.json index 01fb70fbce..3e5ae84ad2 100644 --- a/plugins/catalog-backend-module-ldap/package.json +++ b/plugins/catalog-backend-module-ldap/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-ldap", "description": "A Backstage catalog backend module that helps integrate towards LDAP", - "version": "0.5.18-next.3", + "version": "0.5.18", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-msgraph/CHANGELOG.md b/plugins/catalog-backend-module-msgraph/CHANGELOG.md index e0af84a0cb..32ca5ec085 100644 --- a/plugins/catalog-backend-module-msgraph/CHANGELOG.md +++ b/plugins/catalog-backend-module-msgraph/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-catalog-backend-module-msgraph +## 0.5.10 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + ## 0.5.10-next.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json index ba2a1687cc..9aa539105a 100644 --- a/plugins/catalog-backend-module-msgraph/package.json +++ b/plugins/catalog-backend-module-msgraph/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-msgraph", "description": "A Backstage catalog backend module that helps integrate towards Microsoft Graph", - "version": "0.5.10-next.3", + "version": "0.5.10", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-openapi/CHANGELOG.md b/plugins/catalog-backend-module-openapi/CHANGELOG.md index 7e28fce0b3..0c3895b20a 100644 --- a/plugins/catalog-backend-module-openapi/CHANGELOG.md +++ b/plugins/catalog-backend-module-openapi/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-openapi +## 0.1.19 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-node@1.4.4 + ## 0.1.19-next.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-openapi/package.json b/plugins/catalog-backend-module-openapi/package.json index 7105fab0b1..868c75a435 100644 --- a/plugins/catalog-backend-module-openapi/package.json +++ b/plugins/catalog-backend-module-openapi/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-openapi", "description": "A Backstage catalog backend module that helps with OpenAPI specifications", - "version": "0.1.19-next.3", + "version": "0.1.19", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md index 79454f29e2..a2b920105a 100644 --- a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md +++ b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-catalog-backend-module-puppetdb +## 0.1.8 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + ## 0.1.8-next.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-puppetdb/package.json b/plugins/catalog-backend-module-puppetdb/package.json index ea33d2737d..7eaf63b932 100644 --- a/plugins/catalog-backend-module-puppetdb/package.json +++ b/plugins/catalog-backend-module-puppetdb/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-puppetdb", "description": "A Backstage catalog backend module that helps integrate towards PuppetDB", - "version": "0.1.8-next.3", + "version": "0.1.8", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md b/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md index 2c90f3caa7..c0de55d782 100644 --- a/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md +++ b/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-backend-module-scaffolder-entity-model +## 0.1.0 + +### Minor Changes + +- d5313ede3529: Added a dedicated module to collect the `ScaffolderEntitiesProcessor` and `catalogModuleTemplateKind`. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + ## 0.1.0-next.0 ### Minor Changes diff --git a/plugins/catalog-backend-module-scaffolder-entity-model/package.json b/plugins/catalog-backend-module-scaffolder-entity-model/package.json index 71dc6fd136..f0f3ce59cf 100644 --- a/plugins/catalog-backend-module-scaffolder-entity-model/package.json +++ b/plugins/catalog-backend-module-scaffolder-entity-model/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-scaffolder-entity-model", "description": "Adds support for the scaffolder specific entity model (e.g. the Template kind) to the catalog backend plugin.", - "version": "0.1.0-next.0", + "version": "0.1.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-unprocessed/CHANGELOG.md b/plugins/catalog-backend-module-unprocessed/CHANGELOG.md index ee8e415944..9b8201e59f 100644 --- a/plugins/catalog-backend-module-unprocessed/CHANGELOG.md +++ b/plugins/catalog-backend-module-unprocessed/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-catalog-backend-module-unprocessed +## 0.3.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 + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.0 + - @backstage/catalog-model@1.4.2 + - @backstage/backend-plugin-api@0.6.3 + ## 0.3.0-next.3 ### Minor Changes diff --git a/plugins/catalog-backend-module-unprocessed/package.json b/plugins/catalog-backend-module-unprocessed/package.json index e4945b55b2..8cff3514ec 100644 --- a/plugins/catalog-backend-module-unprocessed/package.json +++ b/plugins/catalog-backend-module-unprocessed/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-unprocessed", "description": "Backstage Catalog module to view unprocessed entities", - "version": "0.3.0-next.3", + "version": "0.3.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend/CHANGELOG.md b/plugins/catalog-backend/CHANGELOG.md index 1bb1c6abac..49ba2517f7 100644 --- a/plugins/catalog-backend/CHANGELOG.md +++ b/plugins/catalog-backend/CHANGELOG.md @@ -1,5 +1,62 @@ # @backstage/plugin-catalog-backend +## 1.13.0 + +### Minor Changes + +- 62f448edb0b5: Allow configuring the processing interval in your app-config, under the `catalog.processingInterval` key. +- 09cfc3cf467d: set azure annotation `dev.azure.com/project-repo` in `AnnotateScmSlugEntityProcessor` to find the project and repo information for the repos that contains `dev.azure.com` in the url + +### Patch Changes + +- 149361e81622: Fix to the `limit` parameter on entity queries. +- 1fd2109739c1: Changed the processing loop task pipeline implementation from recursive to iterative +- 71114ac50e02: 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')); + ``` + +- 0f8a97777489: Update OpenAPI schema to relax the encoding validation of all request parameters. +- 0198aa596fd9: Fixed a link to the frontend Backstage plugin that had pointed to itself. +- 2d32d8a611e3: Fixed validation of the `fullTextFilterFields` query parameter. +- acffa17027b6: Added some examples to the catalog OpenAPI definition +- 45947d3b2759: Fixes an issue where `order` was not a recognized parameter for the `/entities` endpoint. +- 41d1b2d628ea: Fix OpenAPI schema for the facets endpoint +- 618257f3e413: Fix issue with `catalogFileName` not being a required property for `/analyze-location` +- cfc3ca6ce060: Changes needed to support MySQL +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/plugin-search-backend-module-catalog@0.1.7 + - @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/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/plugin-search-common@1.2.6 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/backend-openapi-utils@0.0.4 + - @backstage/plugin-events-node@0.2.12 + ## 1.13.0-next.3 ### Patch Changes diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index 76ccf49835..a1a47ed13a 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend", "description": "The Backstage backend plugin that provides the Backstage catalog", - "version": "1.13.0-next.3", + "version": "1.13.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-common/CHANGELOG.md b/plugins/catalog-common/CHANGELOG.md index ea765169bb..b33835b2b6 100644 --- a/plugins/catalog-common/CHANGELOG.md +++ b/plugins/catalog-common/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-common +## 1.0.16 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + ## 1.0.16-next.2 ### Patch Changes diff --git a/plugins/catalog-common/package.json b/plugins/catalog-common/package.json index 3d17f6266e..ce78ffd5f0 100644 --- a/plugins/catalog-common/package.json +++ b/plugins/catalog-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-common", "description": "Common functionalities for the catalog plugin", - "version": "1.0.16-next.2", + "version": "1.0.16", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-customized/CHANGELOG.md b/plugins/catalog-customized/CHANGELOG.md index ebdf4da400..ac858f652d 100644 --- a/plugins/catalog-customized/CHANGELOG.md +++ b/plugins/catalog-customized/CHANGELOG.md @@ -1,5 +1,13 @@ # @internal/plugin-catalog-customized +## 0.0.14 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.13.0 + - @backstage/plugin-catalog-react@1.8.4 + ## 0.0.14-next.3 ### Patch Changes diff --git a/plugins/catalog-customized/package.json b/plugins/catalog-customized/package.json index 253a56c649..4c33911549 100644 --- a/plugins/catalog-customized/package.json +++ b/plugins/catalog-customized/package.json @@ -1,7 +1,7 @@ { "name": "@internal/plugin-catalog-customized", "description": "The internal Backstage Customizable plugin for browsing the Backstage catalog", - "version": "0.0.14-next.3", + "version": "0.0.14", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-graph/CHANGELOG.md b/plugins/catalog-graph/CHANGELOG.md index aa92c9277f..c5032a1cf4 100644 --- a/plugins/catalog-graph/CHANGELOG.md +++ b/plugins/catalog-graph/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-graph +## 0.2.36 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + ## 0.2.36-next.3 ### Patch Changes diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index 41546c98be..236103471f 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-graph", - "version": "0.2.36-next.3", + "version": "0.2.36", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-graphql/CHANGELOG.md b/plugins/catalog-graphql/CHANGELOG.md index 8077a3eab7..e34136f8eb 100644 --- a/plugins/catalog-graphql/CHANGELOG.md +++ b/plugins/catalog-graphql/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-graphql +## 0.3.23 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/types@1.1.1 + ## 0.3.23-next.2 ### Patch Changes diff --git a/plugins/catalog-graphql/package.json b/plugins/catalog-graphql/package.json index 391c3c00d7..e853f308f3 100644 --- a/plugins/catalog-graphql/package.json +++ b/plugins/catalog-graphql/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-graphql", "description": "An experimental Backstage catalog GraphQL module", - "version": "0.3.23-next.2", + "version": "0.3.23", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-import/CHANGELOG.md b/plugins/catalog-import/CHANGELOG.md index 86fa570e66..84efe07b7f 100644 --- a/plugins/catalog-import/CHANGELOG.md +++ b/plugins/catalog-import/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-catalog-import +## 0.10.0 + +### Minor Changes + +- c3c1fd3a1765: Slight change to the `PreparePullRequestFormProps`, because of an update to `react-hook-form`. + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + ## 0.9.14-next.3 ### Patch Changes diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index 3bb896f8e7..5d68888beb 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-import", "description": "A Backstage plugin the helps you import entities into your catalog", - "version": "0.9.14-next.3", + "version": "0.10.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-node/CHANGELOG.md b/plugins/catalog-node/CHANGELOG.md index 06f9333cab..1d3b4d54da 100644 --- a/plugins/catalog-node/CHANGELOG.md +++ b/plugins/catalog-node/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-node +## 1.4.4 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + ## 1.4.4-next.3 ### Patch Changes diff --git a/plugins/catalog-node/package.json b/plugins/catalog-node/package.json index c85acb1c15..ca2de8542d 100644 --- a/plugins/catalog-node/package.json +++ b/plugins/catalog-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-node", "description": "The plugin-catalog-node module for @backstage/plugin-catalog-backend", - "version": "1.4.4-next.3", + "version": "1.4.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-react/CHANGELOG.md b/plugins/catalog-react/CHANGELOG.md index f70079310f..f8ddbe2a0a 100644 --- a/plugins/catalog-react/CHANGELOG.md +++ b/plugins/catalog-react/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-catalog-react +## 1.8.4 + +### Patch Changes + +- bd817209ddd7: Export the `EntityAutocompletePicker` component. +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 7029ba1ce0af: Added delete alert popup when user delete the entity +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + ## 1.8.4-next.3 ### Patch Changes diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index 319ff31eee..277a37e1a2 100644 --- a/plugins/catalog-react/package.json +++ b/plugins/catalog-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-react", "description": "A frontend library that helps other Backstage plugins interact with the catalog", - "version": "1.8.4-next.3", + "version": "1.8.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-unprocessed-entities/CHANGELOG.md b/plugins/catalog-unprocessed-entities/CHANGELOG.md index 84fdac0bdc..f797b6b5e1 100644 --- a/plugins/catalog-unprocessed-entities/CHANGELOG.md +++ b/plugins/catalog-unprocessed-entities/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-unprocessed-entities +## 0.1.3 + +### 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/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.1.3-next.3 ### Patch Changes diff --git a/plugins/catalog-unprocessed-entities/package.json b/plugins/catalog-unprocessed-entities/package.json index 350988b3ac..ce24df8001 100644 --- a/plugins/catalog-unprocessed-entities/package.json +++ b/plugins/catalog-unprocessed-entities/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-unprocessed-entities", - "version": "0.1.3-next.3", + "version": "0.1.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md index c47c7df2a4..a26c19cfd6 100644 --- a/plugins/catalog/CHANGELOG.md +++ b/plugins/catalog/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-catalog +## 1.13.0 + +### Minor Changes + +- e44f45ac4515: This change allows a new annotation of `backstage.io/techdocs-entity` this ref allows you to reference another entity for its TechDocs. This allows you have a single TechDoc for all items in a system, for example you might have a frontend and a backend in the same repo. This would allow you to have TechDocs build under a `System` entity while referencing the system e.g.: `backstage.io/techdocs-entity: system:default/example` that will show the systems docs in both the TechDocs button and the TechDocs tab without needing to do duplicate builds and filling the TechDocs page with garbage. + +### Patch Changes + +- 832eef72485b: Added title to props for `HasCards`. +- 163a41035e42: Fixed an issue where `EntitySwitch` was preventing the display of entity errors. +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + ## 1.13.0-next.3 ### Patch Changes diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index e3b7975f84..10a9eaf35e 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog", "description": "The Backstage plugin for browsing the Backstage catalog", - "version": "1.13.0-next.3", + "version": "1.13.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md index 437aea1243..539caaef1e 100644 --- a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md +++ b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-cicd-statistics-module-gitlab +## 0.1.20 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-cicd-statistics@0.1.26 + ## 0.1.20-next.3 ### Patch Changes diff --git a/plugins/cicd-statistics-module-gitlab/package.json b/plugins/cicd-statistics-module-gitlab/package.json index 2ad82799ab..7573ebd63e 100644 --- a/plugins/cicd-statistics-module-gitlab/package.json +++ b/plugins/cicd-statistics-module-gitlab/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cicd-statistics-module-gitlab", "description": "CI/CD Statistics plugin module; Gitlab CICD", - "version": "0.1.20-next.3", + "version": "0.1.20", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cicd-statistics/CHANGELOG.md b/plugins/cicd-statistics/CHANGELOG.md index 5bf0006ff7..6a70334cb1 100644 --- a/plugins/cicd-statistics/CHANGELOG.md +++ b/plugins/cicd-statistics/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-cicd-statistics +## 0.1.26 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + ## 0.1.26-next.3 ### Patch Changes diff --git a/plugins/cicd-statistics/package.json b/plugins/cicd-statistics/package.json index 28b99ddc13..9936874270 100644 --- a/plugins/cicd-statistics/package.json +++ b/plugins/cicd-statistics/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cicd-statistics", "description": "A frontend plugin visualizing CI/CD pipeline statistics (build time)", - "version": "0.1.26-next.3", + "version": "0.1.26", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/circleci/CHANGELOG.md b/plugins/circleci/CHANGELOG.md index 4f4b391646..71673c46eb 100644 --- a/plugins/circleci/CHANGELOG.md +++ b/plugins/circleci/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-circleci +## 0.3.24 + +### 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/theme@0.4.2 + ## 0.3.24-next.3 ### Patch Changes diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json index f00381086b..8d897fda4f 100644 --- a/plugins/circleci/package.json +++ b/plugins/circleci/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-circleci", "description": "A Backstage plugin that integrates towards Circle CI", - "version": "0.3.24-next.3", + "version": "0.3.24", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cloudbuild/CHANGELOG.md b/plugins/cloudbuild/CHANGELOG.md index 334dc576d6..0905269073 100644 --- a/plugins/cloudbuild/CHANGELOG.md +++ b/plugins/cloudbuild/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-cloudbuild +## 0.3.24 + +### 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 +- 814feeed7343: Update to handle invalid luxon values +- 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/theme@0.4.2 + ## 0.3.24-next.3 ### Patch Changes diff --git a/plugins/cloudbuild/package.json b/plugins/cloudbuild/package.json index 3134b996e0..74338240c6 100644 --- a/plugins/cloudbuild/package.json +++ b/plugins/cloudbuild/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cloudbuild", "description": "A Backstage plugin that integrates towards Google Cloud Build", - "version": "0.3.24-next.3", + "version": "0.3.24", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-climate/CHANGELOG.md b/plugins/code-climate/CHANGELOG.md index 1534f24849..749de6cd76 100644 --- a/plugins/code-climate/CHANGELOG.md +++ b/plugins/code-climate/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-code-climate +## 0.1.24 + +### 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/theme@0.4.2 + ## 0.1.24-next.3 ### Patch Changes diff --git a/plugins/code-climate/package.json b/plugins/code-climate/package.json index 86ea49464f..30e29490eb 100644 --- a/plugins/code-climate/package.json +++ b/plugins/code-climate/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-code-climate", - "version": "0.1.24-next.3", + "version": "0.1.24", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-coverage-backend/CHANGELOG.md b/plugins/code-coverage-backend/CHANGELOG.md index 7a5f17d5a3..2c4d9685e5 100644 --- a/plugins/code-coverage-backend/CHANGELOG.md +++ b/plugins/code-coverage-backend/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-code-coverage-backend +## 0.2.17 + +### Patch Changes + +- 3f1367b956c6: Added support for LCOV coverage reports +- df005d9932fb: Add text body parser for LCOV reports +- 91ccb56fb418: Replace `express-xml-bodyparser` with `body-parser-xml`. + + `express-xml-bodyparser` was last updated 8 years ago + and currently depends on a version of `xml2js` which + contains a vulnerability. + + This change will swap it out in favor of `body-parser-xml` + which is more maintained and depends on a more recent `xml2js` + version without the vulnerability. + +- 33e606a797ef: Include auth token when fetching entity +- d409ed988aed: Correct the line hits calculation for Cobertura reports +- cfc3ca6ce060: Changes needed to support MySQL +- Updated dependencies + - @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/integration@1.7.0 + ## 0.2.17-next.3 ### Patch Changes diff --git a/plugins/code-coverage-backend/package.json b/plugins/code-coverage-backend/package.json index f81d8b6e3c..f875f4d03d 100644 --- a/plugins/code-coverage-backend/package.json +++ b/plugins/code-coverage-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-code-coverage-backend", "description": "A Backstage backend plugin that helps you keep track of your code coverage", - "version": "0.2.17-next.3", + "version": "0.2.17", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-coverage/CHANGELOG.md b/plugins/code-coverage/CHANGELOG.md index 747807034f..b8bf77b484 100644 --- a/plugins/code-coverage/CHANGELOG.md +++ b/plugins/code-coverage/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-code-coverage +## 0.2.17 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 1d8f4f0a7486: Use fetchApi to ensure authorization is used when fetching code-coverage data +- 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/errors@1.2.2 + - @backstage/theme@0.4.2 + ## 0.2.17-next.3 ### Patch Changes diff --git a/plugins/code-coverage/package.json b/plugins/code-coverage/package.json index 9dda17c56f..ede73b9506 100644 --- a/plugins/code-coverage/package.json +++ b/plugins/code-coverage/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-code-coverage", "description": "A Backstage plugin that helps you keep track of your code coverage", - "version": "0.2.17-next.3", + "version": "0.2.17", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/codescene/CHANGELOG.md b/plugins/codescene/CHANGELOG.md index 7a73c288e9..57f5fe44a9 100644 --- a/plugins/codescene/CHANGELOG.md +++ b/plugins/codescene/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-codescene +## 0.1.17 + +### 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 +- db92d1244897: Updated dependency `rc-progress` to `3.5.1`. +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + ## 0.1.17-next.3 ### Patch Changes diff --git a/plugins/codescene/package.json b/plugins/codescene/package.json index 1572102f6a..a3a5564900 100644 --- a/plugins/codescene/package.json +++ b/plugins/codescene/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-codescene", - "version": "0.1.17-next.3", + "version": "0.1.17", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/config-schema/CHANGELOG.md b/plugins/config-schema/CHANGELOG.md index 237ad63dbe..d6d03c1caf 100644 --- a/plugins/config-schema/CHANGELOG.md +++ b/plugins/config-schema/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-config-schema +## 0.1.45 + +### 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/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + ## 0.1.45-next.3 ### Patch Changes diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json index 368be1ee65..ad642a4283 100644 --- a/plugins/config-schema/package.json +++ b/plugins/config-schema/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-config-schema", "description": "A Backstage plugin that lets you browse the configuration schema of your app", - "version": "0.1.45-next.3", + "version": "0.1.45", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cost-insights-common/CHANGELOG.md b/plugins/cost-insights-common/CHANGELOG.md index 40adfc123a..2bd7d1dc76 100644 --- a/plugins/cost-insights-common/CHANGELOG.md +++ b/plugins/cost-insights-common/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/plugin-cost-insights-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 diff --git a/plugins/cost-insights-common/package.json b/plugins/cost-insights-common/package.json index 5f951cef95..629d743ee9 100644 --- a/plugins/cost-insights-common/package.json +++ b/plugins/cost-insights-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cost-insights-common", "description": "Common functionalities for the cost-insights plugin", - "version": "0.1.2-next.0", + "version": "0.1.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cost-insights/CHANGELOG.md b/plugins/cost-insights/CHANGELOG.md index 5cf01ef04b..f74ae41fc0 100644 --- a/plugins/cost-insights/CHANGELOG.md +++ b/plugins/cost-insights/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-cost-insights +## 0.12.13 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- a54cd411639e: Updated dependency `@types/pluralize` to `^0.0.30`. +- 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/plugin-cost-insights-common@0.1.2 + - @backstage/theme@0.4.2 + ## 0.12.13-next.3 ### Patch Changes diff --git a/plugins/cost-insights/package.json b/plugins/cost-insights/package.json index b37d366b06..28f6ece59e 100644 --- a/plugins/cost-insights/package.json +++ b/plugins/cost-insights/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cost-insights", "description": "A Backstage plugin that helps you keep track of your cloud spend", - "version": "0.12.13-next.3", + "version": "0.12.13", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/devtools-backend/CHANGELOG.md b/plugins/devtools-backend/CHANGELOG.md index ebb942473b..7d679b0aa6 100644 --- a/plugins/devtools-backend/CHANGELOG.md +++ b/plugins/devtools-backend/CHANGELOG.md @@ -1,5 +1,41 @@ # @backstage/plugin-devtools-backend +## 0.2.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 + +- 12e644aa4eef: Show resource utilization in `DevTools` plugin +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-devtools-common@0.1.4 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/config-loader@1.5.0 + - @backstage/cli-common@0.1.12 + ## 0.2.0-next.3 ### Minor Changes diff --git a/plugins/devtools-backend/package.json b/plugins/devtools-backend/package.json index a5db6d2fd4..e8a3d5b151 100644 --- a/plugins/devtools-backend/package.json +++ b/plugins/devtools-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools-backend", - "version": "0.2.0-next.3", + "version": "0.2.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/devtools-common/CHANGELOG.md b/plugins/devtools-common/CHANGELOG.md index 4e5603ebd9..4e1f15afcf 100644 --- a/plugins/devtools-common/CHANGELOG.md +++ b/plugins/devtools-common/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-devtools-common +## 0.1.4 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 12e644aa4eef: Show resource utilization in `DevTools` plugin +- Updated dependencies + - @backstage/plugin-permission-common@0.7.8 + - @backstage/types@1.1.1 + ## 0.1.4-next.2 ### Patch Changes diff --git a/plugins/devtools-common/package.json b/plugins/devtools-common/package.json index 921a658930..bde9934ffa 100644 --- a/plugins/devtools-common/package.json +++ b/plugins/devtools-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-devtools-common", "description": "Common functionalities for the devtools plugin", - "version": "0.1.4-next.2", + "version": "0.1.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/devtools/CHANGELOG.md b/plugins/devtools/CHANGELOG.md index 13c452e26f..2585103b45 100644 --- a/plugins/devtools/CHANGELOG.md +++ b/plugins/devtools/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-devtools +## 0.1.4 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 12e644aa4eef: Show resource utilization in `DevTools` plugin +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-devtools-common@0.1.4 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + ## 0.1.4-next.3 ### Patch Changes diff --git a/plugins/devtools/package.json b/plugins/devtools/package.json index 7311975ae9..44010775a8 100644 --- a/plugins/devtools/package.json +++ b/plugins/devtools/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools", - "version": "0.1.4-next.3", + "version": "0.1.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/dynatrace/CHANGELOG.md b/plugins/dynatrace/CHANGELOG.md index 5abbd83b7e..33ddc90338 100644 --- a/plugins/dynatrace/CHANGELOG.md +++ b/plugins/dynatrace/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-dynatrace +## 7.0.4 + +### 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/theme@0.4.2 + ## 7.0.4-next.3 ### Patch Changes diff --git a/plugins/dynatrace/package.json b/plugins/dynatrace/package.json index 749e2e730f..663744a454 100644 --- a/plugins/dynatrace/package.json +++ b/plugins/dynatrace/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-dynatrace", - "version": "7.0.4-next.3", + "version": "7.0.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/entity-feedback-backend/CHANGELOG.md b/plugins/entity-feedback-backend/CHANGELOG.md index dd9f9288e3..ac9527c416 100644 --- a/plugins/entity-feedback-backend/CHANGELOG.md +++ b/plugins/entity-feedback-backend/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-entity-feedback-backend +## 0.2.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 + +- 740155e8e976: Improve backend logging if method calls fail +- Updated dependencies + - @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/plugin-entity-feedback-common@0.1.3 + - @backstage/backend-plugin-api@0.6.3 + ## 0.2.0-next.3 ### Minor Changes diff --git a/plugins/entity-feedback-backend/package.json b/plugins/entity-feedback-backend/package.json index 60521fe3c6..41d33eb896 100644 --- a/plugins/entity-feedback-backend/package.json +++ b/plugins/entity-feedback-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-entity-feedback-backend", - "version": "0.2.0-next.3", + "version": "0.2.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/entity-feedback-common/CHANGELOG.md b/plugins/entity-feedback-common/CHANGELOG.md index b1993659d2..8981c80952 100644 --- a/plugins/entity-feedback-common/CHANGELOG.md +++ b/plugins/entity-feedback-common/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/plugin-entity-feedback-common +## 0.1.3 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + ## 0.1.3-next.0 ### Patch Changes diff --git a/plugins/entity-feedback-common/package.json b/plugins/entity-feedback-common/package.json index 0ec33e3848..7688ded0d7 100644 --- a/plugins/entity-feedback-common/package.json +++ b/plugins/entity-feedback-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-entity-feedback-common", "description": "Common functionalities for the entity-feedback plugin", - "version": "0.1.3-next.0", + "version": "0.1.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/entity-feedback/CHANGELOG.md b/plugins/entity-feedback/CHANGELOG.md index f14d4ec939..c470784b86 100644 --- a/plugins/entity-feedback/CHANGELOG.md +++ b/plugins/entity-feedback/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-entity-feedback +## 0.2.7 + +### Patch Changes + +- 5e2e06db747a: Improve README to note that Backstage identity is required to be configured +- 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-entity-feedback-common@0.1.3 + - @backstage/theme@0.4.2 + ## 0.2.7-next.3 ### Patch Changes diff --git a/plugins/entity-feedback/package.json b/plugins/entity-feedback/package.json index dbfb824eac..b8f2333ad4 100644 --- a/plugins/entity-feedback/package.json +++ b/plugins/entity-feedback/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-entity-feedback", - "version": "0.2.7-next.3", + "version": "0.2.7", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/entity-validation/CHANGELOG.md b/plugins/entity-validation/CHANGELOG.md index da0167951f..a975bdba54 100644 --- a/plugins/entity-validation/CHANGELOG.md +++ b/plugins/entity-validation/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-entity-validation +## 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-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/theme@0.4.2 + ## 0.1.9-next.3 ### Patch Changes diff --git a/plugins/entity-validation/package.json b/plugins/entity-validation/package.json index fbcdaf8407..1a17875970 100644 --- a/plugins/entity-validation/package.json +++ b/plugins/entity-validation/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-entity-validation", - "version": "0.1.9-next.3", + "version": "0.1.9", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-aws-sqs/CHANGELOG.md b/plugins/events-backend-module-aws-sqs/CHANGELOG.md index a883523293..e79d836d49 100644 --- a/plugins/events-backend-module-aws-sqs/CHANGELOG.md +++ b/plugins/events-backend-module-aws-sqs/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-events-backend-module-aws-sqs +## 0.2.6 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + ## 0.2.6-next.3 ### Patch Changes diff --git a/plugins/events-backend-module-aws-sqs/package.json b/plugins/events-backend-module-aws-sqs/package.json index 6e04fe80df..b3f0d379c2 100644 --- a/plugins/events-backend-module-aws-sqs/package.json +++ b/plugins/events-backend-module-aws-sqs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-aws-sqs", - "version": "0.2.6-next.3", + "version": "0.2.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-azure/CHANGELOG.md b/plugins/events-backend-module-azure/CHANGELOG.md index 5070283861..5289fdb465 100644 --- a/plugins/events-backend-module-azure/CHANGELOG.md +++ b/plugins/events-backend-module-azure/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-azure +## 0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + ## 0.1.13-next.3 ### Patch Changes diff --git a/plugins/events-backend-module-azure/package.json b/plugins/events-backend-module-azure/package.json index 13e3b262f3..9cb0ff81c1 100644 --- a/plugins/events-backend-module-azure/package.json +++ b/plugins/events-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-azure", - "version": "0.1.13-next.3", + "version": "0.1.13", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md index 591a5f52b3..c21e46c15b 100644 --- a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-bitbucket-cloud +## 0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + ## 0.1.13-next.3 ### Patch Changes diff --git a/plugins/events-backend-module-bitbucket-cloud/package.json b/plugins/events-backend-module-bitbucket-cloud/package.json index 2cb6036dda..d5918731d1 100644 --- a/plugins/events-backend-module-bitbucket-cloud/package.json +++ b/plugins/events-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-bitbucket-cloud", - "version": "0.1.13-next.3", + "version": "0.1.13", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-gerrit/CHANGELOG.md b/plugins/events-backend-module-gerrit/CHANGELOG.md index 00b1458b9c..d09472671a 100644 --- a/plugins/events-backend-module-gerrit/CHANGELOG.md +++ b/plugins/events-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-gerrit +## 0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + ## 0.1.13-next.3 ### Patch Changes diff --git a/plugins/events-backend-module-gerrit/package.json b/plugins/events-backend-module-gerrit/package.json index db3c63aa67..9cc5f77e20 100644 --- a/plugins/events-backend-module-gerrit/package.json +++ b/plugins/events-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gerrit", - "version": "0.1.13-next.3", + "version": "0.1.13", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-github/CHANGELOG.md b/plugins/events-backend-module-github/CHANGELOG.md index 65ca36d696..0fa5c1e73a 100644 --- a/plugins/events-backend-module-github/CHANGELOG.md +++ b/plugins/events-backend-module-github/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-events-backend-module-github +## 0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + ## 0.1.13-next.3 ### Patch Changes diff --git a/plugins/events-backend-module-github/package.json b/plugins/events-backend-module-github/package.json index 4dea3ab25c..ac94f83f41 100644 --- a/plugins/events-backend-module-github/package.json +++ b/plugins/events-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-github", - "version": "0.1.13-next.3", + "version": "0.1.13", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-gitlab/CHANGELOG.md b/plugins/events-backend-module-gitlab/CHANGELOG.md index 0cdd6f8d52..137f700504 100644 --- a/plugins/events-backend-module-gitlab/CHANGELOG.md +++ b/plugins/events-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-events-backend-module-gitlab +## 0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + ## 0.1.13-next.3 ### Patch Changes diff --git a/plugins/events-backend-module-gitlab/package.json b/plugins/events-backend-module-gitlab/package.json index de4fed7289..367ff8caf2 100644 --- a/plugins/events-backend-module-gitlab/package.json +++ b/plugins/events-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gitlab", - "version": "0.1.13-next.3", + "version": "0.1.13", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-test-utils/CHANGELOG.md b/plugins/events-backend-test-utils/CHANGELOG.md index 63a2e594d3..de26b9b864 100644 --- a/plugins/events-backend-test-utils/CHANGELOG.md +++ b/plugins/events-backend-test-utils/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-events-backend-test-utils +## 0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.12 + ## 0.1.13-next.3 ### Patch Changes diff --git a/plugins/events-backend-test-utils/package.json b/plugins/events-backend-test-utils/package.json index 4ea6403b8c..e749eecc28 100644 --- a/plugins/events-backend-test-utils/package.json +++ b/plugins/events-backend-test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-events-backend-test-utils", "description": "The plugin-events-backend-test-utils for @backstage/plugin-events-node", - "version": "0.1.13-next.3", + "version": "0.1.13", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend/CHANGELOG.md b/plugins/events-backend/CHANGELOG.md index e98a5069fe..64fb6da65a 100644 --- a/plugins/events-backend/CHANGELOG.md +++ b/plugins/events-backend/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-events-backend +## 0.2.12 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + ## 0.2.12-next.3 ### Patch Changes diff --git a/plugins/events-backend/package.json b/plugins/events-backend/package.json index b680727451..135971b91f 100644 --- a/plugins/events-backend/package.json +++ b/plugins/events-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend", - "version": "0.2.12-next.3", + "version": "0.2.12", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-node/CHANGELOG.md b/plugins/events-node/CHANGELOG.md index d9d8a6a719..e458e3e1e8 100644 --- a/plugins/events-node/CHANGELOG.md +++ b/plugins/events-node/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-events-node +## 0.2.12 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.3 + ## 0.2.12-next.3 ### Patch Changes diff --git a/plugins/events-node/package.json b/plugins/events-node/package.json index d2f3f4c1c7..2a27e1c200 100644 --- a/plugins/events-node/package.json +++ b/plugins/events-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-events-node", "description": "The plugin-events-node module for @backstage/plugin-events-backend", - "version": "0.2.12-next.3", + "version": "0.2.12", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/example-todo-list-backend/CHANGELOG.md b/plugins/example-todo-list-backend/CHANGELOG.md index 30ebaa8f1c..9518234111 100644 --- a/plugins/example-todo-list-backend/CHANGELOG.md +++ b/plugins/example-todo-list-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @internal/plugin-todo-list-backend +## 1.0.17 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/backend-plugin-api@0.6.3 + ## 1.0.17-next.3 ### Patch Changes diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json index 24b3647a26..27a8536c7d 100644 --- a/plugins/example-todo-list-backend/package.json +++ b/plugins/example-todo-list-backend/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list-backend", - "version": "1.0.17-next.3", + "version": "1.0.17", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/example-todo-list-common/CHANGELOG.md b/plugins/example-todo-list-common/CHANGELOG.md index 1a141b8dbf..af2dba54e0 100644 --- a/plugins/example-todo-list-common/CHANGELOG.md +++ b/plugins/example-todo-list-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @internal/plugin-todo-list-common +## 1.0.13 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.8 + ## 1.0.13-next.2 ### Patch Changes diff --git a/plugins/example-todo-list-common/package.json b/plugins/example-todo-list-common/package.json index 31e4f8b37e..257f19e1c7 100644 --- a/plugins/example-todo-list-common/package.json +++ b/plugins/example-todo-list-common/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list-common", - "version": "1.0.13-next.2", + "version": "1.0.13", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/example-todo-list/CHANGELOG.md b/plugins/example-todo-list/CHANGELOG.md index d265584ef0..5ec4c4ea8e 100644 --- a/plugins/example-todo-list/CHANGELOG.md +++ b/plugins/example-todo-list/CHANGELOG.md @@ -1,5 +1,14 @@ # @internal/plugin-todo-list +## 1.0.17 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 1.0.17-next.3 ### Patch Changes diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json index cc0e510918..e61aaace42 100644 --- a/plugins/example-todo-list/package.json +++ b/plugins/example-todo-list/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list", - "version": "1.0.17-next.3", + "version": "1.0.17", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore-backend/CHANGELOG.md b/plugins/explore-backend/CHANGELOG.md index 6b1cf1b626..3baae5db72 100644 --- a/plugins/explore-backend/CHANGELOG.md +++ b/plugins/explore-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-explore-backend +## 0.0.13 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-explore@0.1.7 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-explore-common@0.0.2 + - @backstage/plugin-search-common@1.2.6 + - @backstage/types@1.1.1 + ## 0.0.13-next.3 ### Patch Changes diff --git a/plugins/explore-backend/package.json b/plugins/explore-backend/package.json index 4c37fbd71f..50e179a4b9 100644 --- a/plugins/explore-backend/package.json +++ b/plugins/explore-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-explore-backend", - "version": "0.0.13-next.3", + "version": "0.0.13", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore-common/CHANGELOG.md b/plugins/explore-common/CHANGELOG.md index ce3e7ca020..a17d233c03 100644 --- a/plugins/explore-common/CHANGELOG.md +++ b/plugins/explore-common/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/plugin-explore-common +## 0.0.2 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + ## 0.0.2-next.0 ### Patch Changes diff --git a/plugins/explore-common/package.json b/plugins/explore-common/package.json index d2b23ec0ad..c71f888ad9 100644 --- a/plugins/explore-common/package.json +++ b/plugins/explore-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-explore-common", "description": "Common functionalities for the explore plugin", - "version": "0.0.2-next.0", + "version": "0.0.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore-react/CHANGELOG.md b/plugins/explore-react/CHANGELOG.md index b2bcc61d0f..708876c580 100644 --- a/plugins/explore-react/CHANGELOG.md +++ b/plugins/explore-react/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-explore-react +## 0.0.31 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-explore-common@0.0.2 + ## 0.0.31-next.3 ### Patch Changes diff --git a/plugins/explore-react/package.json b/plugins/explore-react/package.json index acdcd0bb2f..09edad02d9 100644 --- a/plugins/explore-react/package.json +++ b/plugins/explore-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-explore-react", "description": "A frontend library for Backstage plugins that want to interact with the explore plugin", - "version": "0.0.31-next.3", + "version": "0.0.31", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore/CHANGELOG.md b/plugins/explore/CHANGELOG.md index 8b319fb338..5ddd9c74ad 100644 --- a/plugins/explore/CHANGELOG.md +++ b/plugins/explore/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-explore +## 0.4.10 + +### Patch Changes + +- 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-explore-common@0.0.2 + - @backstage/plugin-explore-react@0.0.31 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/theme@0.4.2 + ## 0.4.10-next.3 ### Patch Changes diff --git a/plugins/explore/package.json b/plugins/explore/package.json index e2ba7b5d58..1ac3ab6393 100644 --- a/plugins/explore/package.json +++ b/plugins/explore/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-explore", "description": "A Backstage plugin for building an exploration page of your software ecosystem", - "version": "0.4.10-next.3", + "version": "0.4.10", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/firehydrant/CHANGELOG.md b/plugins/firehydrant/CHANGELOG.md index c57d3e257f..2e5fd2ac0f 100644 --- a/plugins/firehydrant/CHANGELOG.md +++ b/plugins/firehydrant/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-firehydrant +## 0.2.8 + +### 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/theme@0.4.2 + ## 0.2.8-next.3 ### Patch Changes diff --git a/plugins/firehydrant/package.json b/plugins/firehydrant/package.json index 1e702ed189..f94732dd23 100644 --- a/plugins/firehydrant/package.json +++ b/plugins/firehydrant/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-firehydrant", "description": "A Backstage plugin that integrates towards FireHydrant", - "version": "0.2.8-next.3", + "version": "0.2.8", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/fossa/CHANGELOG.md b/plugins/fossa/CHANGELOG.md index 3c9833a372..70330dd55a 100644 --- a/plugins/fossa/CHANGELOG.md +++ b/plugins/fossa/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-fossa +## 0.2.56 + +### 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/theme@0.4.2 + ## 0.2.56-next.3 ### Patch Changes diff --git a/plugins/fossa/package.json b/plugins/fossa/package.json index 90886af535..b2eba4ece9 100644 --- a/plugins/fossa/package.json +++ b/plugins/fossa/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-fossa", "description": "A Backstage plugin that integrates towards FOSSA", - "version": "0.2.56-next.3", + "version": "0.2.56", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gcalendar/CHANGELOG.md b/plugins/gcalendar/CHANGELOG.md index e0d08218cc..7eaeed8bf6 100644 --- a/plugins/gcalendar/CHANGELOG.md +++ b/plugins/gcalendar/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-gcalendar +## 0.3.18 + +### 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 +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + ## 0.3.18-next.3 ### Patch Changes diff --git a/plugins/gcalendar/package.json b/plugins/gcalendar/package.json index 48f192f97a..c94f635e30 100644 --- a/plugins/gcalendar/package.json +++ b/plugins/gcalendar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-gcalendar", - "version": "0.3.18-next.3", + "version": "0.3.18", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gcp-projects/CHANGELOG.md b/plugins/gcp-projects/CHANGELOG.md index ddcc3fb1e9..d79cc5cbef 100644 --- a/plugins/gcp-projects/CHANGELOG.md +++ b/plugins/gcp-projects/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-gcp-projects +## 0.3.41 + +### 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/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.3.41-next.3 ### Patch Changes diff --git a/plugins/gcp-projects/package.json b/plugins/gcp-projects/package.json index 037629d6a3..3f26a0eeab 100644 --- a/plugins/gcp-projects/package.json +++ b/plugins/gcp-projects/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-gcp-projects", "description": "A Backstage plugin that helps you manage projects in GCP", - "version": "0.3.41-next.3", + "version": "0.3.41", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/git-release-manager/CHANGELOG.md b/plugins/git-release-manager/CHANGELOG.md index 9b66828756..0d2ce7cd6b 100644 --- a/plugins/git-release-manager/CHANGELOG.md +++ b/plugins/git-release-manager/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-git-release-manager +## 0.3.37 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/integration@1.7.0 + - @backstage/theme@0.4.2 + ## 0.3.37-next.3 ### Patch Changes diff --git a/plugins/git-release-manager/package.json b/plugins/git-release-manager/package.json index 04fc26ae9a..1085649e35 100644 --- a/plugins/git-release-manager/package.json +++ b/plugins/git-release-manager/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-git-release-manager", "description": "A Backstage plugin that helps you manage releases in git", - "version": "0.3.37-next.3", + "version": "0.3.37", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-actions/CHANGELOG.md b/plugins/github-actions/CHANGELOG.md index 6b50884135..e1ba36001e 100644 --- a/plugins/github-actions/CHANGELOG.md +++ b/plugins/github-actions/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-github-actions +## 0.6.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/integration-react@1.1.19 + - @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/integration@1.7.0 + - @backstage/theme@0.4.2 + ## 0.6.5-next.3 ### Patch Changes diff --git a/plugins/github-actions/package.json b/plugins/github-actions/package.json index e2dafae029..26e6f45211 100644 --- a/plugins/github-actions/package.json +++ b/plugins/github-actions/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-actions", "description": "A Backstage plugin that integrates towards GitHub Actions", - "version": "0.6.5-next.3", + "version": "0.6.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-deployments/CHANGELOG.md b/plugins/github-deployments/CHANGELOG.md index 28cfc5a7b0..949f6c6f7c 100644 --- a/plugins/github-deployments/CHANGELOG.md +++ b/plugins/github-deployments/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-github-deployments +## 0.1.55 + +### 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/integration-react@1.1.19 + - @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/integration@1.7.0 + - @backstage/theme@0.4.2 + ## 0.1.55-next.3 ### Patch Changes diff --git a/plugins/github-deployments/package.json b/plugins/github-deployments/package.json index 6ee68a87c7..564b20a948 100644 --- a/plugins/github-deployments/package.json +++ b/plugins/github-deployments/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-deployments", "description": "A Backstage plugin that integrates towards GitHub Deployments", - "version": "0.1.55-next.3", + "version": "0.1.55", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-issues/CHANGELOG.md b/plugins/github-issues/CHANGELOG.md index 72a7c86175..f38c9ba630 100644 --- a/plugins/github-issues/CHANGELOG.md +++ b/plugins/github-issues/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-github-issues +## 0.2.13 + +### 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/integration@1.7.0 + - @backstage/theme@0.4.2 + ## 0.2.13-next.3 ### Patch Changes diff --git a/plugins/github-issues/package.json b/plugins/github-issues/package.json index ffd2b361dc..8cdded424c 100644 --- a/plugins/github-issues/package.json +++ b/plugins/github-issues/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-github-issues", - "version": "0.2.13-next.3", + "version": "0.2.13", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-pull-requests-board/CHANGELOG.md b/plugins/github-pull-requests-board/CHANGELOG.md index 8a50ab7e9c..239baaaa0b 100644 --- a/plugins/github-pull-requests-board/CHANGELOG.md +++ b/plugins/github-pull-requests-board/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-github-pull-requests-board +## 0.1.18 + +### 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/integration@1.7.0 + - @backstage/theme@0.4.2 + ## 0.1.18-next.3 ### Patch Changes diff --git a/plugins/github-pull-requests-board/package.json b/plugins/github-pull-requests-board/package.json index a7a398abf5..96cea6bd3a 100644 --- a/plugins/github-pull-requests-board/package.json +++ b/plugins/github-pull-requests-board/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-pull-requests-board", "description": "A Backstage plugin that allows you to see all open Pull Requests for all the repositories owned by your team", - "version": "0.1.18-next.3", + "version": "0.1.18", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gitops-profiles/CHANGELOG.md b/plugins/gitops-profiles/CHANGELOG.md index 357cf5e6d7..acd81f3af2 100644 --- a/plugins/gitops-profiles/CHANGELOG.md +++ b/plugins/gitops-profiles/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-gitops-profiles +## 0.3.40 + +### 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/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.3.40-next.3 ### Patch Changes diff --git a/plugins/gitops-profiles/package.json b/plugins/gitops-profiles/package.json index 032e6d1fcf..db187a7964 100644 --- a/plugins/gitops-profiles/package.json +++ b/plugins/gitops-profiles/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-gitops-profiles", "description": "A Backstage plugin that helps you manage GitOps profiles", - "version": "0.3.40-next.3", + "version": "0.3.40", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gocd/CHANGELOG.md b/plugins/gocd/CHANGELOG.md index 4d605314fc..c25eca242d 100644 --- a/plugins/gocd/CHANGELOG.md +++ b/plugins/gocd/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-gocd +## 0.1.30 + +### Patch Changes + +- 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/theme@0.4.2 + ## 0.1.30-next.3 ### Patch Changes diff --git a/plugins/gocd/package.json b/plugins/gocd/package.json index 1bb5c1dc81..4d195ffa31 100644 --- a/plugins/gocd/package.json +++ b/plugins/gocd/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-gocd", "description": "A Backstage plugin that integrates towards GoCD", - "version": "0.1.30-next.3", + "version": "0.1.30", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/graphiql/CHANGELOG.md b/plugins/graphiql/CHANGELOG.md index 078a291d24..c03f2e3c8f 100644 --- a/plugins/graphiql/CHANGELOG.md +++ b/plugins/graphiql/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-graphiql +## 0.2.54 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- b2fbeed5403b: Add support for using the FetchApi +- cf950c3b6eab: Added experimental exports for the new frontend system under `/alpha`. +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/frontend-plugin-api@0.1.0 + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.2.54-next.3 ### Patch Changes diff --git a/plugins/graphiql/package.json b/plugins/graphiql/package.json index 29b8163c7b..100e14e7d0 100644 --- a/plugins/graphiql/package.json +++ b/plugins/graphiql/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphiql", "description": "Backstage plugin for browsing GraphQL APIs", - "version": "0.2.54-next.3", + "version": "0.2.54", "publishConfig": { "access": "public" }, diff --git a/plugins/graphql-backend/CHANGELOG.md b/plugins/graphql-backend/CHANGELOG.md index 1a62048007..36d30d831f 100644 --- a/plugins/graphql-backend/CHANGELOG.md +++ b/plugins/graphql-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-graphql-backend +## 0.1.41 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-catalog-graphql@0.3.23 + ## 0.1.41-next.3 ### Patch Changes diff --git a/plugins/graphql-backend/package.json b/plugins/graphql-backend/package.json index 7582c150cb..d6316d3599 100644 --- a/plugins/graphql-backend/package.json +++ b/plugins/graphql-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphql-backend", "description": "An experimental Backstage backend plugin for GraphQL", - "version": "0.1.41-next.3", + "version": "0.1.41", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/graphql-voyager/CHANGELOG.md b/plugins/graphql-voyager/CHANGELOG.md index f08159c76d..d521429402 100644 --- a/plugins/graphql-voyager/CHANGELOG.md +++ b/plugins/graphql-voyager/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-graphql-voyager +## 0.1.7 + +### 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/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.1.7-next.3 ### Patch Changes diff --git a/plugins/graphql-voyager/package.json b/plugins/graphql-voyager/package.json index df62a7e9a2..62d4e7be23 100644 --- a/plugins/graphql-voyager/package.json +++ b/plugins/graphql-voyager/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphql-voyager", "description": "Backstage plugin for GraphQL Voyager", - "version": "0.1.7-next.3", + "version": "0.1.7", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/home-react/CHANGELOG.md b/plugins/home-react/CHANGELOG.md index ebd48bd7ef..c3dd8aefe6 100644 --- a/plugins/home-react/CHANGELOG.md +++ b/plugins/home-react/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-home-react +## 0.1.3 + +### 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 +- b16c341ced45: Updated dependency `@rjsf/utils` to `5.13.0`. + Updated dependency `@rjsf/core-v5` to `npm:@rjsf/core@5.13.0`. + Updated dependency `@rjsf/material-ui-v5` to `npm:@rjsf/material-ui@5.13.0`. + Updated dependency `@rjsf/validator-ajv8` to `5.13.0`. +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + ## 0.1.3-next.3 ### Patch Changes diff --git a/plugins/home-react/package.json b/plugins/home-react/package.json index 792e4f8ebe..9c7e3bf1db 100644 --- a/plugins/home-react/package.json +++ b/plugins/home-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-home-react", "description": "A Backstage plugin that contains react components helps you build a home page", - "version": "0.1.3-next.3", + "version": "0.1.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/home/CHANGELOG.md b/plugins/home/CHANGELOG.md index 41c1271790..841e9ea121 100644 --- a/plugins/home/CHANGELOG.md +++ b/plugins/home/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-home +## 0.5.8 + +### Patch Changes + +- 2bc96ce69eea: Fixed a bug where customizable home page cards would render missing their normal borders. +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 98bb77c1f0b8: Align zod dependency to align with other packages. +- 8cec7664e146: Removed `@types/node` dependency +- b16c341ced45: Updated dependency `@rjsf/utils` to `5.13.0`. + Updated dependency `@rjsf/core-v5` to `npm:@rjsf/core@5.13.0`. + Updated dependency `@rjsf/material-ui-v5` to `npm:@rjsf/material-ui@5.13.0`. + Updated dependency `@rjsf/validator-ajv8` to `5.13.0`. +- 1853ffa09b50: Allow specifying static widgets to custom home page +- Updated dependencies + - @backstage/plugin-home-react@0.1.3 + - @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.5.8-next.3 ### Patch Changes diff --git a/plugins/home/package.json b/plugins/home/package.json index e403bf7328..1f4fa90148 100644 --- a/plugins/home/package.json +++ b/plugins/home/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-home", "description": "A Backstage plugin that helps you build a home page", - "version": "0.5.8-next.3", + "version": "0.5.8", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/ilert/CHANGELOG.md b/plugins/ilert/CHANGELOG.md index 7d11440f8a..45fe31099a 100644 --- a/plugins/ilert/CHANGELOG.md +++ b/plugins/ilert/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-ilert +## 0.2.13 + +### 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 +- 814feeed7343: Update to handle invalid luxon values +- 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/theme@0.4.2 + ## 0.2.13-next.3 ### Patch Changes diff --git a/plugins/ilert/package.json b/plugins/ilert/package.json index 255b2ca27d..34af0e4a5a 100644 --- a/plugins/ilert/package.json +++ b/plugins/ilert/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-ilert", "description": "A Backstage plugin that integrates towards iLert", - "version": "0.2.13-next.3", + "version": "0.2.13", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/jenkins-backend/CHANGELOG.md b/plugins/jenkins-backend/CHANGELOG.md index 676101785f..f1ded9df99 100644 --- a/plugins/jenkins-backend/CHANGELOG.md +++ b/plugins/jenkins-backend/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-jenkins-backend +## 0.2.6 + +### Patch Changes + +- Updated dependencies + - @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-jenkins-common@0.1.19 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.14 + ## 0.2.6-next.3 ### Patch Changes diff --git a/plugins/jenkins-backend/package.json b/plugins/jenkins-backend/package.json index 1844f0a38d..542907781e 100644 --- a/plugins/jenkins-backend/package.json +++ b/plugins/jenkins-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-jenkins-backend", "description": "A Backstage backend plugin that integrates towards Jenkins", - "version": "0.2.6-next.3", + "version": "0.2.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/jenkins-common/CHANGELOG.md b/plugins/jenkins-common/CHANGELOG.md index 39a9bb51a3..4fa915f473 100644 --- a/plugins/jenkins-common/CHANGELOG.md +++ b/plugins/jenkins-common/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-jenkins-common +## 0.1.19 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + ## 0.1.19-next.2 ### Patch Changes diff --git a/plugins/jenkins-common/package.json b/plugins/jenkins-common/package.json index fbbbcdaa15..4bf522dadd 100644 --- a/plugins/jenkins-common/package.json +++ b/plugins/jenkins-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-jenkins-common", - "version": "0.1.19-next.2", + "version": "0.1.19", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/jenkins/CHANGELOG.md b/plugins/jenkins/CHANGELOG.md index 8d1e20b61b..a43b0f7031 100644 --- a/plugins/jenkins/CHANGELOG.md +++ b/plugins/jenkins/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-jenkins +## 0.8.6 + +### 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-jenkins-common@0.1.19 + - @backstage/theme@0.4.2 + ## 0.8.6-next.3 ### Patch Changes diff --git a/plugins/jenkins/package.json b/plugins/jenkins/package.json index 4cebda493e..b936aa80b3 100644 --- a/plugins/jenkins/package.json +++ b/plugins/jenkins/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-jenkins", "description": "A Backstage plugin that integrates towards Jenkins", - "version": "0.8.6-next.3", + "version": "0.8.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kafka-backend/CHANGELOG.md b/plugins/kafka-backend/CHANGELOG.md index 84c206fd0c..63abf0bcc5 100644 --- a/plugins/kafka-backend/CHANGELOG.md +++ b/plugins/kafka-backend/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-kafka-backend +## 0.3.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 + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/backend-plugin-api@0.6.3 + ## 0.3.0-next.3 ### Minor Changes diff --git a/plugins/kafka-backend/package.json b/plugins/kafka-backend/package.json index 801e4bdc95..a27f72fc9a 100644 --- a/plugins/kafka-backend/package.json +++ b/plugins/kafka-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kafka-backend", "description": "A Backstage backend plugin that integrates towards Kafka", - "version": "0.3.0-next.3", + "version": "0.3.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kafka/CHANGELOG.md b/plugins/kafka/CHANGELOG.md index 0d7035392b..b4acb676c3 100644 --- a/plugins/kafka/CHANGELOG.md +++ b/plugins/kafka/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-kafka +## 0.3.24 + +### 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.3.24-next.3 ### Patch Changes diff --git a/plugins/kafka/package.json b/plugins/kafka/package.json index 3da6d27e17..ae8e602ce5 100644 --- a/plugins/kafka/package.json +++ b/plugins/kafka/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kafka", "description": "A Backstage plugin that integrates towards Kafka", - "version": "0.3.24-next.3", + "version": "0.3.24", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kubernetes-backend/CHANGELOG.md b/plugins/kubernetes-backend/CHANGELOG.md index 043ffd5bb3..1c473ea18d 100644 --- a/plugins/kubernetes-backend/CHANGELOG.md +++ b/plugins/kubernetes-backend/CHANGELOG.md @@ -1,5 +1,51 @@ # @backstage/plugin-kubernetes-backend +## 0.12.0 + +### Minor Changes + +- 0ad36158d980: Integrators can now bring their own auth strategies through the use of the `addAuthStrategy` method on `KubernetesBuilder`. + + **BREAKING** on the slight chance you were using the `setAuthTranslatorMap` method on `KubernetesBuilder`, it has been removed along with the entire `KubernetesAuthTranslator` interface. This notion has been replaced with the more focused concept of an `AuthenticationStrategy`. Converting a translator to a strategy should not be especially difficult. + +### Patch Changes + +- ccf00accb408: Add AWS Annotations to Kubernetes Cluster Resource +- 72390ab2670d: Handle Proxy WS upgrade manually for WS handshakes +- 71114ac50e02: 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')); + ``` + +- 024b2b66a332: Fixed a bug where requests to the proxy endpoint would fail for clusters with `caFile` configured +- a8a614ba0d07: Minor `package.json` update. +- 47ea122590f5: fix "undefined" kind for custom resources +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.6.6 + - @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-permission-common@0.7.8 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/integration-aws-node@0.1.6 + ## 0.11.6-next.3 ### Patch Changes diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index 17da706d66..dce7b512fd 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes-backend", "description": "A Backstage backend plugin that integrates towards Kubernetes", - "version": "0.11.6-next.3", + "version": "0.12.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kubernetes-common/CHANGELOG.md b/plugins/kubernetes-common/CHANGELOG.md index 7604edfb12..83451a1999 100644 --- a/plugins/kubernetes-common/CHANGELOG.md +++ b/plugins/kubernetes-common/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-kubernetes-common +## 0.6.6 + +### Patch Changes + +- 0ad36158d980: Loosened the type of the `auth` field in the body of requests to the `retrieveObjectsByServiceId` endpoint. Now any JSON object is allowed, which should make it easier for integrators to write their own custom auth strategies for Kubernetes. +- ccf00accb408: Add AWS Annotations to Kubernetes Cluster Resource +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-permission-common@0.7.8 + ## 0.6.6-next.2 ### Patch Changes diff --git a/plugins/kubernetes-common/package.json b/plugins/kubernetes-common/package.json index dce023dc2d..b563cbff4e 100644 --- a/plugins/kubernetes-common/package.json +++ b/plugins/kubernetes-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes-common", "description": "Common functionalities for kubernetes, to be shared between kubernetes and kubernetes-backend plugin", - "version": "0.6.6-next.2", + "version": "0.6.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kubernetes/CHANGELOG.md b/plugins/kubernetes/CHANGELOG.md index 94b59bb6b3..3bc309c060 100644 --- a/plugins/kubernetes/CHANGELOG.md +++ b/plugins/kubernetes/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-kubernetes +## 0.10.3 + +### Patch Changes + +- 0ad36158d980: Loosened the type of the `auth` field in the body of requests to the `retrieveObjectsByServiceId` endpoint. Now any JSON object is allowed, which should make it easier for integrators to write their own custom auth strategies for Kubernetes. +- 7032c214f3b4: Add pod exec terminal to Container Card +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 6ddeade58b4c: Avoid eager use of `TextEncoder` in order not to break tests. +- 6a5e04e20e6e: fix logs dialog min height +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.6.6 + - @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/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + ## 0.10.3-next.3 ### Patch Changes diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index 4bd55d65a3..80498b5b69 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes", "description": "A Backstage plugin that integrates towards Kubernetes", - "version": "0.10.3-next.3", + "version": "0.10.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/lighthouse-backend/CHANGELOG.md b/plugins/lighthouse-backend/CHANGELOG.md index 96a47eaa53..209ca47094 100644 --- a/plugins/lighthouse-backend/CHANGELOG.md +++ b/plugins/lighthouse-backend/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/plugin-lighthouse-backend +## 0.3.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 + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-lighthouse-common@0.1.3 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + ## 0.3.0-next.3 ### Minor Changes diff --git a/plugins/lighthouse-backend/package.json b/plugins/lighthouse-backend/package.json index dbea5afd41..555f3e2819 100644 --- a/plugins/lighthouse-backend/package.json +++ b/plugins/lighthouse-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-lighthouse-backend", "description": "Backend functionalities for lighthouse", - "version": "0.3.0-next.3", + "version": "0.3.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/lighthouse-common/CHANGELOG.md b/plugins/lighthouse-common/CHANGELOG.md index 8c800bec23..ddeffb94b3 100644 --- a/plugins/lighthouse-common/CHANGELOG.md +++ b/plugins/lighthouse-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-lighthouse-common +## 0.1.3 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/config@1.1.0 + ## 0.1.3-next.2 ### Patch Changes diff --git a/plugins/lighthouse-common/package.json b/plugins/lighthouse-common/package.json index e58e2bea17..086ee6cccd 100644 --- a/plugins/lighthouse-common/package.json +++ b/plugins/lighthouse-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-lighthouse-common", "description": "Common functionalities for lighthouse, to be shared between lighthouse and lighthouse-backend plugin", - "version": "0.1.3-next.2", + "version": "0.1.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/lighthouse/CHANGELOG.md b/plugins/lighthouse/CHANGELOG.md index fabd108fa5..56882e2a45 100644 --- a/plugins/lighthouse/CHANGELOG.md +++ b/plugins/lighthouse/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-lighthouse +## 0.4.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/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-lighthouse-common@0.1.3 + - @backstage/theme@0.4.2 + ## 0.4.9-next.3 ### Patch Changes diff --git a/plugins/lighthouse/package.json b/plugins/lighthouse/package.json index 2f8b79291c..3e62644212 100644 --- a/plugins/lighthouse/package.json +++ b/plugins/lighthouse/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-lighthouse", "description": "A Backstage plugin that integrates towards Lighthouse", - "version": "0.4.9-next.3", + "version": "0.4.9", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/linguist-backend/CHANGELOG.md b/plugins/linguist-backend/CHANGELOG.md index aabef8ecaf..10bfface1c 100644 --- a/plugins/linguist-backend/CHANGELOG.md +++ b/plugins/linguist-backend/CHANGELOG.md @@ -1,5 +1,42 @@ # @backstage/plugin-linguist-backend +## 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 diff --git a/plugins/linguist-backend/package.json b/plugins/linguist-backend/package.json index 9c2f4dcb5c..d2c63c7f44 100644 --- a/plugins/linguist-backend/package.json +++ b/plugins/linguist-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-linguist-backend", - "version": "0.5.0-next.3", + "version": "0.5.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/linguist-common/CHANGELOG.md b/plugins/linguist-common/CHANGELOG.md index 5e4e40142f..c9eb3c0c28 100644 --- a/plugins/linguist-common/CHANGELOG.md +++ b/plugins/linguist-common/CHANGELOG.md @@ -1,5 +1,11 @@ # @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 diff --git a/plugins/linguist-common/package.json b/plugins/linguist-common/package.json index a595fc2cd5..ff2e78affd 100644 --- a/plugins/linguist-common/package.json +++ b/plugins/linguist-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-linguist-common", "description": "Common functionalities for the linguist plugin", - "version": "0.1.2-next.0", + "version": "0.1.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/linguist/CHANGELOG.md b/plugins/linguist/CHANGELOG.md index 6223f36093..6b0b23a4bb 100644 --- a/plugins/linguist/CHANGELOG.md +++ b/plugins/linguist/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-linguist +## 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 diff --git a/plugins/linguist/package.json b/plugins/linguist/package.json index 2c399b5b71..ecae75cddf 100644 --- a/plugins/linguist/package.json +++ b/plugins/linguist/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-linguist", - "version": "0.1.9-next.3", + "version": "0.1.9", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/microsoft-calendar/CHANGELOG.md b/plugins/microsoft-calendar/CHANGELOG.md index 3adb362d71..7c88ec2087 100644 --- a/plugins/microsoft-calendar/CHANGELOG.md +++ b/plugins/microsoft-calendar/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-microsoft-calendar +## 0.1.7 + +### 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 +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + ## 0.1.7-next.3 ### Patch Changes diff --git a/plugins/microsoft-calendar/package.json b/plugins/microsoft-calendar/package.json index d4573f1e40..8ffe31e790 100644 --- a/plugins/microsoft-calendar/package.json +++ b/plugins/microsoft-calendar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-microsoft-calendar", - "version": "0.1.7-next.3", + "version": "0.1.7", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/newrelic-dashboard/CHANGELOG.md b/plugins/newrelic-dashboard/CHANGELOG.md index dd9b498111..6a6ad77acf 100644 --- a/plugins/newrelic-dashboard/CHANGELOG.md +++ b/plugins/newrelic-dashboard/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-newrelic-dashboard +## 0.2.17 + +### 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. +- 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 + ## 0.2.17-next.3 ### Patch Changes diff --git a/plugins/newrelic-dashboard/package.json b/plugins/newrelic-dashboard/package.json index 4bc7941cf3..42db37738a 100644 --- a/plugins/newrelic-dashboard/package.json +++ b/plugins/newrelic-dashboard/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-newrelic-dashboard", - "version": "0.2.17-next.3", + "version": "0.2.17", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/newrelic/CHANGELOG.md b/plugins/newrelic/CHANGELOG.md index be956aa02c..dc69d20143 100644 --- a/plugins/newrelic/CHANGELOG.md +++ b/plugins/newrelic/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-newrelic +## 0.3.40 + +### 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. +- 55cb7061e072: Fixed bug in NewRelicComponent component where table would not sort correctly for numerical values. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.3.40-next.3 ### Patch Changes diff --git a/plugins/newrelic/package.json b/plugins/newrelic/package.json index 86900596a4..5629a10f86 100644 --- a/plugins/newrelic/package.json +++ b/plugins/newrelic/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-newrelic", "description": "A Backstage plugin that integrates towards New Relic", - "version": "0.3.40-next.3", + "version": "0.3.40", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/nomad-backend/CHANGELOG.md b/plugins/nomad-backend/CHANGELOG.md index 48aa8fc484..9ff5e392fc 100644 --- a/plugins/nomad-backend/CHANGELOG.md +++ b/plugins/nomad-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-nomad-backend +## 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 diff --git a/plugins/nomad-backend/package.json b/plugins/nomad-backend/package.json index bd6af719f6..24ffd9eeff 100644 --- a/plugins/nomad-backend/package.json +++ b/plugins/nomad-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-nomad-backend", - "version": "0.1.5-next.3", + "version": "0.1.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/nomad/CHANGELOG.md b/plugins/nomad/CHANGELOG.md index 7645656f84..8f3d96519a 100644 --- a/plugins/nomad/CHANGELOG.md +++ b/plugins/nomad/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-nomad +## 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 diff --git a/plugins/nomad/package.json b/plugins/nomad/package.json index 874b3dfe19..80971f5b6c 100644 --- a/plugins/nomad/package.json +++ b/plugins/nomad/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-nomad", - "version": "0.1.5-next.3", + "version": "0.1.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/octopus-deploy/CHANGELOG.md b/plugins/octopus-deploy/CHANGELOG.md index 24a5db96d8..29b46afc14 100644 --- a/plugins/octopus-deploy/CHANGELOG.md +++ b/plugins/octopus-deploy/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-octopus-deploy +## 0.2.6 + +### 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/theme@0.4.2 + ## 0.2.6-next.3 ### Patch Changes diff --git a/plugins/octopus-deploy/package.json b/plugins/octopus-deploy/package.json index 20cbd4e5a2..608f9d5ace 100644 --- a/plugins/octopus-deploy/package.json +++ b/plugins/octopus-deploy/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-octopus-deploy", - "version": "0.2.6-next.3", + "version": "0.2.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/opencost/CHANGELOG.md b/plugins/opencost/CHANGELOG.md index 95b73bfba1..ca4b9a990a 100644 --- a/plugins/opencost/CHANGELOG.md +++ b/plugins/opencost/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-opencost +## 0.2.0 + +### Minor Changes + +- 1380a689ab56: New OpenCost plugin provides an port of the latest OpenCost UI to Backstage with updated dependencies. The plugin's README covers installation and configuration + +### 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. +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.2.0-next.3 ### Patch Changes diff --git a/plugins/opencost/package.json b/plugins/opencost/package.json index a446e44e93..9db26eeb58 100644 --- a/plugins/opencost/package.json +++ b/plugins/opencost/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-opencost", - "version": "0.2.0-next.3", + "version": "0.2.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/org-react/CHANGELOG.md b/plugins/org-react/CHANGELOG.md index ec5e0e3129..fa32f33f00 100644 --- a/plugins/org-react/CHANGELOG.md +++ b/plugins/org-react/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-org-react +## 0.1.13 + +### 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-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.1.13-next.3 ### Patch Changes diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json index 280e27cff6..eecdd4fa6c 100644 --- a/plugins/org-react/package.json +++ b/plugins/org-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-org-react", - "version": "0.1.13-next.3", + "version": "0.1.13", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/org/CHANGELOG.md b/plugins/org/CHANGELOG.md index d999f54da1..df02adcdfd 100644 --- a/plugins/org/CHANGELOG.md +++ b/plugins/org/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-org +## 0.6.14 + +### 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. +- 43a2137bb829: Ensure direct relations are shown for User entities while keeping support for aggregating closest parent group ownership +- dd9329caea1c: Entity relations toggle should by default be aggregated for User entities +- 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/theme@0.4.2 + ## 0.6.14-next.3 ### Patch Changes diff --git a/plugins/org/package.json b/plugins/org/package.json index 5e6aace0fc..e0483b6e64 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-org", "description": "A Backstage plugin that helps you create entity pages for your organization", - "version": "0.6.14-next.3", + "version": "0.6.14", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/pagerduty/CHANGELOG.md b/plugins/pagerduty/CHANGELOG.md index 2c20696fcd..ad47a35b37 100644 --- a/plugins/pagerduty/CHANGELOG.md +++ b/plugins/pagerduty/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-pagerduty +## 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 diff --git a/plugins/pagerduty/package.json b/plugins/pagerduty/package.json index 8750e6e2cc..3551ab55ec 100644 --- a/plugins/pagerduty/package.json +++ b/plugins/pagerduty/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-pagerduty", "description": "A Backstage plugin that integrates towards PagerDuty", - "version": "0.6.5-next.3", + "version": "0.6.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/periskop-backend/CHANGELOG.md b/plugins/periskop-backend/CHANGELOG.md index 9b529d350f..79abda94c5 100644 --- a/plugins/periskop-backend/CHANGELOG.md +++ b/plugins/periskop-backend/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-periskop-backend +## 0.2.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 + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + ## 0.2.0-next.3 ### Minor Changes diff --git a/plugins/periskop-backend/package.json b/plugins/periskop-backend/package.json index a2b791ac67..2d08441b02 100644 --- a/plugins/periskop-backend/package.json +++ b/plugins/periskop-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-periskop-backend", - "version": "0.2.0-next.3", + "version": "0.2.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/periskop/CHANGELOG.md b/plugins/periskop/CHANGELOG.md index 7c4b436b2c..98dd5ff8d9 100644 --- a/plugins/periskop/CHANGELOG.md +++ b/plugins/periskop/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-periskop +## 0.1.22 + +### 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/theme@0.4.2 + ## 0.1.22-next.3 ### Patch Changes diff --git a/plugins/periskop/package.json b/plugins/periskop/package.json index 031d909c19..3d4a8976a8 100644 --- a/plugins/periskop/package.json +++ b/plugins/periskop/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-periskop", - "version": "0.1.22-next.3", + "version": "0.1.22", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md b/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md index 4718e4a2f5..64a3619daa 100644 --- a/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md +++ b/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md @@ -1,5 +1,36 @@ # @backstage/plugin-permission-backend-module-allow-all-policy +## 0.1.0 + +### Minor Changes + +- 5f7b2153526b: Created package with policy `permissionModuleAllowAllPolicy` + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + ## 0.1.0-next.1 ### Patch Changes diff --git a/plugins/permission-backend-module-policy-allow-all/package.json b/plugins/permission-backend-module-policy-allow-all/package.json index 8e31a61d03..c2f8488369 100644 --- a/plugins/permission-backend-module-policy-allow-all/package.json +++ b/plugins/permission-backend-module-policy-allow-all/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-permission-backend-module-allow-all-policy", "description": "Allow all policy backend module for the permission plugin.", - "version": "0.1.0-next.1", + "version": "0.1.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/permission-backend/CHANGELOG.md b/plugins/permission-backend/CHANGELOG.md index 9e0965aa9a..b85d177879 100644 --- a/plugins/permission-backend/CHANGELOG.md +++ b/plugins/permission-backend/CHANGELOG.md @@ -1,5 +1,36 @@ # @backstage/plugin-permission-backend +## 0.5.26 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- a8a614ba0d07: Minor `package.json` update. +- 84ad6fccd4d5: Moved `permissionModuleAllowAllPolicy` to `@backstage/plugin-permission-backend-module-allow-all-policy` +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + ## 0.5.26-next.3 ### Patch Changes diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json index 6022d0ccc0..184e782782 100644 --- a/plugins/permission-backend/package.json +++ b/plugins/permission-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-backend", - "version": "0.5.26-next.3", + "version": "0.5.26", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/permission-common/CHANGELOG.md b/plugins/permission-common/CHANGELOG.md index 97a3886f11..f39e4455ec 100644 --- a/plugins/permission-common/CHANGELOG.md +++ b/plugins/permission-common/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-permission-common +## 0.7.8 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + ## 0.7.8-next.2 ### Patch Changes diff --git a/plugins/permission-common/package.json b/plugins/permission-common/package.json index 9c7e6765cf..050b696aef 100644 --- a/plugins/permission-common/package.json +++ b/plugins/permission-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-permission-common", "description": "Isomorphic types and client for Backstage permissions and authorization", - "version": "0.7.8-next.2", + "version": "0.7.8", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/plugins/permission-node/CHANGELOG.md b/plugins/permission-node/CHANGELOG.md index 7f05726d36..5bdb0edf7b 100644 --- a/plugins/permission-node/CHANGELOG.md +++ b/plugins/permission-node/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-permission-node +## 0.7.14 + +### Patch Changes + +- a8a614ba0d07: Minor `package.json` update. +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/backend-plugin-api@0.6.3 + ## 0.7.14-next.3 ### Patch Changes diff --git a/plugins/permission-node/package.json b/plugins/permission-node/package.json index b1c6513408..c90d011332 100644 --- a/plugins/permission-node/package.json +++ b/plugins/permission-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-permission-node", "description": "Common permission and authorization utilities for backend plugins", - "version": "0.7.14-next.3", + "version": "0.7.14", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/permission-react/CHANGELOG.md b/plugins/permission-react/CHANGELOG.md index 0894567cbf..45bb4dc7d9 100644 --- a/plugins/permission-react/CHANGELOG.md +++ b/plugins/permission-react/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-permission-react +## 0.4.15 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-permission-common@0.7.8 + ## 0.4.15-next.3 ### Patch Changes diff --git a/plugins/permission-react/package.json b/plugins/permission-react/package.json index b2bbe3fe37..267cf89f5f 100644 --- a/plugins/permission-react/package.json +++ b/plugins/permission-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-react", - "version": "0.4.15-next.3", + "version": "0.4.15", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/playlist-backend/CHANGELOG.md b/plugins/playlist-backend/CHANGELOG.md index 247f0fe628..7d957d259a 100644 --- a/plugins/playlist-backend/CHANGELOG.md +++ b/plugins/playlist-backend/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-playlist-backend +## 0.3.7 + +### Patch Changes + +- Updated dependencies + - @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-permission-common@0.7.8 + - @backstage/plugin-playlist-common@0.1.10 + - @backstage/plugin-permission-node@0.7.14 + ## 0.3.7-next.3 ### Patch Changes diff --git a/plugins/playlist-backend/package.json b/plugins/playlist-backend/package.json index 53a3bff88a..78a1fa5e69 100644 --- a/plugins/playlist-backend/package.json +++ b/plugins/playlist-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-playlist-backend", - "version": "0.3.7-next.3", + "version": "0.3.7", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/playlist-common/CHANGELOG.md b/plugins/playlist-common/CHANGELOG.md index d4da347fd0..b6d6eb8990 100644 --- a/plugins/playlist-common/CHANGELOG.md +++ b/plugins/playlist-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-playlist-common +## 0.1.10 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/plugin-permission-common@0.7.8 + ## 0.1.10-next.2 ### Patch Changes diff --git a/plugins/playlist-common/package.json b/plugins/playlist-common/package.json index 4e0ac59ff2..f31094c5a6 100644 --- a/plugins/playlist-common/package.json +++ b/plugins/playlist-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-playlist-common", "description": "Common functionalities for the playlist plugin", - "version": "0.1.10-next.2", + "version": "0.1.10", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/playlist/CHANGELOG.md b/plugins/playlist/CHANGELOG.md index 3deb9cc5b5..f3ed681214 100644 --- a/plugins/playlist/CHANGELOG.md +++ b/plugins/playlist/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-playlist +## 0.1.16 + +### Patch Changes + +- 79847cb73ed7: Updated latest playlist screen in readme document +- ec4b0f8cd957: change color of delete icon to secondary in playlist table +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 2f3215bbbffe: Fix a bug that led to errors being thrown in guest mode +- 8cec7664e146: Removed `@types/node` dependency +- b5ba33a92750: Limit the use of the same playlist name when adding a playlist +- 3d63e60f3c36: Internal restructure to avoid circular imports +- fdbf215a8d8e: Fix the Ui style of the search bar +- 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-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/plugin-playlist-common@0.1.10 + - @backstage/plugin-search-react@1.7.0 + - @backstage/theme@0.4.2 + ## 0.1.16-next.3 ### Patch Changes diff --git a/plugins/playlist/package.json b/plugins/playlist/package.json index 9a97afcc5d..5613a61baa 100644 --- a/plugins/playlist/package.json +++ b/plugins/playlist/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-playlist", - "version": "0.1.16-next.3", + "version": "0.1.16", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/proxy-backend/CHANGELOG.md b/plugins/proxy-backend/CHANGELOG.md index 6aa151f5d2..81319f537b 100644 --- a/plugins/proxy-backend/CHANGELOG.md +++ b/plugins/proxy-backend/CHANGELOG.md @@ -1,5 +1,36 @@ # @backstage/plugin-proxy-backend +## 0.4.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 + +- 02ba0a2efd2a: Add the route name to an error message that appears when the backend + proxy wasn't well configured. This will help users to understand the + issue and fix the right configuration. +- 03691f0f3270: Add back the legacy proxy config, to get secret redaction +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + ## 0.4.0-next.3 ### Minor Changes diff --git a/plugins/proxy-backend/package.json b/plugins/proxy-backend/package.json index b87f8a343a..2b98ba54ab 100644 --- a/plugins/proxy-backend/package.json +++ b/plugins/proxy-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-proxy-backend", "description": "A Backstage backend plugin that helps you set up proxy endpoints in the backend", - "version": "0.4.0-next.3", + "version": "0.4.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/puppetdb/CHANGELOG.md b/plugins/puppetdb/CHANGELOG.md index e34820799c..1fc509b29c 100644 --- a/plugins/puppetdb/CHANGELOG.md +++ b/plugins/puppetdb/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-puppetdb +## 0.1.7 + +### 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/theme@0.4.2 + ## 0.1.7-next.3 ### Patch Changes diff --git a/plugins/puppetdb/package.json b/plugins/puppetdb/package.json index 260cfa73e5..73c8d5d88a 100644 --- a/plugins/puppetdb/package.json +++ b/plugins/puppetdb/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-puppetdb", "description": "Backstage plugin to visualize resource information and Puppet facts from PuppetDB.", - "version": "0.1.7-next.3", + "version": "0.1.7", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/rollbar-backend/CHANGELOG.md b/plugins/rollbar-backend/CHANGELOG.md index 0be471f56e..8f6eb0f67c 100644 --- a/plugins/rollbar-backend/CHANGELOG.md +++ b/plugins/rollbar-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-rollbar-backend +## 0.1.48 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + ## 0.1.48-next.3 ### Patch Changes diff --git a/plugins/rollbar-backend/package.json b/plugins/rollbar-backend/package.json index 0fd2a33e39..491dcd409c 100644 --- a/plugins/rollbar-backend/package.json +++ b/plugins/rollbar-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-rollbar-backend", "description": "A Backstage backend plugin that integrates towards Rollbar", - "version": "0.1.48-next.3", + "version": "0.1.48", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/rollbar/CHANGELOG.md b/plugins/rollbar/CHANGELOG.md index 2da143b6e0..77e2631e93 100644 --- a/plugins/rollbar/CHANGELOG.md +++ b/plugins/rollbar/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-rollbar +## 0.4.24 + +### 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/theme@0.4.2 + ## 0.4.24-next.3 ### Patch Changes diff --git a/plugins/rollbar/package.json b/plugins/rollbar/package.json index 644ef562a8..262b51abc0 100644 --- a/plugins/rollbar/package.json +++ b/plugins/rollbar/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-rollbar", "description": "A Backstage plugin that integrates towards Rollbar", - "version": "0.4.24-next.3", + "version": "0.4.24", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md index 45a597eb45..7ccbb5e286 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-scaffolder-backend-module-confluence-to-markdown +## 0.2.4 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-node@0.2.3 + ## 0.2.4-next.3 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json index 28961278d5..b1ce79bf1d 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown", "description": "The confluence-to-markdown module for @backstage/plugin-scaffolder-backend", - "version": "0.2.4-next.3", + "version": "0.2.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md index cf9d982eb4..5662119c27 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-scaffolder-backend-module-cookiecutter +## 0.2.27 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-node@0.2.3 + ## 0.2.27-next.3 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index 2b1239ed74..2d4be6aab4 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/package.json +++ b/plugins/scaffolder-backend-module-cookiecutter/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-cookiecutter", "description": "A module for the scaffolder backend that lets you template projects using cookiecutter", - "version": "0.2.27-next.3", + "version": "0.2.27", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md index 9afd01ea96..44c9337b17 100644 --- a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-gitlab +## 0.2.6 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-scaffolder-node@0.2.3 + ## 0.2.6-next.3 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gitlab/package.json b/plugins/scaffolder-backend-module-gitlab/package.json index 0c94bdf683..e34ee93523 100644 --- a/plugins/scaffolder-backend-module-gitlab/package.json +++ b/plugins/scaffolder-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gitlab", - "version": "0.2.6-next.3", + "version": "0.2.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-rails/CHANGELOG.md b/plugins/scaffolder-backend-module-rails/CHANGELOG.md index fceecb4de3..eed053be6f 100644 --- a/plugins/scaffolder-backend-module-rails/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-rails/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-scaffolder-backend-module-rails +## 0.4.20 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-node@0.2.3 + ## 0.4.20-next.3 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index 8446140e06..63e5fc78d9 100644 --- a/plugins/scaffolder-backend-module-rails/package.json +++ b/plugins/scaffolder-backend-module-rails/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-rails", "description": "A module for the scaffolder backend that lets you template projects using Rails", - "version": "0.4.20-next.3", + "version": "0.4.20", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md index ed76583c57..ad10b1467c 100644 --- a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-scaffolder-backend-module-sentry +## 0.1.11 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-scaffolder-node@0.2.3 + ## 0.1.11-next.3 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-sentry/package.json b/plugins/scaffolder-backend-module-sentry/package.json index 3e78bd2009..d735b34666 100644 --- a/plugins/scaffolder-backend-module-sentry/package.json +++ b/plugins/scaffolder-backend-module-sentry/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-sentry", - "version": "0.1.11-next.3", + "version": "0.1.11", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md index efd43887a8..d2df8786c0 100644 --- a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-yeoman +## 0.2.24 + +### Patch Changes + +- 4fa1c74cbadc: Enables dry-run functionality for the run:yeoman scaffolder action +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-node@0.2.3 + ## 0.2.24-next.3 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-yeoman/package.json b/plugins/scaffolder-backend-module-yeoman/package.json index ab980d9fca..2eec398969 100644 --- a/plugins/scaffolder-backend-module-yeoman/package.json +++ b/plugins/scaffolder-backend-module-yeoman/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-yeoman", - "version": "0.2.24-next.3", + "version": "0.2.24", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend/CHANGELOG.md b/plugins/scaffolder-backend/CHANGELOG.md index 34b62fe21d..9dd4c120b5 100644 --- a/plugins/scaffolder-backend/CHANGELOG.md +++ b/plugins/scaffolder-backend/CHANGELOG.md @@ -1,5 +1,60 @@ # @backstage/plugin-scaffolder-backend +## 1.17.0 + +### Minor Changes + +- b5f239b50bcf: Improved the `parseEntityRef` Scaffolder filter by introducing the ability for users to provide default kind and/or namespace values. The filter now takes + 2 arguments, similarly to the original [parseEntityRef](https://github.com/backstage/backstage/blob/v1.17.2/packages/catalog-model/src/entity/ref.ts#L77). +- d5313ede3529: **DEPRECATION**: Deprecated `ScaffolderEntitiesProcessor`, which should now instead be imported from `@backstage/plugin-catalog-backend-module-scaffolder-entity-model`. + + `catalogModuleTemplateKind` was also moved to that package and renamed to `catalogModuleScaffolderEntityModel`, without any deprecation since it was an alpha export. + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- a4989552d828: Add examples for `publish:github` and `publish:gitlab` scaffolder actions. +- ded27b83ead2: Add examples for `publish:bitbucket` scaffolder actions. +- 5f1a92b9f19f: Use `DefaultAzureDevOpsCredentialsProvider` to retrieve credentials for Azure DevOps. +- fb57a4694fc6: Fixed the plugin and module ID of the alpha `catalogModuleTemplateKind` export. +- f3c0b95e3ef1: Add examples for `github:actions:dispatch` scaffolder actions. +- cfc3ca6ce060: Changes needed to support MySQL +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/plugin-catalog-backend@1.13.0 + - @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/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.0 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-scaffolder-node@0.2.3 + ## 1.17.0-next.3 ### Minor Changes diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index c5dad8c4b3..3e274e6ad2 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend", "description": "The Backstage backend plugin that helps you create new things", - "version": "1.17.0-next.3", + "version": "1.17.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-common/CHANGELOG.md b/plugins/scaffolder-common/CHANGELOG.md index 0472c868a2..bf11adfc0e 100644 --- a/plugins/scaffolder-common/CHANGELOG.md +++ b/plugins/scaffolder-common/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-common +## 1.4.1 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/types@1.1.1 + ## 1.4.1-next.2 ### Patch Changes diff --git a/plugins/scaffolder-common/package.json b/plugins/scaffolder-common/package.json index cb59a63732..f1a2a45fe0 100644 --- a/plugins/scaffolder-common/package.json +++ b/plugins/scaffolder-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-common", "description": "Common functionalities for the scaffolder, to be shared between scaffolder and scaffolder-backend plugin", - "version": "1.4.1-next.2", + "version": "1.4.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-node/CHANGELOG.md b/plugins/scaffolder-node/CHANGELOG.md index aa3d9e20f1..6d21eef023 100644 --- a/plugins/scaffolder-node/CHANGELOG.md +++ b/plugins/scaffolder-node/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-scaffolder-node +## 0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + ## 0.2.3-next.3 ### Patch Changes diff --git a/plugins/scaffolder-node/package.json b/plugins/scaffolder-node/package.json index 5874309f59..694e440ef9 100644 --- a/plugins/scaffolder-node/package.json +++ b/plugins/scaffolder-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-node", "description": "The plugin-scaffolder-node module for @backstage/plugin-scaffolder-backend", - "version": "0.2.3-next.3", + "version": "0.2.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-react/CHANGELOG.md b/plugins/scaffolder-react/CHANGELOG.md index 573bc7458f..3b41c76469 100644 --- a/plugins/scaffolder-react/CHANGELOG.md +++ b/plugins/scaffolder-react/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-scaffolder-react +## 1.5.5 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- b16c341ced45: Updated dependency `@rjsf/utils` to `5.13.0`. + Updated dependency `@rjsf/core-v5` to `npm:@rjsf/core@5.13.0`. + Updated dependency `@rjsf/material-ui-v5` to `npm:@rjsf/material-ui@5.13.0`. + Updated dependency `@rjsf/validator-ajv8` to `5.13.0`. +- 27fef07f9229: Updated dependency `use-immer` to `^0.9.0`. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + ## 1.5.5-next.3 ### Patch Changes diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index c4a2e3c674..e6859ad369 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-react", "description": "A frontend library that helps other Backstage plugins interact with the Scaffolder", - "version": "1.5.5-next.3", + "version": "1.5.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md index 22aec393d8..940331aa80 100644 --- a/plugins/scaffolder/CHANGELOG.md +++ b/plugins/scaffolder/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-scaffolder +## 1.15.0 + +### Minor Changes + +- 0119c326394a: adding a .zip download to dry run results page, including zip.js as dependency + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 6e69c11a3535: Restored functionality to `OwnedEntityPicker` by converting deprecated `ui:options` input to `catalogFilter`. +- 8cec7664e146: Removed `@types/node` dependency +- b16c341ced45: Updated dependency `@rjsf/utils` to `5.13.0`. + Updated dependency `@rjsf/core-v5` to `npm:@rjsf/core@5.13.0`. + Updated dependency `@rjsf/material-ui-v5` to `npm:@rjsf/material-ui@5.13.0`. + Updated dependency `@rjsf/validator-ajv8` to `5.13.0`. +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/plugin-scaffolder-react@1.5.5 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + ## 1.15.0-next.3 ### Minor Changes diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index 71e536d431..2e28f70cff 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder", "description": "The Backstage plugin that helps you create new things", - "version": "1.15.0-next.3", + "version": "1.15.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-catalog/CHANGELOG.md b/plugins/search-backend-module-catalog/CHANGELOG.md index 003809128f..ed17ffbf63 100644 --- a/plugins/search-backend-module-catalog/CHANGELOG.md +++ b/plugins/search-backend-module-catalog/CHANGELOG.md @@ -1,5 +1,39 @@ # @backstage/plugin-search-backend-module-catalog +## 0.1.7 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-search-backend-node@1.2.7 + ## 0.1.7-next.3 ### Patch Changes diff --git a/plugins/search-backend-module-catalog/package.json b/plugins/search-backend-module-catalog/package.json index bb1955dcdd..1fb18a303b 100644 --- a/plugins/search-backend-module-catalog/package.json +++ b/plugins/search-backend-module-catalog/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-catalog", "description": "A module for the search backend that exports catalog modules", - "version": "0.1.7-next.3", + "version": "0.1.7", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-elasticsearch/CHANGELOG.md b/plugins/search-backend-module-elasticsearch/CHANGELOG.md index 9a78d60628..6b0bb7ce1a 100644 --- a/plugins/search-backend-module-elasticsearch/CHANGELOG.md +++ b/plugins/search-backend-module-elasticsearch/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-search-backend-module-elasticsearch +## 1.3.6 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/integration-aws-node@0.1.6 + - @backstage/plugin-search-backend-node@1.2.7 + ## 1.3.6-next.3 ### Patch Changes diff --git a/plugins/search-backend-module-elasticsearch/package.json b/plugins/search-backend-module-elasticsearch/package.json index 88fa047d48..f1c9f39a17 100644 --- a/plugins/search-backend-module-elasticsearch/package.json +++ b/plugins/search-backend-module-elasticsearch/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-elasticsearch", "description": "A module for the search backend that implements search using ElasticSearch", - "version": "1.3.6-next.3", + "version": "1.3.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-explore/CHANGELOG.md b/plugins/search-backend-module-explore/CHANGELOG.md index 07ff1c49ac..dfcfa262de 100644 --- a/plugins/search-backend-module-explore/CHANGELOG.md +++ b/plugins/search-backend-module-explore/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-search-backend-module-explore +## 0.1.7 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-explore-common@0.0.2 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-search-backend-node@1.2.7 + ## 0.1.7-next.3 ### Patch Changes diff --git a/plugins/search-backend-module-explore/package.json b/plugins/search-backend-module-explore/package.json index cbad376fa3..630020a93d 100644 --- a/plugins/search-backend-module-explore/package.json +++ b/plugins/search-backend-module-explore/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-explore", "description": "A module for the search backend that exports explore modules", - "version": "0.1.7-next.3", + "version": "0.1.7", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-pg/CHANGELOG.md b/plugins/search-backend-module-pg/CHANGELOG.md index bb40f260f6..e119c76e26 100644 --- a/plugins/search-backend-module-pg/CHANGELOG.md +++ b/plugins/search-backend-module-pg/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-search-backend-module-pg +## 0.5.12 + +### Patch Changes + +- 4ccf9204bc95: Added `indexerBatchSize` option to be able to control the size of the batches being indexed. Also added a debug log entry to list out all the entities in the batch +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-search-backend-node@1.2.7 + ## 0.5.12-next.3 ### Patch Changes diff --git a/plugins/search-backend-module-pg/package.json b/plugins/search-backend-module-pg/package.json index b03c4aaa59..a411464d52 100644 --- a/plugins/search-backend-module-pg/package.json +++ b/plugins/search-backend-module-pg/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-pg", "description": "A module for the search backend that implements search using PostgreSQL", - "version": "0.5.12-next.3", + "version": "0.5.12", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-techdocs/CHANGELOG.md b/plugins/search-backend-module-techdocs/CHANGELOG.md index bc05c65a8f..6a0fd46b02 100644 --- a/plugins/search-backend-module-techdocs/CHANGELOG.md +++ b/plugins/search-backend-module-techdocs/CHANGELOG.md @@ -1,5 +1,39 @@ # @backstage/plugin-search-backend-module-techdocs +## 0.1.7 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-techdocs-node@1.8.0 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-search-backend-node@1.2.7 + ## 0.1.7-next.3 ### Patch Changes diff --git a/plugins/search-backend-module-techdocs/package.json b/plugins/search-backend-module-techdocs/package.json index 27b3e7cc0c..fda3d1cd8f 100644 --- a/plugins/search-backend-module-techdocs/package.json +++ b/plugins/search-backend-module-techdocs/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-techdocs", "description": "A module for the search backend that exports techdocs modules", - "version": "0.1.7-next.3", + "version": "0.1.7", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-node/CHANGELOG.md b/plugins/search-backend-node/CHANGELOG.md index 6ac94a70f8..a6374f7701 100644 --- a/plugins/search-backend-node/CHANGELOG.md +++ b/plugins/search-backend-node/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-search-backend-node +## 1.2.7 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + ## 1.2.7-next.3 ### Patch Changes diff --git a/plugins/search-backend-node/package.json b/plugins/search-backend-node/package.json index 86a8ca8f7c..cc688e7bb6 100644 --- a/plugins/search-backend-node/package.json +++ b/plugins/search-backend-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-node", "description": "A library for Backstage backend plugins that want to interact with the search backend plugin", - "version": "1.2.7-next.3", + "version": "1.2.7", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend/CHANGELOG.md b/plugins/search-backend/CHANGELOG.md index 7ecb0c0e0f..b7c6873af2 100644 --- a/plugins/search-backend/CHANGELOG.md +++ b/plugins/search-backend/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/plugin-search-backend +## 1.4.3 + +### Patch Changes + +- 71114ac50e02: 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')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/backend-openapi-utils@0.0.4 + - @backstage/plugin-search-backend-node@1.2.7 + ## 1.4.3-next.3 ### Patch Changes diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index cb0248798a..fc02e552cd 100644 --- a/plugins/search-backend/package.json +++ b/plugins/search-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend", "description": "The Backstage backend plugin that provides your backstage app with search", - "version": "1.4.3-next.3", + "version": "1.4.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-common/CHANGELOG.md b/plugins/search-common/CHANGELOG.md index bbb5a5c1c4..0e7f901614 100644 --- a/plugins/search-common/CHANGELOG.md +++ b/plugins/search-common/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-search-common +## 1.2.6 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/plugin-permission-common@0.7.8 + - @backstage/types@1.1.1 + ## 1.2.6-next.2 ### Patch Changes diff --git a/plugins/search-common/package.json b/plugins/search-common/package.json index 28948ce8a0..b59df94990 100644 --- a/plugins/search-common/package.json +++ b/plugins/search-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-common", "description": "Common functionalities for Search, to be shared between various search-enabled plugins", - "version": "1.2.6-next.2", + "version": "1.2.6", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/plugins/search-react/CHANGELOG.md b/plugins/search-react/CHANGELOG.md index 4e9c8329c0..f01b5b0a54 100644 --- a/plugins/search-react/CHANGELOG.md +++ b/plugins/search-react/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-search-react +## 1.7.0 + +### Minor Changes + +- b78f570f44d3: The SearchPage component can now be configured via app-config.yaml with default query parameters to define how it behaves when it is first loaded or reset. Check out the following example: + + ```yaml + search: + query: + pageLimit: 50 + ``` + + Acceptable values for `pageLimit` are `10`, `25`, `50` or `100`. + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 45f8a95e1068: Optionally initializes the search context with default settings for search queries only when the config is defined, rather than always overriding it. +- 3d63e60f3c36: Internal restructure to avoid circular imports +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + ## 1.7.0-next.3 ### Patch Changes diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json index f47306839a..9ed330c37b 100644 --- a/plugins/search-react/package.json +++ b/plugins/search-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-react", - "version": "1.7.0-next.3", + "version": "1.7.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search/CHANGELOG.md b/plugins/search/CHANGELOG.md index 167e23ae02..24ea0920c7 100644 --- a/plugins/search/CHANGELOG.md +++ b/plugins/search/CHANGELOG.md @@ -1,5 +1,36 @@ # @backstage/plugin-search +## 1.4.0 + +### Minor Changes + +- b78f570f44d3: The SearchPage component can now be configured via app-config.yaml with default query parameters to define how it behaves when it is first loaded or reset. Check out the following example: + + ```yaml + search: + query: + pageLimit: 50 + ``` + + Acceptable values for `pageLimit` are `10`, `25`, `50` or `100`. + +### Patch Changes + +- 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/errors@1.2.2 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + ## 1.4.0-next.3 ### Patch Changes diff --git a/plugins/search/package.json b/plugins/search/package.json index 5da89dd9fe..d31a9e0c1f 100644 --- a/plugins/search/package.json +++ b/plugins/search/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search", "description": "The Backstage plugin that provides your backstage app with search", - "version": "1.4.0-next.3", + "version": "1.4.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sentry/CHANGELOG.md b/plugins/sentry/CHANGELOG.md index 0456807346..dcb5684f9a 100644 --- a/plugins/sentry/CHANGELOG.md +++ b/plugins/sentry/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-sentry +## 0.5.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/theme@0.4.2 + ## 0.5.9-next.3 ### Patch Changes diff --git a/plugins/sentry/package.json b/plugins/sentry/package.json index ce0c6d03b9..be9230572d 100644 --- a/plugins/sentry/package.json +++ b/plugins/sentry/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-sentry", "description": "A Backstage plugin that integrates towards Sentry", - "version": "0.5.9-next.3", + "version": "0.5.9", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/shortcuts/CHANGELOG.md b/plugins/shortcuts/CHANGELOG.md index 335b4ded55..c8774a9fcb 100644 --- a/plugins/shortcuts/CHANGELOG.md +++ b/plugins/shortcuts/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-shortcuts +## 0.3.14 + +### 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/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + ## 0.3.14-next.3 ### Patch Changes diff --git a/plugins/shortcuts/package.json b/plugins/shortcuts/package.json index 835316e26e..a344e111c6 100644 --- a/plugins/shortcuts/package.json +++ b/plugins/shortcuts/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-shortcuts", "description": "A Backstage plugin that provides a shortcuts feature to the sidebar", - "version": "0.3.14-next.3", + "version": "0.3.14", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube-backend/CHANGELOG.md b/plugins/sonarqube-backend/CHANGELOG.md index 7e36170ac3..f7353f9985 100644 --- a/plugins/sonarqube-backend/CHANGELOG.md +++ b/plugins/sonarqube-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-sonarqube-backend +## 0.2.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + ## 0.2.5-next.3 ### Patch Changes diff --git a/plugins/sonarqube-backend/package.json b/plugins/sonarqube-backend/package.json index ec5a2ed887..2b1d8182c8 100644 --- a/plugins/sonarqube-backend/package.json +++ b/plugins/sonarqube-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-sonarqube-backend", - "version": "0.2.5-next.3", + "version": "0.2.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube-react/CHANGELOG.md b/plugins/sonarqube-react/CHANGELOG.md index d7a31b9b0c..e8fdd45a40 100644 --- a/plugins/sonarqube-react/CHANGELOG.md +++ b/plugins/sonarqube-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-sonarqube-react +## 0.1.8 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + ## 0.1.8-next.3 ### Patch Changes diff --git a/plugins/sonarqube-react/package.json b/plugins/sonarqube-react/package.json index aadb4b7c70..7ffb55ad69 100644 --- a/plugins/sonarqube-react/package.json +++ b/plugins/sonarqube-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-sonarqube-react", - "version": "0.1.8-next.3", + "version": "0.1.8", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube/CHANGELOG.md b/plugins/sonarqube/CHANGELOG.md index 3c46ea4bf4..178058ef03 100644 --- a/plugins/sonarqube/CHANGELOG.md +++ b/plugins/sonarqube/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-sonarqube +## 0.7.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 +- db92d1244897: Updated dependency `rc-progress` to `3.5.1`. +- 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/plugin-sonarqube-react@0.1.8 + - @backstage/theme@0.4.2 + ## 0.7.5-next.3 ### Patch Changes diff --git a/plugins/sonarqube/package.json b/plugins/sonarqube/package.json index 5ccd9cb66b..238423fc98 100644 --- a/plugins/sonarqube/package.json +++ b/plugins/sonarqube/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-sonarqube", "description": "", - "version": "0.7.5-next.3", + "version": "0.7.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/splunk-on-call/CHANGELOG.md b/plugins/splunk-on-call/CHANGELOG.md index 61f6e1ca54..3360ebdcae 100644 --- a/plugins/splunk-on-call/CHANGELOG.md +++ b/plugins/splunk-on-call/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-splunk-on-call +## 0.4.13 + +### 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/theme@0.4.2 + ## 0.4.13-next.3 ### Patch Changes diff --git a/plugins/splunk-on-call/package.json b/plugins/splunk-on-call/package.json index 66966873e2..d86d555fe1 100644 --- a/plugins/splunk-on-call/package.json +++ b/plugins/splunk-on-call/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-splunk-on-call", "description": "A Backstage plugin that integrates towards Splunk On-Call", - "version": "0.4.13-next.3", + "version": "0.4.13", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/stack-overflow-backend/CHANGELOG.md b/plugins/stack-overflow-backend/CHANGELOG.md index 29e362e898..f5922da46c 100644 --- a/plugins/stack-overflow-backend/CHANGELOG.md +++ b/plugins/stack-overflow-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-stack-overflow-backend +## 0.2.7 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-search-common@1.2.6 + ## 0.2.7-next.3 ### Patch Changes diff --git a/plugins/stack-overflow-backend/package.json b/plugins/stack-overflow-backend/package.json index a1ae36953d..2825bfc310 100644 --- a/plugins/stack-overflow-backend/package.json +++ b/plugins/stack-overflow-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-stack-overflow-backend", - "version": "0.2.7-next.3", + "version": "0.2.7", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/stack-overflow/CHANGELOG.md b/plugins/stack-overflow/CHANGELOG.md index 8cb485fe7a..857aa92607 100644 --- a/plugins/stack-overflow/CHANGELOG.md +++ b/plugins/stack-overflow/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-stack-overflow +## 0.1.20 + +### Patch Changes + +- 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/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/theme@0.4.2 + ## 0.1.20-next.3 ### Patch Changes diff --git a/plugins/stack-overflow/package.json b/plugins/stack-overflow/package.json index 31af9b9f19..2e211987c4 100644 --- a/plugins/stack-overflow/package.json +++ b/plugins/stack-overflow/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-stack-overflow", - "version": "0.1.20-next.3", + "version": "0.1.20", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/stackstorm/CHANGELOG.md b/plugins/stackstorm/CHANGELOG.md index 3f868aedab..fcb1dfed42 100644 --- a/plugins/stackstorm/CHANGELOG.md +++ b/plugins/stackstorm/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-stackstorm +## 0.1.6 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + ## 0.1.6-next.3 ### Patch Changes diff --git a/plugins/stackstorm/package.json b/plugins/stackstorm/package.json index 2b34f99b21..df9a9f1d41 100644 --- a/plugins/stackstorm/package.json +++ b/plugins/stackstorm/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-stackstorm", "description": "A Backstage plugin that integrates towards StackStorm", - "version": "0.1.6-next.3", + "version": "0.1.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md index 1ee3a75337..78a66da5a4 100644 --- a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md +++ b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-tech-insights-backend-module-jsonfc +## 0.1.35 + +### Patch Changes + +- 51b801f743b2: Handle extracting facts from 'not' conditions too +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-tech-insights-common@0.2.12 + - @backstage/plugin-tech-insights-node@0.4.9 + ## 0.1.35-next.3 ### Patch Changes diff --git a/plugins/tech-insights-backend-module-jsonfc/package.json b/plugins/tech-insights-backend-module-jsonfc/package.json index a4c3fd5d15..65e94067e2 100644 --- a/plugins/tech-insights-backend-module-jsonfc/package.json +++ b/plugins/tech-insights-backend-module-jsonfc/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-backend-module-jsonfc", - "version": "0.1.35-next.3", + "version": "0.1.35", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-backend/CHANGELOG.md b/plugins/tech-insights-backend/CHANGELOG.md index f1d5f12e59..368490c8bb 100644 --- a/plugins/tech-insights-backend/CHANGELOG.md +++ b/plugins/tech-insights-backend/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-tech-insights-backend +## 0.5.17 + +### Patch Changes + +- cfc3ca6ce060: Changes needed to support MySQL +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-tech-insights-common@0.2.12 + - @backstage/types@1.1.1 + - @backstage/plugin-tech-insights-node@0.4.9 + ## 0.5.17-next.3 ### Patch Changes diff --git a/plugins/tech-insights-backend/package.json b/plugins/tech-insights-backend/package.json index 379d87ca42..2aa1a4793f 100644 --- a/plugins/tech-insights-backend/package.json +++ b/plugins/tech-insights-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-backend", - "version": "0.5.17-next.3", + "version": "0.5.17", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-common/CHANGELOG.md b/plugins/tech-insights-common/CHANGELOG.md index ad2e56bddd..15e8949b5c 100644 --- a/plugins/tech-insights-common/CHANGELOG.md +++ b/plugins/tech-insights-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-tech-insights-common +## 0.2.12 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/types@1.1.1 + ## 0.2.12-next.0 ### Patch Changes diff --git a/plugins/tech-insights-common/package.json b/plugins/tech-insights-common/package.json index 9448b111c3..cef4b5c627 100644 --- a/plugins/tech-insights-common/package.json +++ b/plugins/tech-insights-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-common", - "version": "0.2.12-next.0", + "version": "0.2.12", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-node/CHANGELOG.md b/plugins/tech-insights-node/CHANGELOG.md index af4274cd76..a2669c4e4a 100644 --- a/plugins/tech-insights-node/CHANGELOG.md +++ b/plugins/tech-insights-node/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-tech-insights-node +## 0.4.9 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-tech-insights-common@0.2.12 + - @backstage/types@1.1.1 + ## 0.4.9-next.3 ### Patch Changes diff --git a/plugins/tech-insights-node/package.json b/plugins/tech-insights-node/package.json index b012c51298..0dae5947f1 100644 --- a/plugins/tech-insights-node/package.json +++ b/plugins/tech-insights-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-node", - "version": "0.4.9-next.3", + "version": "0.4.9", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights/CHANGELOG.md b/plugins/tech-insights/CHANGELOG.md index 065efabf54..56648e0cda 100644 --- a/plugins/tech-insights/CHANGELOG.md +++ b/plugins/tech-insights/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-tech-insights +## 0.3.16 + +### Patch Changes + +- 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-tech-insights-common@0.2.12 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + ## 0.3.16-next.3 ### Patch Changes diff --git a/plugins/tech-insights/package.json b/plugins/tech-insights/package.json index c75f52e06c..d3ae234abc 100644 --- a/plugins/tech-insights/package.json +++ b/plugins/tech-insights/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights", - "version": "0.3.16-next.3", + "version": "0.3.16", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-radar/CHANGELOG.md b/plugins/tech-radar/CHANGELOG.md index f37b791962..385b536004 100644 --- a/plugins/tech-radar/CHANGELOG.md +++ b/plugins/tech-radar/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-tech-radar +## 0.6.8 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- b45d0ac68191: Add names to blip entry links in the radar to improve accessibility +- 80b4d0b34f14: Fixed the width of the tech radar dialog so that the content fits +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 6d35e9ea2afa: Add description property for Rings which will be shown in the footer. +- 8cec7664e146: Removed `@types/node` dependency +- c357f62052af: Fixed `RadarTimeline` text formatting. +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.6.8-next.3 ### Patch Changes diff --git a/plugins/tech-radar/package.json b/plugins/tech-radar/package.json index 1b048f49cd..59b776d319 100644 --- a/plugins/tech-radar/package.json +++ b/plugins/tech-radar/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-tech-radar", "description": "A Backstage plugin that lets you display a Tech Radar for your organization", - "version": "0.6.8-next.3", + "version": "0.6.8", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-addons-test-utils/CHANGELOG.md b/plugins/techdocs-addons-test-utils/CHANGELOG.md index 05f7d05b40..7c1c5eb0e3 100644 --- a/plugins/techdocs-addons-test-utils/CHANGELOG.md +++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-techdocs-addons-test-utils +## 1.0.21 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog@1.13.0 + - @backstage/plugin-techdocs@1.7.0 + - @backstage/core-components@0.13.5 + - @backstage/test-utils@1.4.3 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-search-react@1.7.0 + - @backstage/plugin-techdocs-react@1.1.10 + - @backstage/theme@0.4.2 + ## 1.0.21-next.3 ### Patch Changes diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index 98dfaa5e33..af016f8c32 100644 --- a/plugins/techdocs-addons-test-utils/package.json +++ b/plugins/techdocs-addons-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-addons-test-utils", - "version": "1.0.21-next.3", + "version": "1.0.21", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md index edfdef0aae..55b6aefe3f 100644 --- a/plugins/techdocs-backend/CHANGELOG.md +++ b/plugins/techdocs-backend/CHANGELOG.md @@ -1,5 +1,46 @@ # @backstage/plugin-techdocs-backend +## 1.7.0 + +### Minor Changes + +- 5985d458ee30: Add a `techdocs.publisher.azureBlobStorage.connectionString` app-config setting, which can be leveraged for improved Azurite support. +- 10a86bd4ae12: Add optional config and cli option for techdocs to specify default mkdocs plugins. + +### Patch Changes + +- 60af8017dd84: Expand techdocs.publisher.type with `googleGcs`,`awsS3`,`azureBlobStorage` and `openStackSwift` +- 71114ac50e02: 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')); + ``` + +- a8a614ba0d07: Minor `package.json` update. +- Updated dependencies + - @backstage/plugin-search-backend-module-techdocs@0.1.7 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-techdocs-node@1.8.0 + ## 1.7.0-next.3 ### Patch Changes diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index c55254e533..f4e13111dc 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-backend", "description": "The Backstage backend plugin that renders technical documentation for your components", - "version": "1.7.0-next.3", + "version": "1.7.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-module-addons-contrib/CHANGELOG.md b/plugins/techdocs-module-addons-contrib/CHANGELOG.md index 85643f7302..68bf1fce2e 100644 --- a/plugins/techdocs-module-addons-contrib/CHANGELOG.md +++ b/plugins/techdocs-module-addons-contrib/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-techdocs-module-addons-contrib +## 1.1.0 + +### Minor Changes + +- 86c19906fe4b: Enable zoom icon for techdocs images inside lightbox + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/integration@1.7.0 + - @backstage/plugin-techdocs-react@1.1.10 + - @backstage/theme@0.4.2 + ## 1.1.0-next.3 ### Patch Changes diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index 4915d7bf04..6ffb5c4afa 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-module-addons-contrib", "description": "Plugin module for contributed TechDocs Addons", - "version": "1.1.0-next.3", + "version": "1.1.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-node/CHANGELOG.md b/plugins/techdocs-node/CHANGELOG.md index 06d4b405cb..06d0d88fae 100644 --- a/plugins/techdocs-node/CHANGELOG.md +++ b/plugins/techdocs-node/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-techdocs-node +## 1.8.0 + +### Minor Changes + +- 5985d458ee30: Add a `techdocs.publisher.azureBlobStorage.connectionString` app-config setting, which can be leveraged for improved Azurite support. +- 10a86bd4ae12: Add optional config and cli option for techdocs to specify default mkdocs plugins. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/integration-aws-node@0.1.6 + ## 1.8.0-next.3 ### Patch Changes diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index 7778555012..07fc2a74b8 100644 --- a/plugins/techdocs-node/package.json +++ b/plugins/techdocs-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-node", "description": "Common node.js functionalities for TechDocs, to be shared between techdocs-backend plugin and techdocs-cli", - "version": "1.8.0-next.3", + "version": "1.8.0", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/plugins/techdocs-react/CHANGELOG.md b/plugins/techdocs-react/CHANGELOG.md index 41422e0f0f..9e14cdbf36 100644 --- a/plugins/techdocs-react/CHANGELOG.md +++ b/plugins/techdocs-react/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-techdocs-react +## 1.1.11 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @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/version-bridge@1.0.5 + +## 1.1.10 + +Skipped due to publishing issues. + ## 1.1.10-next.3 ### Patch Changes diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json index 8d0031be90..c07283c0b4 100644 --- a/plugins/techdocs-react/package.json +++ b/plugins/techdocs-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-react", "description": "Shared frontend utilities for TechDocs and Addons", - "version": "1.1.10-next.3", + "version": "1.1.11", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md index 5cdf098ec9..e834585259 100644 --- a/plugins/techdocs/CHANGELOG.md +++ b/plugins/techdocs/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-techdocs +## 1.7.0 + +### Minor Changes + +- e44f45ac4515: This change allows a new annotation of `backstage.io/techdocs-entity` this ref allows you to reference another entity for its TechDocs. This allows you have a single TechDoc for all items in a system, for example you might have a frontend and a backend in the same repo. This would allow you to have TechDocs build under a `System` entity while referencing the system e.g.: `backstage.io/techdocs-entity: system:default/example` that will show the systems docs in both the TechDocs button and the TechDocs tab without needing to do duplicate builds and filling the TechDocs page with garbage. + +### Patch Changes + +- 88c9525a36f3: Fixed bug in styles that caused next and previous links in footer to overlap page content. +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @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/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/plugin-techdocs-react@1.1.10 + - @backstage/theme@0.4.2 + ## 1.7.0-next.3 ### Patch Changes diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index d61fb856d3..a1f26694f8 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs", "description": "The Backstage plugin that renders technical documentation for your components", - "version": "1.7.0-next.3", + "version": "1.7.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/todo-backend/CHANGELOG.md b/plugins/todo-backend/CHANGELOG.md index 9084bf6c85..e468aa66e6 100644 --- a/plugins/todo-backend/CHANGELOG.md +++ b/plugins/todo-backend/CHANGELOG.md @@ -1,5 +1,42 @@ # @backstage/plugin-todo-backend +## 0.3.1 + +### 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/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/backend-openapi-utils@0.0.4 + +## 0.3.0 + +Skipped due to publishing issues. + ## 0.3.0-next.3 ### Minor Changes diff --git a/plugins/todo-backend/package.json b/plugins/todo-backend/package.json index f82d28ef1f..1f9c74e11c 100644 --- a/plugins/todo-backend/package.json +++ b/plugins/todo-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-todo-backend", "description": "A Backstage backend plugin that lets you browse TODO comments in your source code", - "version": "0.3.0-next.3", + "version": "0.3.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/todo/CHANGELOG.md b/plugins/todo/CHANGELOG.md index 9837d02444..f4ea8e5a23 100644 --- a/plugins/todo/CHANGELOG.md +++ b/plugins/todo/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-todo +## 0.2.27 + +### 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/theme@0.4.2 + +## 0.2.26 + +Skipped due to publishing issues. + ## 0.2.26-next.3 ### Patch Changes diff --git a/plugins/todo/package.json b/plugins/todo/package.json index 6d83aaa9c1..21a9dbaf6a 100644 --- a/plugins/todo/package.json +++ b/plugins/todo/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-todo", "description": "A Backstage plugin that lets you browse TODO comments in your source code", - "version": "0.2.26-next.3", + "version": "0.2.27", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/user-settings-backend/CHANGELOG.md b/plugins/user-settings-backend/CHANGELOG.md index 4b705834f5..e3bcd23555 100644 --- a/plugins/user-settings-backend/CHANGELOG.md +++ b/plugins/user-settings-backend/CHANGELOG.md @@ -1,5 +1,39 @@ # @backstage/plugin-user-settings-backend +## 0.2.1 + +### 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/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + +## 0.2.0 + +Skipped due to publishing issues. + ## 0.2.0-next.3 ### Minor Changes diff --git a/plugins/user-settings-backend/package.json b/plugins/user-settings-backend/package.json index 59b6c8e8bf..6d0b85b06c 100644 --- a/plugins/user-settings-backend/package.json +++ b/plugins/user-settings-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-user-settings-backend", "description": "The Backstage backend plugin to manage user settings", - "version": "0.2.0-next.3", + "version": "0.2.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/user-settings/CHANGELOG.md b/plugins/user-settings/CHANGELOG.md index 8e6c68d270..011e0e2511 100644 --- a/plugins/user-settings/CHANGELOG.md +++ b/plugins/user-settings/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-user-settings +## 0.7.10 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- ce77b23423cb: conditionally rendering the user email in user profile card +- e03f3ee2be94: changed auto theme tooltip title to camel case +- 8cec7664e146: Removed `@types/node` dependency +- 6e30769cc627: Introduced experimental support for internationalization. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## 0.7.9 + +Skipped due to publishing issues. + ## 0.7.9-next.3 ### Patch Changes diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index 8903065ae4..01e158dc2c 100644 --- a/plugins/user-settings/package.json +++ b/plugins/user-settings/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-user-settings", "description": "A Backstage plugin that provides a settings page", - "version": "0.7.9-next.3", + "version": "0.7.10", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/vault-backend/CHANGELOG.md b/plugins/vault-backend/CHANGELOG.md index 9590c20875..a15ae01ac6 100644 --- a/plugins/vault-backend/CHANGELOG.md +++ b/plugins/vault-backend/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-vault-backend +## 0.3.8 + +### Patch Changes + +- 858a18800870: Added ability to override vault secret engine value on catalog entity level using annotation `vault.io/secrets-engine` +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + +## 0.3.7 + +Skipped due to publishing issues. + ## 0.3.7-next.3 ### Patch Changes diff --git a/plugins/vault-backend/package.json b/plugins/vault-backend/package.json index 4fbd790b45..034e8474aa 100644 --- a/plugins/vault-backend/package.json +++ b/plugins/vault-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-vault-backend", "description": "A Backstage backend plugin that integrates towards Vault", - "version": "0.3.7-next.3", + "version": "0.3.8", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/vault/CHANGELOG.md b/plugins/vault/CHANGELOG.md index a8e194ff96..79f7427d28 100644 --- a/plugins/vault/CHANGELOG.md +++ b/plugins/vault/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-vault +## 0.1.19 + +### 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 +- 858a18800870: Added ability to override vault secret engine value on catalog entity level using annotation `vault.io/secrets-engine` +- 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/theme@0.4.2 + +## 0.1.18 + +Skipped due to publishing issues. + ## 0.1.18-next.3 ### Patch Changes diff --git a/plugins/vault/package.json b/plugins/vault/package.json index b1a0909740..dcc7a03d62 100644 --- a/plugins/vault/package.json +++ b/plugins/vault/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-vault", "description": "A Backstage plugin that integrates towards Vault", - "version": "0.1.18-next.3", + "version": "0.1.19", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/xcmetrics/CHANGELOG.md b/plugins/xcmetrics/CHANGELOG.md index ecf1aaf933..61f0561fbf 100644 --- a/plugins/xcmetrics/CHANGELOG.md +++ b/plugins/xcmetrics/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-xcmetrics +## 0.2.43 + +### 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 +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## 0.2.42 + +Skipped due to publishing issues. + ## 0.2.42-next.3 ### Patch Changes diff --git a/plugins/xcmetrics/package.json b/plugins/xcmetrics/package.json index 2adb3f0cbd..ee16b186c1 100644 --- a/plugins/xcmetrics/package.json +++ b/plugins/xcmetrics/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-xcmetrics", "description": "A Backstage plugin that shows XCode build metrics for your components", - "version": "0.2.42-next.3", + "version": "0.2.43", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/yarn.lock b/yarn.lock index c0a75005bf..c9039f34f2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3661,17 +3661,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/catalog-client@npm:^1.4.3": - version: 1.4.3 - resolution: "@backstage/catalog-client@npm:1.4.3" - dependencies: - "@backstage/catalog-model": ^1.4.1 - "@backstage/errors": ^1.2.1 - cross-fetch: ^3.1.5 - checksum: 0115c630e3c0438ffbbc3a87f7bd1ff557f2c1c2f5d072dd587bff153931ece83cbce64a8ca3fb26a017c2634a3399145d14e94c319df5c6e1889a2c3b915829 - languageName: node - linkType: hard - "@backstage/catalog-client@workspace:^, @backstage/catalog-client@workspace:packages/catalog-client": version: 0.0.0-use.local resolution: "@backstage/catalog-client@workspace:packages/catalog-client" @@ -3684,22 +3673,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/catalog-model@npm:^1.1.5, @backstage/catalog-model@npm:^1.4.1": - version: 1.4.1 - resolution: "@backstage/catalog-model@npm:1.4.1" - dependencies: - "@backstage/config": ^1.0.8 - "@backstage/errors": ^1.2.1 - "@backstage/types": ^1.1.0 - ajv: ^8.10.0 - json-schema: ^0.4.0 - lodash: ^4.17.21 - uuid: ^8.0.0 - checksum: 5fd839bf8f10dc8ccd25a2714513440fb3cd982a8c6963adbffc5cefa732456b832f039a44d0ac9103b25327a311810b1e33b12117775df4a7cec0a21c9743b4 - languageName: node - linkType: hard - -"@backstage/catalog-model@workspace:^, @backstage/catalog-model@workspace:packages/catalog-model": +"@backstage/catalog-model@^1.1.5, @backstage/catalog-model@^1.4.1, @backstage/catalog-model@workspace:^, @backstage/catalog-model@workspace:packages/catalog-model": version: 0.0.0-use.local resolution: "@backstage/catalog-model@workspace:packages/catalog-model" dependencies: @@ -3947,17 +3921,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/config@npm:^1.0.6, @backstage/config@npm:^1.0.7, @backstage/config@npm:^1.0.8": - version: 1.0.8 - resolution: "@backstage/config@npm:1.0.8" - dependencies: - "@backstage/types": ^1.1.0 - lodash: ^4.17.21 - checksum: 78c38207d52de65bf83c1b9281c83fc89e0cda9869c680c39e69bffed5200e5d35035cd850816b57fd979a2ea24132f96ee938b1cddacaf96a43d0385930da9a - languageName: node - linkType: hard - -"@backstage/config@workspace:^, @backstage/config@workspace:packages/config": +"@backstage/config@^1.0.6, @backstage/config@^1.0.7, @backstage/config@workspace:^, @backstage/config@workspace:packages/config": version: 0.0.0-use.local resolution: "@backstage/config@workspace:packages/config" dependencies: @@ -4005,110 +3969,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-components@npm:^0.12.3": - version: 0.12.5 - resolution: "@backstage/core-components@npm:0.12.5" - dependencies: - "@backstage/config": ^1.0.7 - "@backstage/core-plugin-api": ^1.5.0 - "@backstage/errors": ^1.1.5 - "@backstage/theme": ^0.2.18 - "@backstage/version-bridge": ^1.0.3 - "@material-table/core": ^3.1.0 - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 - "@react-hookz/web": ^20.0.0 - "@types/react-sparklines": ^1.7.0 - "@types/react-text-truncate": ^0.14.0 - ansi-regex: ^6.0.1 - classnames: ^2.2.6 - d3-selection: ^3.0.0 - d3-shape: ^3.0.0 - d3-zoom: ^3.0.0 - dagre: ^0.8.5 - history: ^5.0.0 - immer: ^9.0.1 - lodash: ^4.17.21 - pluralize: ^8.0.0 - prop-types: ^15.7.2 - qs: ^6.9.4 - rc-progress: 3.4.1 - react-helmet: 6.1.0 - react-hook-form: ^7.12.2 - react-markdown: ^8.0.0 - react-sparklines: ^1.7.0 - react-syntax-highlighter: ^15.4.5 - react-text-truncate: ^0.19.0 - react-use: ^17.3.2 - react-virtualized-auto-sizer: ^1.0.6 - react-window: ^1.8.6 - remark-gfm: ^3.0.1 - zen-observable: ^0.10.0 - zod: ~3.18.0 - peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 - react: ^16.13.1 || ^17.0.0 - react-dom: ^16.13.1 || ^17.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: 8308c1b90247911f6cf22963b530cef169287f508ff29d159d0c83758134dd43bd5acd2113350690a46a02246bc05dca975bcc38325000aefb1c93c80e2f19c7 - languageName: node - linkType: hard - -"@backstage/core-components@npm:^0.13.4": - version: 0.13.4 - resolution: "@backstage/core-components@npm:0.13.4" - dependencies: - "@backstage/config": ^1.0.8 - "@backstage/core-plugin-api": ^1.5.3 - "@backstage/errors": ^1.2.1 - "@backstage/theme": ^0.4.1 - "@backstage/version-bridge": ^1.0.4 - "@date-io/core": ^1.3.13 - "@material-table/core": ^3.1.0 - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@react-hookz/web": ^20.0.0 - "@types/react": ^16.13.1 || ^17.0.0 - "@types/react-sparklines": ^1.7.0 - "@types/react-text-truncate": ^0.14.0 - ansi-regex: ^6.0.1 - classnames: ^2.2.6 - d3-selection: ^3.0.0 - d3-shape: ^3.0.0 - d3-zoom: ^3.0.0 - dagre: ^0.8.5 - history: ^5.0.0 - immer: ^9.0.1 - linkify-react: 4.1.1 - linkifyjs: 4.1.1 - lodash: ^4.17.21 - pluralize: ^8.0.0 - prop-types: ^15.7.2 - qs: ^6.9.4 - rc-progress: 3.4.2 - react-helmet: 6.1.0 - react-hook-form: ^7.12.2 - react-markdown: ^8.0.0 - react-sparklines: ^1.7.0 - react-syntax-highlighter: ^15.4.5 - react-text-truncate: ^0.19.0 - react-use: ^17.3.2 - react-virtualized-auto-sizer: ^1.0.11 - react-window: ^1.8.6 - remark-gfm: ^3.0.1 - zen-observable: ^0.10.0 - zod: ^3.21.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: cb3f1f0c91a37c401e3e5dc1304414e02205d5eb6e9fd8a8de8f1f7796f105b44f7926d61c95d2331fe2887612b9c44483683c7df6ffcf826e438fd1beffcd74 - languageName: node - linkType: hard - -"@backstage/core-components@workspace:^, @backstage/core-components@workspace:packages/core-components": +"@backstage/core-components@^0.13.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: @@ -4183,26 +4044,57 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-plugin-api@npm:^1.3.0, @backstage/core-plugin-api@npm:^1.5.0, @backstage/core-plugin-api@npm:^1.5.3": - version: 1.5.3 - resolution: "@backstage/core-plugin-api@npm:1.5.3" +"@backstage/core-components@npm:^0.12.3": + version: 0.12.5 + resolution: "@backstage/core-components@npm:0.12.5" dependencies: - "@backstage/config": ^1.0.8 - "@backstage/types": ^1.1.0 - "@backstage/version-bridge": ^1.0.4 - "@types/react": ^16.13.1 || ^17.0.0 + "@backstage/config": ^1.0.7 + "@backstage/core-plugin-api": ^1.5.0 + "@backstage/errors": ^1.1.5 + "@backstage/theme": ^0.2.18 + "@backstage/version-bridge": ^1.0.3 + "@material-table/core": ^3.1.0 + "@material-ui/core": ^4.12.2 + "@material-ui/icons": ^4.9.1 + "@material-ui/lab": 4.0.0-alpha.57 + "@react-hookz/web": ^20.0.0 + "@types/react-sparklines": ^1.7.0 + "@types/react-text-truncate": ^0.14.0 + ansi-regex: ^6.0.1 + classnames: ^2.2.6 + d3-selection: ^3.0.0 + d3-shape: ^3.0.0 + d3-zoom: ^3.0.0 + dagre: ^0.8.5 history: ^5.0.0 + immer: ^9.0.1 + lodash: ^4.17.21 + pluralize: ^8.0.0 prop-types: ^15.7.2 + qs: ^6.9.4 + rc-progress: 3.4.1 + react-helmet: 6.1.0 + react-hook-form: ^7.12.2 + react-markdown: ^8.0.0 + react-sparklines: ^1.7.0 + react-syntax-highlighter: ^15.4.5 + react-text-truncate: ^0.19.0 + react-use: ^17.3.2 + react-virtualized-auto-sizer: ^1.0.6 + react-window: ^1.8.6 + remark-gfm: ^3.0.1 zen-observable: ^0.10.0 + zod: ~3.18.0 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: d272b5af4f22cf8f2b91fb85d0fc860cc70220a596e4f03544a996493b045fd09663fc1d79044916ffd86303bfdd47795398dd86d66987d8514bade3dcbaad37 + checksum: 8308c1b90247911f6cf22963b530cef169287f508ff29d159d0c83758134dd43bd5acd2113350690a46a02246bc05dca975bcc38325000aefb1c93c80e2f19c7 languageName: node linkType: hard -"@backstage/core-plugin-api@workspace:^, @backstage/core-plugin-api@workspace:packages/core-plugin-api": +"@backstage/core-plugin-api@^1.3.0, @backstage/core-plugin-api@^1.5.0, @backstage/core-plugin-api@^1.5.3, @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: @@ -4288,18 +4180,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/errors@npm:^1.1.5, @backstage/errors@npm:^1.2.1": - version: 1.2.1 - resolution: "@backstage/errors@npm:1.2.1" - dependencies: - "@backstage/types": ^1.1.0 - cross-fetch: ^3.1.5 - serialize-error: ^8.0.1 - checksum: 67f7f9939af47e178c27d1a96282f4921b4ba8108917bb10e68dba1644a5f643cb87251346989dd402b333593cb7e658129256d80781b962add28f2a3efca0ea - languageName: node - linkType: hard - -"@backstage/errors@workspace:^, @backstage/errors@workspace:packages/errors": +"@backstage/errors@^1.1.5, @backstage/errors@workspace:^, @backstage/errors@workspace:packages/errors": version: 0.0.0-use.local resolution: "@backstage/errors@workspace:packages/errors" dependencies: @@ -4383,28 +4264,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/integration-react@npm:^1.1.18": - version: 1.1.18 - resolution: "@backstage/integration-react@npm:1.1.18" - dependencies: - "@backstage/config": ^1.0.8 - "@backstage/core-components": ^0.13.4 - "@backstage/core-plugin-api": ^1.5.3 - "@backstage/integration": ^1.6.2 - "@backstage/theme": ^0.4.1 - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - 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: ec2ea86510947f4ecb59838fb540f7318e1e13f859b16340fa52e33d7e014e8796528fcd2e5a37a7c525d48c7df0533954565b561c89575f7075d933ba1ed340 - languageName: node - linkType: hard - -"@backstage/integration-react@workspace:^, @backstage/integration-react@workspace:packages/integration-react": +"@backstage/integration-react@^1.1.18, @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: @@ -4433,23 +4293,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/integration@npm:^1.6.2": - version: 1.6.2 - resolution: "@backstage/integration@npm:1.6.2" - dependencies: - "@azure/identity": ^3.2.1 - "@backstage/config": ^1.0.8 - "@backstage/errors": ^1.2.1 - "@octokit/auth-app": ^4.0.0 - "@octokit/rest": ^19.0.3 - cross-fetch: ^3.1.5 - git-url-parse: ^13.0.0 - lodash: ^4.17.21 - luxon: ^3.0.0 - checksum: 5ae6a3def92ee9feb114fecea8a36337df592f49f23875fa619b0eba223f287ed7bbe993c15cac99c2b45c3150e10bb2e1bb4389b34a09de5377365ab13e9ae7 - languageName: node - linkType: hard - "@backstage/integration@workspace:^, @backstage/integration@workspace:packages/integration": version: 0.0.0-use.local resolution: "@backstage/integration@workspace:packages/integration" @@ -5784,18 +5627,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-common@npm:^1.0.10, @backstage/plugin-catalog-common@npm:^1.0.15": - version: 1.0.15 - resolution: "@backstage/plugin-catalog-common@npm:1.0.15" - dependencies: - "@backstage/catalog-model": ^1.4.1 - "@backstage/plugin-permission-common": ^0.7.7 - "@backstage/plugin-search-common": ^1.2.5 - checksum: b5d371605e9436b99b0a2b22cbb049f65d42ab4736108bddafea9294b25adb466a2f3baeb360d428f40f7c63503663c1648089f440c9cfaff3cb70647e5a4e0e - languageName: node - linkType: hard - -"@backstage/plugin-catalog-common@workspace:^, @backstage/plugin-catalog-common@workspace:plugins/catalog-common": +"@backstage/plugin-catalog-common@^1.0.10, @backstage/plugin-catalog-common@workspace:^, @backstage/plugin-catalog-common@workspace:plugins/catalog-common": version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-common@workspace:plugins/catalog-common" dependencies: @@ -5932,44 +5764,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-react@npm:^1.2.4, @backstage/plugin-catalog-react@npm:^1.8.3": - version: 1.8.3 - resolution: "@backstage/plugin-catalog-react@npm:1.8.3" - dependencies: - "@backstage/catalog-client": ^1.4.3 - "@backstage/catalog-model": ^1.4.1 - "@backstage/core-components": ^0.13.4 - "@backstage/core-plugin-api": ^1.5.3 - "@backstage/errors": ^1.2.1 - "@backstage/integration": ^1.6.2 - "@backstage/plugin-catalog-common": ^1.0.15 - "@backstage/plugin-permission-common": ^0.7.7 - "@backstage/plugin-permission-react": ^0.4.14 - "@backstage/theme": ^0.4.1 - "@backstage/types": ^1.1.0 - "@backstage/version-bridge": ^1.0.4 - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@react-hookz/web": ^23.0.0 - "@types/react": ^16.13.1 || ^17.0.0 - classnames: ^2.2.6 - jwt-decode: ^3.1.0 - lodash: ^4.17.21 - material-ui-popup-state: ^1.9.3 - qs: ^6.9.4 - react-use: ^17.2.4 - yaml: ^2.0.0 - zen-observable: ^0.10.0 - 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: 8d334dc8eb35399fb4fde7eb218589cc3bedf6f65665a0f379a578ca892ab4a06a83a6e0de2c392e16d12981a91c903efdaa78f577639dd8f73604c61541f60e - languageName: node - linkType: hard - -"@backstage/plugin-catalog-react@workspace:^, @backstage/plugin-catalog-react@workspace:plugins/catalog-react": +"@backstage/plugin-catalog-react@^1.2.4, @backstage/plugin-catalog-react@^1.8.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: @@ -7330,23 +7125,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-home-react@npm:^0.1.2": - version: 0.1.2 - resolution: "@backstage/plugin-home-react@npm:0.1.2" - dependencies: - "@backstage/core-components": ^0.13.4 - "@backstage/core-plugin-api": ^1.5.3 - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@rjsf/utils": 5.7.3 - 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: fafec93fe81f7a2e4a3bc018cc740b8c93b4be3bb0f9216ec8f510390cf70302d912734be9bec72ae9319b9fce39fb72c1467b97fb23ba54c597253912114bb5 - languageName: node - linkType: hard - "@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" @@ -7375,39 +7153,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-home@npm:^0.5.7": - version: 0.5.7 - resolution: "@backstage/plugin-home@npm:0.5.7" - dependencies: - "@backstage/catalog-model": ^1.4.1 - "@backstage/config": ^1.0.8 - "@backstage/core-components": ^0.13.4 - "@backstage/core-plugin-api": ^1.5.3 - "@backstage/plugin-catalog-react": ^1.8.3 - "@backstage/plugin-home-react": ^0.1.2 - "@backstage/theme": ^0.4.1 - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@rjsf/core-v5": "npm:@rjsf/core@5.7.3" - "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.7.3" - "@rjsf/utils": 5.7.3 - "@rjsf/validator-ajv8": 5.7.3 - "@types/react": ^16.13.1 || ^17.0.0 - lodash: ^4.17.21 - react-grid-layout: ^1.3.4 - react-resizable: ^3.0.4 - react-use: ^17.2.4 - zod: ~3.21.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: 9d6d77fc07507b5b861fa650eaba318af693f9c972eb33513b499eda4abba242ae75621403a59ae9a0ba1370c25229405081af208a3bd52455942cfa17aa89fe - languageName: node - linkType: hard - -"@backstage/plugin-home@workspace:^, @backstage/plugin-home@workspace:plugins/home": +"@backstage/plugin-home@^0.5.7, @backstage/plugin-home@workspace:^, @backstage/plugin-home@workspace:plugins/home": version: 0.0.0-use.local resolution: "@backstage/plugin-home@workspace:plugins/home" dependencies: @@ -8264,20 +8010,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-permission-common@npm:^0.7.7": - version: 0.7.7 - resolution: "@backstage/plugin-permission-common@npm:0.7.7" - dependencies: - "@backstage/config": ^1.0.8 - "@backstage/errors": ^1.2.1 - "@backstage/types": ^1.1.0 - cross-fetch: ^3.1.5 - uuid: ^8.0.0 - zod: ^3.21.4 - checksum: cf529acd946f667c291ed4f77947ef79737580b5396ec5cdcf4bc954238c54fe29503af8dfec0aca97ad4e378edb44e23936df6fd186bfa0f1d61f34997c4588 - languageName: node - linkType: hard - "@backstage/plugin-permission-common@workspace:^, @backstage/plugin-permission-common@workspace:plugins/permission-common": version: 0.0.0-use.local resolution: "@backstage/plugin-permission-common@workspace:plugins/permission-common" @@ -8316,25 +8048,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-permission-react@npm:^0.4.14": - version: 0.4.14 - resolution: "@backstage/plugin-permission-react@npm:0.4.14" - dependencies: - "@backstage/config": ^1.0.8 - "@backstage/core-plugin-api": ^1.5.3 - "@backstage/plugin-permission-common": ^0.7.7 - "@types/react": ^16.13.1 || ^17.0.0 - cross-fetch: ^3.1.5 - react-use: ^17.2.4 - swr: ^2.0.0 - 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: a41c652a133a5ffd54342f0dd9cf9db72be9b174bd20e04ad75a513ff9a61b00d84a2ddabcbf381473fae5e19ba76c33b121b16bfd60684758fda3b1b653955e - languageName: node - linkType: hard - "@backstage/plugin-permission-react@workspace:^, @backstage/plugin-permission-react@workspace:plugins/permission-react": version: 0.0.0-use.local resolution: "@backstage/plugin-permission-react@workspace:plugins/permission-react" @@ -9059,16 +8772,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-search-common@npm:^1.2.5": - version: 1.2.5 - resolution: "@backstage/plugin-search-common@npm:1.2.5" - dependencies: - "@backstage/plugin-permission-common": ^0.7.7 - "@backstage/types": ^1.1.0 - checksum: cd995f9dddf42c1e5ec94c4bb34103d58bce60174fc122c3db93f13f314064188b8903b0402c5ce21493d41660ab0221cb9e35ec97cdf3c28c3756e2c17edfe0 - languageName: node - linkType: hard - "@backstage/plugin-search-common@workspace:^, @backstage/plugin-search-common@workspace:plugins/search-common": version: 0.0.0-use.local resolution: "@backstage/plugin-search-common@workspace:plugins/search-common" @@ -10072,35 +9775,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/theme@npm:^0.2.16, @backstage/theme@npm:^0.2.18": - version: 0.2.19 - resolution: "@backstage/theme@npm:0.2.19" - dependencies: - "@material-ui/core": ^4.12.2 - peerDependencies: - react: ^16.13.1 || ^17.0.0 - react-dom: ^16.13.1 || ^17.0.0 - checksum: 93ca110a3f953d6d98b4a5f2163beaa1bd1f95adb66a593e85eb523a7012acf654b6148db54008a6434805a4bd9016d67e5c6a317bc56940ee6800aecbb97d6f - languageName: node - linkType: hard - -"@backstage/theme@npm:^0.4.1": - version: 0.4.1 - resolution: "@backstage/theme@npm:0.4.1" - dependencies: - "@emotion/react": ^11.10.5 - "@emotion/styled": ^11.10.5 - "@mui/material": ^5.12.2 - peerDependencies: - "@material-ui/core": ^4.12.2 - "@types/react": ^16.13.1 || ^17.0.0 - react: ^16.13.1 || ^17.0.0 - react-dom: ^16.13.1 || ^17.0.0 - checksum: eba5b177632205be97f3ef535e91a90673a89791242d7e6c07947c959459676b41fd4f912493a198955a9dc5d55b2314f81d6e7191795e16df34e940382a340d - languageName: node - linkType: hard - -"@backstage/theme@workspace:^, @backstage/theme@workspace:packages/theme": +"@backstage/theme@^0.4.1, @backstage/theme@workspace:^, @backstage/theme@workspace:packages/theme": version: 0.0.0-use.local resolution: "@backstage/theme@workspace:packages/theme" dependencies: @@ -10117,14 +9792,19 @@ __metadata: languageName: unknown linkType: soft -"@backstage/types@npm:^1.0.2, @backstage/types@npm:^1.1.0": - version: 1.1.0 - resolution: "@backstage/types@npm:1.1.0" - checksum: e93c3d10f151db087f611b1e25fb7a5ed5ec82cb3040c7bc3b04c058c6d8f889505310019707bf17a2bb3aa545e199de3f779914262a9eeaea73ff6ecc8e1dc8 +"@backstage/theme@npm:^0.2.16, @backstage/theme@npm:^0.2.18": + version: 0.2.19 + resolution: "@backstage/theme@npm:0.2.19" + dependencies: + "@material-ui/core": ^4.12.2 + peerDependencies: + react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + checksum: 93ca110a3f953d6d98b4a5f2163beaa1bd1f95adb66a593e85eb523a7012acf654b6148db54008a6434805a4bd9016d67e5c6a317bc56940ee6800aecbb97d6f languageName: node linkType: hard -"@backstage/types@workspace:^, @backstage/types@workspace:packages/types": +"@backstage/types@^1.0.2, @backstage/types@workspace:^, @backstage/types@workspace:packages/types": version: 0.0.0-use.local resolution: "@backstage/types@workspace:packages/types" dependencies: @@ -10135,20 +9815,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/version-bridge@npm:^1.0.3, @backstage/version-bridge@npm:^1.0.4": - version: 1.0.4 - resolution: "@backstage/version-bridge@npm:1.0.4" - dependencies: - "@types/react": ^16.13.1 || ^17.0.0 - 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: ae2511afcc9aded46d78b5b1788a4da6502f8fd21ebd305f748eab489bf09b87bebfdafa9926214777e80afd0fe36aa561060b675272becb0389c5f3c8fce007 - languageName: node - linkType: hard - -"@backstage/version-bridge@workspace:^, @backstage/version-bridge@workspace:packages/version-bridge": +"@backstage/version-bridge@^1.0.3, @backstage/version-bridge@workspace:^, @backstage/version-bridge@workspace:packages/version-bridge": version: 0.0.0-use.local resolution: "@backstage/version-bridge@workspace:packages/version-bridge" dependencies: @@ -14736,22 +14403,6 @@ __metadata: languageName: node linkType: hard -"@rjsf/core-v5@npm:@rjsf/core@5.7.3": - version: 5.7.3 - resolution: "@rjsf/core@npm:5.7.3" - dependencies: - lodash: ^4.17.21 - lodash-es: ^4.17.21 - markdown-to-jsx: ^7.2.0 - nanoid: ^3.3.6 - prop-types: ^15.8.1 - peerDependencies: - "@rjsf/utils": 5.7.x - react: ^16.14.0 || >=17 - checksum: bdae474fd0a6d4d8fd625ef74384a90624860841e1426b516358365a960d5627a98a1a159a6ddc59cc84659dd768ac7bba126d459c83c4f1d78acd8ad8d98f19 - languageName: node - linkType: hard - "@rjsf/core@npm:^3.2.1": version: 3.2.1 resolution: "@rjsf/core@npm:3.2.1" @@ -14784,19 +14435,6 @@ __metadata: languageName: node linkType: hard -"@rjsf/material-ui-v5@npm:@rjsf/material-ui@5.7.3": - version: 5.7.3 - resolution: "@rjsf/material-ui@npm:5.7.3" - peerDependencies: - "@material-ui/core": ^4.12.3 - "@material-ui/icons": ^4.11.2 - "@rjsf/core": 5.7.x - "@rjsf/utils": 5.7.x - react: ^16.14.0 || >=17 - checksum: 96ff2a0227b6810efd8b9e36e7e956f1e753c9cecd78215e79e9487af6276da70ee25b8c9d4678241afb85cf5ade31c3591d39659cdeda3cd52ccb6a1ada1d17 - languageName: node - linkType: hard - "@rjsf/material-ui@npm:^3.2.1": version: 3.2.1 resolution: "@rjsf/material-ui@npm:3.2.1" @@ -14824,21 +14462,6 @@ __metadata: languageName: node linkType: hard -"@rjsf/utils@npm:5.7.3": - version: 5.7.3 - resolution: "@rjsf/utils@npm:5.7.3" - dependencies: - json-schema-merge-allof: ^0.8.1 - jsonpointer: ^5.0.1 - lodash: ^4.17.21 - lodash-es: ^4.17.21 - react-is: ^18.2.0 - peerDependencies: - react: ^16.14.0 || >=17 - checksum: 30ceab80a98a33076eef3c680d079ca90bb7023d40524776fa6cce79f0dc21a5eeaec63fa786e3775b60ccee27f993d030b340d6704c3c4d23515f9d046d4354 - languageName: node - linkType: hard - "@rjsf/validator-ajv8@npm:5.13.0": version: 5.13.0 resolution: "@rjsf/validator-ajv8@npm:5.13.0" @@ -14853,20 +14476,6 @@ __metadata: languageName: node linkType: hard -"@rjsf/validator-ajv8@npm:5.7.3": - version: 5.7.3 - resolution: "@rjsf/validator-ajv8@npm:5.7.3" - dependencies: - ajv: ^8.12.0 - ajv-formats: ^2.1.1 - lodash: ^4.17.21 - lodash-es: ^4.17.21 - peerDependencies: - "@rjsf/utils": 5.7.x - checksum: 0b2ab4bf718c761a8b990f4a3894ad10af2f3d473c425dd4fdf2f1bec6d15a363ac9a012215f0cc4d9fecb0a6cf12bc4e13fd20fa782975e5c0b1e254ef8939e - languageName: node - linkType: hard - "@roadiehq/backstage-plugin-buildkite@npm:^2.0.8": version: 2.1.14 resolution: "@roadiehq/backstage-plugin-buildkite@npm:2.1.14" @@ -32480,7 +32089,7 @@ __metadata: languageName: node linkType: hard -"markdown-to-jsx@npm:^7.2.0, markdown-to-jsx@npm:^7.3.2": +"markdown-to-jsx@npm:^7.3.2": version: 7.3.2 resolution: "markdown-to-jsx@npm:7.3.2" peerDependencies: @@ -37081,20 +36690,6 @@ __metadata: languageName: node linkType: hard -"rc-progress@npm:3.4.2": - version: 3.4.2 - resolution: "rc-progress@npm:3.4.2" - dependencies: - "@babel/runtime": ^7.10.1 - classnames: ^2.2.6 - rc-util: ^5.16.1 - peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - checksum: 738aa7a7d00c1a550884bcfa55e0a55bad799f97207889bc9b43c17d2c1b66b6a42e75d635a1c6cdb1696d01f8dddcf8d7d0656356b5871b46b63343db96777b - languageName: node - linkType: hard - "rc-progress@npm:3.5.1": version: 3.5.1 resolution: "rc-progress@npm:3.5.1" @@ -43891,13 +43486,6 @@ __metadata: languageName: node linkType: hard -"zod@npm:~3.21.4": - version: 3.21.4 - resolution: "zod@npm:3.21.4" - checksum: f185ba87342ff16f7a06686767c2b2a7af41110c7edf7c1974095d8db7a73792696bcb4a00853de0d2edeb34a5b2ea6a55871bc864227dace682a0a28de33e1f - languageName: node - linkType: hard - "zustand@npm:3.6.9": version: 3.6.9 resolution: "zustand@npm:3.6.9" From 6b50e8f32c757ef953d6a5bebce880035b6a6555 Mon Sep 17 00:00:00 2001 From: David Festal Date: Wed, 20 Sep 2023 12:00:37 +0200 Subject: [PATCH 44/82] Fix unit tests failures on Windows Signed-off-by: David Festal --- .../src/manager/plugin-manager.test.ts | 35 ++-- .../scanner/plugin-scanner-watcher.test.ts | 157 ++++++++++++------ .../src/scanner/plugin-scanner.test.ts | 80 +++++---- .../src/scanner/plugin-scanner.ts | 6 +- 4 files changed, 183 insertions(+), 95 deletions(-) diff --git a/packages/backend-plugin-manager/src/manager/plugin-manager.test.ts b/packages/backend-plugin-manager/src/manager/plugin-manager.test.ts index 8a17fe082a..d7433da2d6 100644 --- a/packages/backend-plugin-manager/src/manager/plugin-manager.test.ts +++ b/packages/backend-plugin-manager/src/manager/plugin-manager.test.ts @@ -174,20 +174,23 @@ describe('backend-plugin-manager', () => { meta: { name: 'Error', message: expect.stringContaining( - `Cannot find module '${url.fileURLToPath( - location, - )}/dist/index.cjs.js' from `, + `Cannot find module '${path.resolve( + url.fileURLToPath(location), + 'dist/index.cjs.js', + )}' from `, ), _originalMessage: expect.stringContaining( - `Cannot find module '${url.fileURLToPath( - location, - )}/dist/index.cjs.js' from `, + `Cannot find module '${path.resolve( + url.fileURLToPath(location), + 'dist/index.cjs.js', + )}' from `, ), code: 'MODULE_NOT_FOUND', hint: '', - moduleName: `${url.fileURLToPath( - location, - )}/dist/index.cjs.js`, + moduleName: `${path.resolve( + url.fileURLToPath(location), + 'dist/index.cjs.js', + )}`, siblingWithSimilarExtensionFound: false, requireStack: undefined, }, @@ -351,7 +354,9 @@ describe('backend-plugin-manager', () => { }, ])('$name', async (tc: TestCase): Promise => { const plugin: ScannedPluginPackage = { - location: new URL(`file:///node_modules/jest-tests/${randomUUID()}`), + location: url.pathToFileURL( + path.resolve(`/node_modules/jest-tests/${randomUUID()}`), + ), manifest: tc.packageManifest, }; @@ -462,8 +467,8 @@ describe('backend-plugin-manager', () => { .spyOn(PluginScanner.prototype, 'scanRoot') .mockImplementation(async () => [ { - location: new URL( - 'file:///somewhere/dynamic-plugins-root/a-dynamic-plugin', + location: url.pathToFileURL( + path.resolve('/somewhere/dynamic-plugins-root/a-dynamic-plugin'), ), manifest: { name: 'test', @@ -528,10 +533,12 @@ describe('backend-plugin-manager', () => { expect(scanRootSpier).toHaveBeenCalled(); expect(mockedModuleLoader.bootstrap).toHaveBeenCalledWith( findPaths(__dirname).targetRoot, - ['/somewhere-else/a-dynamic-plugin'], + [path.resolve('/somewhere-else/a-dynamic-plugin')], ); expect(mockedModuleLoader.load).toHaveBeenCalledWith( - '/somewhere/dynamic-plugins-root/a-dynamic-plugin/dist/index.cjs.js', + path.resolve( + '/somewhere/dynamic-plugins-root/a-dynamic-plugin/dist/index.cjs.js', + ), ); }); }); diff --git a/packages/backend-plugin-manager/src/scanner/plugin-scanner-watcher.test.ts b/packages/backend-plugin-manager/src/scanner/plugin-scanner-watcher.test.ts index 5ced3cfbab..e346bf749f 100644 --- a/packages/backend-plugin-manager/src/scanner/plugin-scanner-watcher.test.ts +++ b/packages/backend-plugin-manager/src/scanner/plugin-scanner-watcher.test.ts @@ -15,7 +15,7 @@ */ import { PluginScanner } from './plugin-scanner'; -import { Logs, MockedLogger } from '../__testUtils__/testUtils'; +import { LogContent, Logs, MockedLogger } from '../__testUtils__/testUtils'; import { Config, ConfigReader } from '@backstage/config'; import path, { join } from 'path'; import { ScannedPluginPackage } from './types'; @@ -126,10 +126,16 @@ describe('plugin-scanner', () => { expect(logger.logs).toEqual({ infos: [ { - message: `rootDirectory changed (addDir - ${backstageRootDirectory}/first-dir/test-backend-plugin): scanning plugins again`, + message: `rootDirectory changed (addDir - ${path.resolve( + backstageRootDirectory, + 'first-dir/test-backend-plugin', + )}): scanning plugins again`, }, { - message: `rootDirectory changed (add - ${backstageRootDirectory}/first-dir/test-backend-plugin/package.json): scanning plugins again`, + message: `rootDirectory changed (add - ${path.resolve( + backstageRootDirectory, + 'first-dir/test-backend-plugin/package.json', + )}): scanning plugins again`, }, ], }); @@ -151,7 +157,10 @@ describe('plugin-scanner', () => { expect(logger.logs).toEqual({ infos: [ { - message: `rootDirectory changed in Config from '${backstageRootDirectory}/first-dir' to '${backstageRootDirectory}/second-dir'`, + message: `rootDirectory changed in Config from '${path.resolve( + backstageRootDirectory, + 'first-dir', + )}' to '${path.resolve(backstageRootDirectory, 'second-dir')}'`, }, ], }); @@ -204,10 +213,16 @@ describe('plugin-scanner', () => { expect(logger.logs).toEqual({ infos: [ { - message: `rootDirectory changed (addDir - ${backstageRootDirectory}/second-dir/second-test-backend-plugin): scanning plugins again`, + message: `rootDirectory changed (addDir - ${path.resolve( + backstageRootDirectory, + 'second-dir/second-test-backend-plugin', + )}): scanning plugins again`, }, { - message: `rootDirectory changed (add - ${backstageRootDirectory}/second-dir/second-test-backend-plugin/package.json): scanning plugins again`, + message: `rootDirectory changed (add - ${path.resolve( + backstageRootDirectory, + 'second-dir/second-test-backend-plugin/package.json', + )}): scanning plugins again`, }, ], }); @@ -263,22 +278,41 @@ describe('plugin-scanner', () => { expect(debug).toHaveBeenCalledTimes(4); }); - expect(logger.logs).toEqual({ - debugs: [ - { - message: `rootDirectory changed (addDir - ${backstageRootDirectory}/second-dir/second-test-backend-plugin/sub-directory): no need to scan plugins again`, - }, - { - message: `rootDirectory changed (add - ${backstageRootDirectory}/second-dir/second-test-backend-plugin/not-package.json): no need to scan plugins again`, - }, - { - message: `rootDirectory changed (unlink - ${backstageRootDirectory}/second-dir/second-test-backend-plugin/not-package.json): no need to scan plugins again`, - }, - { - message: `rootDirectory changed (unlinkDir - ${backstageRootDirectory}/second-dir/second-test-backend-plugin/sub-directory): no need to scan plugins again`, - }, - ], - }); + const onWindows = path.sep === '\\'; + // Order of events is not fixed on Windows. + // Windows sometimes even adds a 'change' event when a file is unlinked. + // So let's not try to tes the detail of received events on Windows + if (!onWindows) { + // eslint-disable-next-line + expect(logger.logs).toEqual({ + debugs: [ + { + message: `rootDirectory changed (addDir - ${path.resolve( + backstageRootDirectory, + 'second-dir/second-test-backend-plugin/sub-directory', + )}): no need to scan plugins again`, + }, + { + message: `rootDirectory changed (add - ${path.resolve( + backstageRootDirectory, + 'second-dir/second-test-backend-plugin/not-package.json', + )}): no need to scan plugins again`, + }, + { + message: `rootDirectory changed (unlink - ${path.resolve( + backstageRootDirectory, + 'second-dir/second-test-backend-plugin/not-package.json', + )}): no need to scan plugins again`, + }, + { + message: `rootDirectory changed (unlinkDir - ${path.resolve( + backstageRootDirectory, + 'second-dir/second-test-backend-plugin/sub-directory', + )}): no need to scan plugins again`, + }, + ], + }); + } logger.logs = {}; // Now check that removal of some plugin home directory triggers a new scan of plugins @@ -299,26 +333,39 @@ describe('plugin-scanner', () => { expect(scannedPlugins).toEqual([]); }); - expect(logger.logs).toEqual({ - infos: [ + if (!onWindows) { + // eslint-disable-next-line + expect(logger.logs.infos).toEqual([ { - message: `rootDirectory changed (unlink - ${backstageRootDirectory}/second-dir/second-test-backend-plugin/package.json): scanning plugins again`, + message: `rootDirectory changed (unlink - ${path.resolve( + backstageRootDirectory, + 'second-dir/second-test-backend-plugin/package.json', + )}): scanning plugins again`, }, - ], - errors: [ - { - message: `failed to load dynamic plugin manifest from '${backstageRootDirectory}/second-dir/second-test-backend-plugin'`, - meta: { - code: 'ENOENT', - errno: -2, - message: `ENOENT: no such file or directory, open '${backstageRootDirectory}/second-dir/second-test-backend-plugin/package.json'`, - name: 'Error', - path: `${backstageRootDirectory}/second-dir/second-test-backend-plugin/package.json`, - syscall: 'open', - }, + ]); + } + expect(logger.logs.errors).toEqual([ + { + message: `failed to load dynamic plugin manifest from '${path.resolve( + backstageRootDirectory, + 'second-dir/second-test-backend-plugin', + )}'`, + meta: { + code: 'ENOENT', + errno: path.sep === '\\' ? -4058 : -2, + message: `ENOENT: no such file or directory, open '${path.resolve( + backstageRootDirectory, + 'second-dir/second-test-backend-plugin/package.json', + )}'`, + name: 'Error', + path: `${path.resolve( + backstageRootDirectory, + 'second-dir/second-test-backend-plugin/package.json', + )}`, + syscall: 'open', }, - ], - }); + }, + ]); logger.logs = {}; await rm( @@ -334,13 +381,19 @@ describe('plugin-scanner', () => { }); rootDirectorySubscriber.mockClear(); - expect(logger.logs).toEqual({ - infos: [ - { - message: `rootDirectory changed (unlinkDir - ${backstageRootDirectory}/second-dir/second-test-backend-plugin): scanning plugins again`, - }, - ], - }); + if (!onWindows) { + // eslint-disable-next-line + expect(logger.logs).toEqual({ + infos: [ + { + message: `rootDirectory changed (unlinkDir - ${path.resolve( + backstageRootDirectory, + 'second-dir/second-test-backend-plugin', + )}): scanning plugins again`, + }, + ], + }); + } logger.logs = {}; getOptional.mockReturnValue({ @@ -353,8 +406,16 @@ describe('plugin-scanner', () => { { message: 'failed to apply new config for dynamic plugins', meta: { - message: `Dynamic plugins under '/somewhere-else/second-dir' cannot access backstage modules in '${backstageRootDirectory}/node_modules'. -Please add '${backstageRootDirectory}/node_modules' to the 'NODE_PATH' when running the backstage backend.`, + message: `Dynamic plugins under '${path.resolve( + '/somewhere-else/second-dir', + )}' cannot access backstage modules in '${path.resolve( + backstageRootDirectory, + 'node_modules', + )}'. +Please add '${path.resolve( + backstageRootDirectory, + 'node_modules', + )}' to the 'NODE_PATH' when running the backstage backend.`, name: 'Error', }, }, diff --git a/packages/backend-plugin-manager/src/scanner/plugin-scanner.test.ts b/packages/backend-plugin-manager/src/scanner/plugin-scanner.test.ts index 25f07baeaa..563cd9eb68 100644 --- a/packages/backend-plugin-manager/src/scanner/plugin-scanner.test.ts +++ b/packages/backend-plugin-manager/src/scanner/plugin-scanner.test.ts @@ -20,6 +20,7 @@ import { JsonObject } from '@backstage/types'; import { Logs, MockedLogger } from '../__testUtils__/testUtils'; import { ConfigReader } from '@backstage/config'; import path from 'path'; +import * as url from 'url'; import { ScannedPluginPackage } from './types'; describe('plugin-scanner', () => { @@ -73,7 +74,7 @@ describe('plugin-scanner', () => { rootDirectory: 'dist-dynamic', }, }, - expectedRootDirectory: '/backstageRoot/dist-dynamic', + expectedRootDirectory: path.resolve('/backstageRoot/dist-dynamic'), }, { name: 'valid config with absolute root directory path inside the backstage root', @@ -90,7 +91,7 @@ describe('plugin-scanner', () => { rootDirectory: '/backstageRoot/dist-dynamic', }, }, - expectedRootDirectory: '/backstageRoot/dist-dynamic', + expectedRootDirectory: path.resolve('/backstageRoot/dist-dynamic'), }, { name: 'valid config with absolute root directory path outside the backstage root', @@ -107,8 +108,14 @@ describe('plugin-scanner', () => { rootDirectory: '/somewhere/dist-dynamic', }, }, - expectedError: `Dynamic plugins under '/somewhere/dist-dynamic' cannot access backstage modules in '/backstageRoot/node_modules'. -Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the backstage backend.`, + expectedError: `Dynamic plugins under '${path.resolve( + '/somewhere/dist-dynamic', + )}' cannot access backstage modules in '${path.resolve( + '/backstageRoot/node_modules', + )}'. +Please add '${path.resolve( + '/backstageRoot/node_modules', + )}' to the 'NODE_PATH' when running the backstage backend.`, }, { name: 'valid config with absolute root directory path outside the backstage root but with backstage root included in NODE_PATH', @@ -126,9 +133,13 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac }, }, environment: { - NODE_PATH: `/somewhere-else${path.delimiter}/backstageRoot/node_modules${path.delimiter}/anywhere-else`, + NODE_PATH: `${path.resolve('/somewhere-else')}${ + path.delimiter + }${path.resolve('/backstageRoot', 'node_modules')}${ + path.delimiter + }${path.resolve('anywhere-else')}`, }, - expectedRootDirectory: '/somewhere/dist-dynamic', + expectedRootDirectory: path.resolve('/somewhere/dist-dynamic'), }, { name: 'invalid config: dynamicPlugins not an object', @@ -273,8 +284,8 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac }, expectedPluginPackages: [ { - location: new URL( - 'file:///backstageRoot/dist-dynamic/test-backend-plugin', + location: url.pathToFileURL( + path.resolve('/backstageRoot/dist-dynamic/test-backend-plugin'), ), manifest: { name: 'test-backend-plugin-dynamic', @@ -318,8 +329,8 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac }, expectedPluginPackages: [ { - location: new URL( - 'file:///backstageRoot/dist-dynamic/test-backend-plugin', + location: url.pathToFileURL( + path.resolve('/backstageRoot/dist-dynamic/test-backend-plugin'), ), manifest: { name: 'test-backend-plugin-dynamic', @@ -347,8 +358,9 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac expectedLogs: { infos: [ { - message: - "skipping '/backstageRoot/dist-dynamic/test-backend-plugin' since it is not a directory", + message: `skipping '${path.resolve( + '/backstageRoot/dist-dynamic/test-backend-plugin', + )}' since it is not a directory`, }, ], }, @@ -377,8 +389,9 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac expectedLogs: { infos: [ { - message: - "skipping '/backstageRoot/dist-dynamic/test-backend-plugin' since it is not a directory", + message: `skipping '${path.resolve( + '/backstageRoot/dist-dynamic/test-backend-plugin', + )}' since it is not a directory`, }, ], }, @@ -421,8 +434,8 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac }, expectedPluginPackages: [ { - location: new URL( - 'file:///backstageRoot/dist-dynamic/test-backend-plugin', + location: url.pathToFileURL( + path.resolve('/backstageRoot/dist-dynamic/test-backend-plugin'), ), manifest: { name: 'test-backend-plugin-dynamic', @@ -471,8 +484,10 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac }, expectedPluginPackages: [ { - location: new URL( - 'file:///backstageRoot/dist-dynamic/test-backend-plugin/alpha', + location: url.pathToFileURL( + path.resolve( + '/backstageRoot/dist-dynamic/test-backend-plugin/alpha', + ), ), manifest: { name: 'test-backend-plugin-dynamic', @@ -511,8 +526,8 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac }, expectedPluginPackages: [ { - location: new URL( - 'file:///backstageRoot/dist-dynamic/test-backend-plugin', + location: url.pathToFileURL( + path.resolve('/backstageRoot/dist-dynamic/test-backend-plugin'), ), manifest: { name: 'test-backend-plugin-dynamic', @@ -525,8 +540,9 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac expectedLogs: { warns: [ { - message: - "skipping '/backstageRoot/dist-dynamic/test-backend-plugin/alpha' since it is not a directory", + message: `skipping '${path.resolve( + '/backstageRoot/dist-dynamic/test-backend-plugin/alpha', + )}' since it is not a directory`, }, ], }, @@ -567,8 +583,9 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac expectedLogs: { errors: [ { - message: - "failed to load dynamic plugin manifest from '/backstageRoot/dist-dynamic/test-backend-plugin/alpha'", + message: `failed to load dynamic plugin manifest from '${path.resolve( + '/backstageRoot/dist-dynamic/test-backend-plugin/alpha', + )}'`, meta: { name: 'SyntaxError', message: 'Unexpected token i in JSON at position 0', @@ -600,8 +617,9 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac expectedLogs: { errors: [ { - message: - "failed to load dynamic plugin manifest from '/backstageRoot/dist-dynamic/test-backend-plugin'", + message: `failed to load dynamic plugin manifest from '${path.resolve( + '/backstageRoot/dist-dynamic/test-backend-plugin', + )}'`, meta: { name: 'SyntaxError', message: 'Unexpected token i in JSON at position 0', @@ -637,8 +655,9 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac expectedLogs: { errors: [ { - message: - "failed to load dynamic plugin manifest from '/backstageRoot/dist-dynamic/test-backend-plugin'", + message: `failed to load dynamic plugin manifest from '${path.resolve( + '/backstageRoot/dist-dynamic/test-backend-plugin', + )}'`, meta: { name: 'Error', message: "field 'backstage.role' not found in 'package.json'", @@ -674,8 +693,9 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac expectedLogs: { errors: [ { - message: - "failed to load dynamic plugin manifest from '/backstageRoot/dist-dynamic/test-backend-plugin'", + message: `failed to load dynamic plugin manifest from '${path.resolve( + '/backstageRoot/dist-dynamic/test-backend-plugin', + )}'`, meta: { name: 'Error', message: "field 'main' not found in 'package.json'", diff --git a/packages/backend-plugin-manager/src/scanner/plugin-scanner.ts b/packages/backend-plugin-manager/src/scanner/plugin-scanner.ts index bdcf786619..e226a1a8ad 100644 --- a/packages/backend-plugin-manager/src/scanner/plugin-scanner.ts +++ b/packages/backend-plugin-manager/src/scanner/plugin-scanner.ts @@ -84,13 +84,13 @@ export class PluginScanner { } const dynamicPluginsRootPath = path.isAbsolute(dynamicPlugins.rootDirectory) - ? dynamicPlugins.rootDirectory + ? path.resolve(dynamicPlugins.rootDirectory) : path.resolve(this.backstageRoot, dynamicPlugins.rootDirectory); if ( !path - .dirname(path.normalize(dynamicPluginsRootPath)) - .startsWith(path.normalize(this.backstageRoot)) + .dirname(dynamicPluginsRootPath) + .startsWith(path.resolve(this.backstageRoot)) ) { const nodePath = process.env.NODE_PATH; const backstageNodeModules = path.resolve( From 8afb3906068dab8f3911d80ed79d43d622d7f905 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 19 Sep 2023 18:52:00 +0200 Subject: [PATCH 45/82] docs: 1.18 release notes Signed-off-by: Patrik Oldsberg --- docs/releases/v1.18.0.md | 127 +++++++++++++++++++++++++++++++++ microsite/docusaurus.config.js | 2 +- microsite/sidebars.json | 1 + 3 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 docs/releases/v1.18.0.md diff --git a/docs/releases/v1.18.0.md b/docs/releases/v1.18.0.md new file mode 100644 index 0000000000..fe59ae2403 --- /dev/null +++ b/docs/releases/v1.18.0.md @@ -0,0 +1,127 @@ +--- +id: v1.18.0 +title: v1.18.0 +description: Backstage Release v1.18.0 +--- + +These are the release notes for the v1.18.0 release of [Backstage](https://backstage.io/). + +A huge thanks to the whole team of maintainers and contributors as well as the amazing Backstage Community for the hard work in getting this release developed and done. + +## Highlights + +### **BREAKING**: Kubernetes backend auth strategies + +Integrators can now bring their own auth strategies through the use of the `addAuthStrategy` method on `KubernetesBuilder`. As part of this, `setAuthTranslatorMap` has also been removed and the concept moves into the auth strategies instead. + +Contributed by [@jamieklassen](https://github.com/jamieklassen) in [#19903](https://github.com/backstage/backstage/pull/19903) + +### **BREAKING**: Public GitLab User/Group Ingestion + +If you ingest users/groups from GitLab using `GitlabOrgDiscoveryEntityProvider`, you now have to scope its work to a certain group. The backend will not start up successfully without that. + +```diff +catalog: + providers: + gitlab: + yourProviderId: + host: gitlab.com + orgEnabled: true ++ group: org/teams +``` + +Contributed by [@sbarrypoppulo](https://github.com/sbarrypoppulo) in [#18889](https://github.com/backstage/backstage/pull/18889) + +### New plugin: OpenCost + +There’s a new [OpenCost](https://www.opencost.io/) plugin that provides a port of the latest OpenCost UI to Backstage. The [plugin's README](https://github.com/backstage/backstage/blob/master/plugins/opencost/README.md) covers installation and configuration. + +Contributed by [@mattray](https://github.com/mattray) in [#18383](https://github.com/backstage/backstage/pull/18383) + +### TypeScript 5.0 + +The minimum TypeScript version is now v5.0, please make sure that you upgrade the TypeScript dependency in your own projects accordingly. + +### Backend System: Ready for use! + +We believe that we have now reached a point where we want to encourage use of the [New Backend System](https://backstage.io/docs/backend-system/). There are still things to iron out and plugins to be migrated, but we consider it to be ready for production use. Please check out the [migration guide for backends](https://backstage.io/docs/backend-system/building-backends/migrating), and use the `legacyPlugin` helper to install any plugins that are not ready for use directly with the new system. + +For local development we also encourage you to try out the new `package start` command for backends in the CLI, which you enable by setting `EXPERIMENTAL_BACKEND_START=1` in the environment. This new way of running the backend no longer uses Webpack, in favor of a more plain watch mode with module loaders. It does however still maintain the SQLite database state across restarts without filesystem overhead. If all goes according to plan this will be the new default starting from the next release. + +### Backend System: Default Exports + +Plugins and modules leveraging the [New Backend System](https://backstage.io/docs/backend-system/) are now supposed to be _the default export_ of their respective packages. This clarifies what the main entrypoint of each package is, facilitates automatic feature discovery, and also lets you easily make dynamic import one-liners in your code. We have made this change to a lot of the packages that had already been migrated to the new backend system. So after upgrading to this version of Backstage, you may find that imports in your backend package no longer match. + +For example, if you are currently importing plugins using the following pattern: + +```ts +import { examplePlugin } from '@backstage/plugin-example-backend'; +backend.add(examplePlugin); +``` + +They may now need to be migrated to: + +```ts +backend.add(import('@backstage/plugin-example-backend')); +``` + +### `yarn fix` and `"sideEffects": false` + +The CLI has received a new `backstage-cli fix` command, typically configured to be run as `yarn fix`. The command will scan through all packages in the project and make sure that they are declared correctly. Initially it will make sure that package exports are declared correctly, replacing the `backstage-cli migrate package-exports` command, as well as making sure that frontend packages set `"sideEffects": false`. The latter fix has been applied to all `@backstage/*` packages as well, which allows for more optimized frontend builds. + +### Auth Backend Improvements + +The `@backstage/plugin-auth-backend` now has support for the new backend system, as well as installing auth providers via modules. As part of this the auth backend has received a substantial redesign, with all of the APIs needed to build your own providers now exported from `@backstage/plugin-auth-node`. It is now also possible to configure fixed sign-in resolvers via static configuration for a limited number of providers. + +You can read more about these changes in the [`@backstage/plugin-auth-node` changelog](https://github.com/backstage/backstage/blob/master/plugins/auth-node/CHANGELOG.md#030). + +### Experimental I18n Support + +A new set of experimental APIs have been added to the frontend system to support internationalization. This allows for both translations to other languages, as well as overriding default messages. Partial support has so far been added to the `@backstage/plugin-user-settings` and `@backstage/plugin-adr` plugins. See [the docs](https://backstage.io/docs/plugins/internationalization) for more details. + +### Experimental Packages for Frontend Declarative Integration + +Two new packages have been added to support the work towards frontend declarative integration: `@backstage/frontend-plugin-api` and `@backstage/frontend-app-api`. These packages are still highly experimental and should not be used. + +### Improved Auth Session Expiration + +The session expiration check has been improved for all auth providers. The expiration of both the Backstage identity token as well as provider specific tokens will be considered when deciding whether the session has expired. + +### Scaffolder Template Editor Download + +It is now possible to download the results of a dry-run as a zip archive from the template editor dry-run results view. + +### Support for Multiple Azure DevOps Organizations + +The integration for Azure DevOps now allows for configuration of separate credentials for different organizations. See the [documentation](https://backstage.io/docs/integrations/azure/locations/) for more information. Contributed by [@sanderaernouts](https://github.com/sanderaernouts) in [#18213](https://github.com/backstage/backstage/pull/18213) + +### New package: `@backstage/plugin-catalog-backend-module-scaffolder-entity-model` + +The Scaffolder’s integrations into the catalog have a new dedicated home. The `ScaffolderEntitiesProcessor` and its corresponding New Backend System `catalogModuleScaffolderEntityModel` now should be imported from here, since they have been deprecated in the Scaffolder backend plugin package. + +### Further MySQL compatibility work + +Great efforts have been made by VMware to move the needle in terms of better MySQL support across the core and plugins. Check out the PR for details! + +Contributed by [@PeteLevineA](https://github.com/PeteLevineA) in [#18921](https://github.com/backstage/backstage/pull/18921) + +## Security Fixes + +This release does not contain any security fixes. + +## Upgrade path + +We recommend that you keep your Backstage project up to date with this latest release. For more guidance on how to upgrade, check out the documentation for [keeping Backstage updated](https://backstage.io/docs/getting-started/keeping-backstage-updated). + +## Links and References + +Below you can find a list of links and references to help you learn about and start using this new release. + +- [Backstage official website](https://backstage.io/), [documentation](https://backstage.io/docs/), and [getting started guide](https://backstage.io/docs/getting-started/) +- [GitHub repository](https://github.com/backstage/backstage) +- Backstage's [versioning and support policy](https://backstage.io/docs/overview/versioning-policy) +- [Community Discord](https://discord.gg/backstage-687207715902193673) for discussions and support +- [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.18.0-changelog.md) +- Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) + +Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. diff --git a/microsite/docusaurus.config.js b/microsite/docusaurus.config.js index a55ad01a35..a7df33623a 100644 --- a/microsite/docusaurus.config.js +++ b/microsite/docusaurus.config.js @@ -177,7 +177,7 @@ module.exports = { position: 'left', }, { - to: 'docs/releases/v1.17.0', + to: 'docs/releases/v1.18.0', label: 'Releases', position: 'left', }, diff --git a/microsite/sidebars.json b/microsite/sidebars.json index a46154937b..43fd920b6a 100644 --- a/microsite/sidebars.json +++ b/microsite/sidebars.json @@ -1,6 +1,7 @@ { "releases": { "Release Notes": [ + "releases/v1.18.0", "releases/v1.17.0", "releases/v1.16.0", "releases/v1.15.0", From 4a5c36da822f88b7e31a8fce267f81d11822ab02 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 19 Sep 2023 18:52:25 +0200 Subject: [PATCH 46/82] microsite: make backend system docs more visible in sidebar Signed-off-by: Patrik Oldsberg --- microsite/sidebars.json | 74 ++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/microsite/sidebars.json b/microsite/sidebars.json index 43fd920b6a..3db2ab754d 100644 --- a/microsite/sidebars.json +++ b/microsite/sidebars.json @@ -342,6 +342,43 @@ "items": ["deployment/backstage-deploy/aws-lightsail"] } ], + "New Backend System": [ + "backend-system/index", + { + "type": "category", + "label": "Architecture", + "items": [ + "backend-system/architecture/index", + "backend-system/architecture/services", + "backend-system/architecture/plugins", + "backend-system/architecture/extension-points", + "backend-system/architecture/modules", + "backend-system/architecture/naming-patterns" + ] + }, + { + "type": "category", + "label": "Building Backends", + "items": [ + "backend-system/building-backends/index", + "backend-system/building-backends/migrating" + ] + }, + { + "type": "category", + "label": "Building Plugins & Modules", + "items": [ + "backend-system/building-plugins-and-modules/index", + "backend-system/building-plugins-and-modules/testing", + "backend-system/building-plugins-and-modules/migrating" + ] + }, + { + "type": "category", + "label": "Core Services", + "items": ["backend-system/core-services/index"] + } + ], "Designing for Backstage": [ "dls/design", "dls/component-design-guidelines", @@ -389,43 +426,6 @@ "architecture-decisions/adrs-adr013" ], "FAQ": ["FAQ"], - "Experimental Backend System": [ - "backend-system/index", - { - "type": "category", - "label": "Architecture", - "items": [ - "backend-system/architecture/index", - "backend-system/architecture/services", - "backend-system/architecture/plugins", - "backend-system/architecture/extension-points", - "backend-system/architecture/modules", - "backend-system/architecture/naming-patterns" - ] - }, - { - "type": "category", - "label": "Building Backends", - "items": [ - "backend-system/building-backends/index", - "backend-system/building-backends/migrating" - ] - }, - { - "type": "category", - "label": "Building Plugins & Modules", - "items": [ - "backend-system/building-plugins-and-modules/index", - "backend-system/building-plugins-and-modules/testing", - "backend-system/building-plugins-and-modules/migrating" - ] - }, - { - "type": "category", - "label": "Core Services", - "items": ["backend-system/core-services/index"] - } - ], "Accessibility": ["accessibility/index"] } } From 21cd3b1b24c4182c7b371a2426036b0103920f6a Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 19 Sep 2023 19:06:37 +0200 Subject: [PATCH 47/82] cli: added node-library template Signed-off-by: Patrik Oldsberg --- .changeset/pretty-steaks-serve.md | 5 + packages/cli/src/lib/new/factories/index.ts | 1 + .../new/factories/nodeLibraryPackage.test.ts | 152 ++++++++++++++++++ .../lib/new/factories/nodeLibraryPackage.ts | 71 ++++++++ .../node-library-package/.eslintrc.js | 1 + .../node-library-package/README.md.hbs | 12 ++ .../node-library-package/package.json.hbs | 36 +++++ .../node-library-package/src/index.ts.hbs | 1 + .../node-library-package/src/setupTests.ts | 1 + .../node-library-package/tsconfig.json | 11 ++ 10 files changed, 291 insertions(+) create mode 100644 .changeset/pretty-steaks-serve.md create mode 100644 packages/cli/src/lib/new/factories/nodeLibraryPackage.test.ts create mode 100644 packages/cli/src/lib/new/factories/nodeLibraryPackage.ts create mode 100644 packages/cli/templates/node-library-package/.eslintrc.js create mode 100644 packages/cli/templates/node-library-package/README.md.hbs create mode 100644 packages/cli/templates/node-library-package/package.json.hbs create mode 100644 packages/cli/templates/node-library-package/src/index.ts.hbs create mode 100644 packages/cli/templates/node-library-package/src/setupTests.ts create mode 100644 packages/cli/templates/node-library-package/tsconfig.json diff --git a/.changeset/pretty-steaks-serve.md b/.changeset/pretty-steaks-serve.md new file mode 100644 index 0000000000..8ec78e0aea --- /dev/null +++ b/.changeset/pretty-steaks-serve.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Added a template for creating `node-library` packages with `yarn new`. diff --git a/packages/cli/src/lib/new/factories/index.ts b/packages/cli/src/lib/new/factories/index.ts index a4bcb2b721..44d687eda2 100644 --- a/packages/cli/src/lib/new/factories/index.ts +++ b/packages/cli/src/lib/new/factories/index.ts @@ -17,6 +17,7 @@ export { frontendPlugin } from './frontendPlugin'; export { backendPlugin } from './backendPlugin'; export { backendModule } from './backendModule'; +export { nodeLibraryPackage } from './nodeLibraryPackage'; export { webLibraryPackage } from './webLibraryPackage'; export { pluginCommon } from './pluginCommon'; export { pluginNode } from './pluginNode'; diff --git a/packages/cli/src/lib/new/factories/nodeLibraryPackage.test.ts b/packages/cli/src/lib/new/factories/nodeLibraryPackage.test.ts new file mode 100644 index 0000000000..d0b08f4f06 --- /dev/null +++ b/packages/cli/src/lib/new/factories/nodeLibraryPackage.test.ts @@ -0,0 +1,152 @@ +/* + * 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 fs from 'fs-extra'; +import mockFs from 'mock-fs'; +import { resolve as resolvePath, join as joinPath } from 'path'; +import { paths } from '../../paths'; +import { Task } from '../../tasks'; +import { FactoryRegistry } from '../FactoryRegistry'; +import { createMockOutputStream, mockPaths } from './common/testUtils'; +import { nodeLibraryPackage } from './nodeLibraryPackage'; + +describe('nodeLibraryPackage factory', () => { + beforeEach(() => { + mockPaths({ + targetRoot: '/root', + }); + }); + + afterEach(() => { + mockFs.restore(); + jest.resetAllMocks(); + }); + + it('should create a node library package', async () => { + const expectedNodeLibraryPackageName = 'test'; + + mockFs({ + '/root': { + packages: mockFs.directory(), + }, + [paths.resolveOwn('templates')]: mockFs.load( + paths.resolveOwn('templates'), + ), + }); + + const options = await FactoryRegistry.populateOptions(nodeLibraryPackage, { + id: 'test', // name of node library package + }); + + let modified = false; + + const [output, mockStream] = createMockOutputStream(); + jest.spyOn(process, 'stderr', 'get').mockReturnValue(mockStream); + jest.spyOn(Task, 'forCommand').mockResolvedValue(); + + await nodeLibraryPackage.create(options, { + private: true, + isMonoRepo: true, + defaultVersion: '1.0.0', + markAsModified: () => { + modified = true; + }, + createTemporaryDirectory: () => fs.mkdtemp('test'), + }); + + expect(modified).toBe(true); + + expect(output).toEqual([ + '', + `Creating node-library package ${expectedNodeLibraryPackageName}`, + 'Checking Prerequisites:', + `availability ${joinPath('packages', expectedNodeLibraryPackageName)}`, + 'creating temp dir', + 'Executing Template:', + 'copying .eslintrc.js', + 'templating README.md.hbs', + 'templating package.json.hbs', + 'templating index.ts.hbs', + 'copying setupTests.ts', + 'Installing:', + `moving ${joinPath('packages', expectedNodeLibraryPackageName)}`, + ]); + + await expect( + fs.readJson( + `/root/packages/${expectedNodeLibraryPackageName}/package.json`, + ), + ).resolves.toEqual( + expect.objectContaining({ + name: expectedNodeLibraryPackageName, + private: true, + version: '1.0.0', + }), + ); + + expect(Task.forCommand).toHaveBeenCalledTimes(2); + expect(Task.forCommand).toHaveBeenCalledWith('yarn install', { + cwd: resolvePath(`/root/packages/${expectedNodeLibraryPackageName}`), + optional: true, + }); + expect(Task.forCommand).toHaveBeenCalledWith('yarn lint --fix', { + cwd: resolvePath(`/root/packages/${expectedNodeLibraryPackageName}`), + optional: true, + }); + }); + + it('should create a node library plugin with options and codeowners', async () => { + const expectedNodeLibraryPackageName = 'test'; + + mockFs({ + '/root': { + CODEOWNERS: '', + packages: mockFs.directory(), + }, + [paths.resolveOwn('templates')]: mockFs.load( + paths.resolveOwn('templates'), + ), + }); + + const options = await FactoryRegistry.populateOptions(nodeLibraryPackage, { + id: 'test', + owner: '@backstage/test-owners', + }); + + const [, mockStream] = createMockOutputStream(); + jest.spyOn(process, 'stderr', 'get').mockReturnValue(mockStream); + jest.spyOn(Task, 'forCommand').mockResolvedValue(); + + await nodeLibraryPackage.create(options, { + scope: 'internal', + private: true, + isMonoRepo: false, + defaultVersion: '1.0.0', + markAsModified: () => {}, + createTemporaryDirectory: () => fs.mkdtemp('test'), + }); + + expect(Task.forCommand).toHaveBeenCalledTimes(2); + expect(Task.forCommand).toHaveBeenCalledWith('yarn install', { + cwd: resolvePath(`/root/${expectedNodeLibraryPackageName}`), + optional: true, + }); + expect(Task.forCommand).toHaveBeenCalledWith('yarn lint --fix', { + cwd: resolvePath(`/root/${expectedNodeLibraryPackageName}`), + optional: true, + }); + }); +}); diff --git a/packages/cli/src/lib/new/factories/nodeLibraryPackage.ts b/packages/cli/src/lib/new/factories/nodeLibraryPackage.ts new file mode 100644 index 0000000000..4b1fda4abc --- /dev/null +++ b/packages/cli/src/lib/new/factories/nodeLibraryPackage.ts @@ -0,0 +1,71 @@ +/* + * 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 chalk from 'chalk'; +import { paths } from '../../paths'; +import { addCodeownersEntry, getCodeownersFilePath } from '../../codeowners'; +import { createFactory, CreateContext } from '../types'; +import { Task } from '../../tasks'; +import { ownerPrompt, pluginIdPrompt } from './common/prompts'; +import { executePluginPackageTemplate } from './common/tasks'; + +type Options = { + id: string; + owner?: string; + codeOwnersPath?: string; +}; + +export const nodeLibraryPackage = createFactory({ + name: 'node-library', + description: 'A new node-library package', + optionsDiscovery: async () => ({ + codeOwnersPath: await getCodeownersFilePath(paths.targetRoot), + }), + optionsPrompts: [pluginIdPrompt(), ownerPrompt()], + async create(options: Options, ctx: CreateContext) { + const { id } = options; + const name = ctx.scope ? `@${ctx.scope}/${id}` : `${id}`; + + Task.log(); + Task.log(`Creating node-library package ${chalk.cyan(name)}`); + + const targetDir = ctx.isMonoRepo + ? paths.resolveTargetRoot('packages', id) + : paths.resolveTargetRoot(`${id}`); + + await executePluginPackageTemplate(ctx, { + targetDir, + templateName: 'node-library-package', + values: { + id, + name, + pluginVersion: ctx.defaultVersion, + privatePackage: ctx.private, + npmRegistry: ctx.npmRegistry, + }, + }); + + if (options.owner) { + await addCodeownersEntry(`/packages/${id}`, options.owner); + } + + await Task.forCommand('yarn install', { cwd: targetDir, optional: true }); + await Task.forCommand('yarn lint --fix', { + cwd: targetDir, + optional: true, + }); + }, +}); diff --git a/packages/cli/templates/node-library-package/.eslintrc.js b/packages/cli/templates/node-library-package/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/packages/cli/templates/node-library-package/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/packages/cli/templates/node-library-package/README.md.hbs b/packages/cli/templates/node-library-package/README.md.hbs new file mode 100644 index 0000000000..0e2813c87a --- /dev/null +++ b/packages/cli/templates/node-library-package/README.md.hbs @@ -0,0 +1,12 @@ +# {{name}} + +_This package was created through the Backstage CLI_. + +## Installation + +Install the package via Yarn: + +```sh +cd # if within a monorepo +yarn add {{name}} +``` diff --git a/packages/cli/templates/node-library-package/package.json.hbs b/packages/cli/templates/node-library-package/package.json.hbs new file mode 100644 index 0000000000..a6ede31893 --- /dev/null +++ b/packages/cli/templates/node-library-package/package.json.hbs @@ -0,0 +1,36 @@ +{ + "name": "{{name}}", + "version": "{{pluginVersion}}", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", +{{#if privatePackage}} + "private": {{privatePackage}}, +{{/if}} + "publishConfig": { +{{#if npmRegistry}} + "registry": "{{npmRegistry}}", +{{/if}} + "access": "public", + "main": "dist/index.cjs.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "node-library" + }, + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack" + }, + "devDependencies": { + "@backstage/cli": "{{versionQuery '@backstage/cli'}}" + }, + "files": [ + "dist" + ] +} diff --git a/packages/cli/templates/node-library-package/src/index.ts.hbs b/packages/cli/templates/node-library-package/src/index.ts.hbs new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/packages/cli/templates/node-library-package/src/index.ts.hbs @@ -0,0 +1 @@ +export {}; diff --git a/packages/cli/templates/node-library-package/src/setupTests.ts b/packages/cli/templates/node-library-package/src/setupTests.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/packages/cli/templates/node-library-package/src/setupTests.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/cli/templates/node-library-package/tsconfig.json b/packages/cli/templates/node-library-package/tsconfig.json new file mode 100644 index 0000000000..ce3409d31f --- /dev/null +++ b/packages/cli/templates/node-library-package/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "@backstage/cli/config/tsconfig.json", + "include": [ + "src", + ], + "exclude": ["node_modules"], + "compilerOptions": { + "outDir": "dist-types", + "rootDir": "." + } +} From c0876813eb57cd6a1db395ba5a36e9649abaa2f1 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 23 Aug 2023 19:36:23 +0200 Subject: [PATCH 48/82] .github/workflows: switch to Node.js v18 + v20 Signed-off-by: Patrik Oldsberg --- .github/workflows/ci-noop.yml | 4 ++-- .github/workflows/ci.yml | 6 +++--- .github/workflows/deploy_packages.yml | 4 ++-- .github/workflows/sync_release-manifest.yml | 2 +- .github/workflows/uffizzi-build.yml | 4 ++-- .github/workflows/verify_accessibility.yml | 6 +++--- .github/workflows/verify_e2e-kubernetes-noop.yml | 2 +- .github/workflows/verify_e2e-kubernetes.yml | 2 +- .github/workflows/verify_e2e-linux-noop.yml | 2 +- .github/workflows/verify_e2e-linux.yml | 2 +- .github/workflows/verify_e2e-techdocs.yml | 2 +- .github/workflows/verify_e2e-windows-noop.yml | 2 +- .github/workflows/verify_e2e-windows.yml | 2 +- .github/workflows/verify_storybook.yml | 2 +- .github/workflows/verify_windows.yml | 2 +- 15 files changed, 22 insertions(+), 22 deletions(-) diff --git a/.github/workflows/ci-noop.yml b/.github/workflows/ci-noop.yml index d636a06eb8..16bf11dd1a 100644 --- a/.github/workflows/ci-noop.yml +++ b/.github/workflows/ci-noop.yml @@ -15,7 +15,7 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] name: Verify ${{ matrix.node-version }} steps: @@ -26,7 +26,7 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] name: Test ${{ matrix.node-version }} steps: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4afe9c88ce..12c19075a6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] env: CI: true @@ -49,7 +49,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] env: CI: true @@ -139,7 +139,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] name: Test ${{ matrix.node-version }} services: diff --git a/.github/workflows/deploy_packages.yml b/.github/workflows/deploy_packages.yml index ce9a2648ee..2329101eb0 100644 --- a/.github/workflows/deploy_packages.yml +++ b/.github/workflows/deploy_packages.yml @@ -14,7 +14,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] services: postgres13: @@ -130,7 +130,7 @@ jobs: strategy: matrix: - node-version: [16.x] + node-version: [18.x] env: CI: 'true' diff --git a/.github/workflows/sync_release-manifest.yml b/.github/workflows/sync_release-manifest.yml index 8cf6991aaf..df8d3909f4 100644 --- a/.github/workflows/sync_release-manifest.yml +++ b/.github/workflows/sync_release-manifest.yml @@ -10,7 +10,7 @@ jobs: # Setup node & install deps before checkout, keeping install quick - uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18.x - name: Install dependencies # Just the deps for the assemble manifest script run: npm install semver@7.3.5 fs-extra@10.0.0 @manypkg/get-packages@1.1.1 diff --git a/.github/workflows/uffizzi-build.yml b/.github/workflows/uffizzi-build.yml index a018537daf..1bcd5ebcd8 100644 --- a/.github/workflows/uffizzi-build.yml +++ b/.github/workflows/uffizzi-build.yml @@ -25,13 +25,13 @@ jobs: - name: setup-node uses: actions/setup-node@v3 with: - node-version: 16.x + node-version: 18.x registry-url: https://registry.npmjs.org/ - name: yarn install uses: backstage/actions/yarn-install@v0.6.4 with: - cache-prefix: linux-v16 + cache-prefix: linux-v18 - name: Use Uffizzi's backstage app config run: | diff --git a/.github/workflows/verify_accessibility.yml b/.github/workflows/verify_accessibility.yml index 11c0ca41b6..32ded3bd3a 100644 --- a/.github/workflows/verify_accessibility.yml +++ b/.github/workflows/verify_accessibility.yml @@ -20,14 +20,14 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - name: Use Node.js 16.x + - name: Use Node.js 18.x uses: actions/setup-node@v3 with: - node-version: 16.x + node-version: 18.x - name: yarn install uses: backstage/actions/yarn-install@v0.6.4 with: - cache-prefix: ${{ runner.os }}-v16.x + cache-prefix: ${{ runner.os }}-v18.x - name: run Lighthouse CI run: | yarn dlx @lhci/cli@0.11.x autorun diff --git a/.github/workflows/verify_e2e-kubernetes-noop.yml b/.github/workflows/verify_e2e-kubernetes-noop.yml index ac49fbc469..bedf357079 100644 --- a/.github/workflows/verify_e2e-kubernetes-noop.yml +++ b/.github/workflows/verify_e2e-kubernetes-noop.yml @@ -15,7 +15,7 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] name: Kubernetes ${{ matrix.node-version }} steps: diff --git a/.github/workflows/verify_e2e-kubernetes.yml b/.github/workflows/verify_e2e-kubernetes.yml index 4c25c259c5..0c78c1f933 100644 --- a/.github/workflows/verify_e2e-kubernetes.yml +++ b/.github/workflows/verify_e2e-kubernetes.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] env: CI: true diff --git a/.github/workflows/verify_e2e-linux-noop.yml b/.github/workflows/verify_e2e-linux-noop.yml index 57dc75c272..1384b83378 100644 --- a/.github/workflows/verify_e2e-linux-noop.yml +++ b/.github/workflows/verify_e2e-linux-noop.yml @@ -20,7 +20,7 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] name: E2E Linux ${{ matrix.node-version }} steps: diff --git a/.github/workflows/verify_e2e-linux.yml b/.github/workflows/verify_e2e-linux.yml index 33cc4f83ec..61ce55e385 100644 --- a/.github/workflows/verify_e2e-linux.yml +++ b/.github/workflows/verify_e2e-linux.yml @@ -31,7 +31,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] env: CI: true diff --git a/.github/workflows/verify_e2e-techdocs.yml b/.github/workflows/verify_e2e-techdocs.yml index bf46d2c954..fd5c4f0956 100644 --- a/.github/workflows/verify_e2e-techdocs.yml +++ b/.github/workflows/verify_e2e-techdocs.yml @@ -18,7 +18,7 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] env: CI: true diff --git a/.github/workflows/verify_e2e-windows-noop.yml b/.github/workflows/verify_e2e-windows-noop.yml index a10722e865..f042c350c2 100644 --- a/.github/workflows/verify_e2e-windows-noop.yml +++ b/.github/workflows/verify_e2e-windows-noop.yml @@ -17,7 +17,7 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] name: E2E Windows ${{ matrix.node-version }} steps: diff --git a/.github/workflows/verify_e2e-windows.yml b/.github/workflows/verify_e2e-windows.yml index 5a2f0a5fc1..4413312597 100644 --- a/.github/workflows/verify_e2e-windows.yml +++ b/.github/workflows/verify_e2e-windows.yml @@ -22,7 +22,7 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] env: CI: true diff --git a/.github/workflows/verify_storybook.yml b/.github/workflows/verify_storybook.yml index b1d370ec3f..bcb0cfe178 100644 --- a/.github/workflows/verify_storybook.yml +++ b/.github/workflows/verify_storybook.yml @@ -23,7 +23,7 @@ jobs: strategy: matrix: os: [ubuntu-latest] - node-version: [16.x] + node-version: [18.x] name: Storybook steps: diff --git a/.github/workflows/verify_windows.yml b/.github/workflows/verify_windows.yml index 916dd53366..e5d3adf013 100644 --- a/.github/workflows/verify_windows.yml +++ b/.github/workflows/verify_windows.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] env: CI: true From 5899bf04f6cb1b2e0ef1537e9c197e4a72776aae Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 23 Aug 2023 19:42:55 +0200 Subject: [PATCH 49/82] root: move to Node.js 18 + 20 Signed-off-by: Patrik Oldsberg --- package.json | 2 +- packages/create-app/templates/default-app/package.json.hbs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b1b4f0f268..e110be4ec1 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "root", "private": true, "engines": { - "node": "16 || 18" + "node": "18 || 20" }, "scripts": { "dev": "concurrently 'yarn start' 'yarn start-backend'", diff --git a/packages/create-app/templates/default-app/package.json.hbs b/packages/create-app/templates/default-app/package.json.hbs index 315d039187..9715331d8f 100644 --- a/packages/create-app/templates/default-app/package.json.hbs +++ b/packages/create-app/templates/default-app/package.json.hbs @@ -3,7 +3,7 @@ "version": "1.0.0", "private": true, "engines": { - "node": "16 || 18" + "node": "18 || 20" }, "scripts": { "dev": "concurrently \"yarn start\" \"yarn start-backend\"", From de42eebaafc5d457cfae88fd171891e2514d0a86 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 23 Aug 2023 19:49:57 +0200 Subject: [PATCH 50/82] bump @types/node dep to ^18 Signed-off-by: Patrik Oldsberg --- .changeset/silent-years-bake.md | 11 ++++++ package.json | 2 +- packages/cli-common/package.json | 2 +- packages/cli/package.json | 2 +- packages/codemods/package.json | 2 +- packages/create-app/package.json | 2 +- packages/e2e-test/package.json | 2 +- packages/repo-tools/package.json | 2 +- packages/techdocs-cli/package.json | 2 +- .../package.json | 2 +- yarn.lock | 34 +++++++++---------- 11 files changed, 37 insertions(+), 26 deletions(-) create mode 100644 .changeset/silent-years-bake.md diff --git a/.changeset/silent-years-bake.md b/.changeset/silent-years-bake.md new file mode 100644 index 0000000000..b7adbc4f63 --- /dev/null +++ b/.changeset/silent-years-bake.md @@ -0,0 +1,11 @@ +--- +'@backstage/plugin-scaffolder-backend-module-rails': patch +'@techdocs/cli': patch +'@backstage/cli': patch +'@backstage/cli-common': patch +'@backstage/create-app': patch +'@backstage/codemods': patch +'@backstage/repo-tools': patch +--- + +Bumped `@types/node` dependency to `^18.17.8`. diff --git a/package.json b/package.json index e110be4ec1..0cc12b7214 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "@spotify/eslint-plugin": "^14.1.3", "@spotify/prettier-config": "^14.0.0", "@techdocs/cli": "workspace:*", - "@types/node": "^16.11.26", + "@types/node": "^18.17.8", "@types/webpack": "^5.28.0", "command-exists": "^1.2.9", "concurrently": "^8.0.0", diff --git a/packages/cli-common/package.json b/packages/cli-common/package.json index 38779eba07..55e6e1f792 100644 --- a/packages/cli-common/package.json +++ b/packages/cli-common/package.json @@ -33,7 +33,7 @@ }, "devDependencies": { "@backstage/cli": "workspace:^", - "@types/node": "^16.0.0" + "@types/node": "^18.17.8" }, "files": [ "dist" diff --git a/packages/cli/package.json b/packages/cli/package.json index 0b641275f9..66f82f8e44 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -158,7 +158,7 @@ "@types/inquirer": "^8.1.3", "@types/minimatch": "^5.0.0", "@types/mock-fs": "^4.13.0", - "@types/node": "^16.11.26", + "@types/node": "^18.17.8", "@types/npm-packlist": "^3.0.0", "@types/recursive-readdir": "^2.2.0", "@types/rollup-plugin-peer-deps-external": "^2.2.0", diff --git a/packages/codemods/package.json b/packages/codemods/package.json index ccbc20926b..484127928a 100644 --- a/packages/codemods/package.json +++ b/packages/codemods/package.json @@ -42,7 +42,7 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@types/jscodeshift": "^0.11.0", - "@types/node": "^16.11.26", + "@types/node": "^18.17.8", "ts-node": "^10.0.0" }, "nodemonConfig": { diff --git a/packages/create-app/package.json b/packages/create-app/package.json index b562233452..431c61be32 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -46,7 +46,7 @@ "@types/command-exists": "^1.2.0", "@types/fs-extra": "^9.0.1", "@types/inquirer": "^8.1.3", - "@types/node": "^16.11.26", + "@types/node": "^18.17.8", "@types/recursive-readdir": "^2.2.0", "mock-fs": "^5.1.1", "nodemon": "^3.0.1", diff --git a/packages/e2e-test/package.json b/packages/e2e-test/package.json index 5e722777e5..10e4cb3c47 100644 --- a/packages/e2e-test/package.json +++ b/packages/e2e-test/package.json @@ -43,7 +43,7 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@types/fs-extra": "^9.0.1", - "@types/node": "^16.11.26", + "@types/node": "^18.17.8", "@types/puppeteer": "^5.4.4", "nodemon": "^3.0.1", "ts-node": "^10.0.0" diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json index eca544e397..3a0a60bcc9 100644 --- a/packages/repo-tools/package.json +++ b/packages/repo-tools/package.json @@ -64,7 +64,7 @@ "@backstage/types": "workspace:^", "@types/is-glob": "^4.0.2", "@types/mock-fs": "^4.13.0", - "@types/node": "^16.11.26", + "@types/node": "^18.17.8", "mock-fs": "^5.1.0" }, "peerDependencies": { diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index 9fb5c8d0d5..9a8c420ffd 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -41,7 +41,7 @@ "@types/commander": "^2.12.2", "@types/fs-extra": "^9.0.6", "@types/http-proxy": "^1.17.4", - "@types/node": "^16.11.26", + "@types/node": "^18.17.8", "@types/serve-handler": "^6.1.0", "@types/webpack-env": "^1.15.3", "cypress": "^10.0.0", diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index 63e5fc78d9..d687f82280 100644 --- a/plugins/scaffolder-backend-module-rails/package.json +++ b/plugins/scaffolder-backend-module-rails/package.json @@ -43,7 +43,7 @@ "@types/command-exists": "^1.2.0", "@types/fs-extra": "^9.0.1", "@types/mock-fs": "^4.13.0", - "@types/node": "^16.11.26", + "@types/node": "^18.17.8", "jest-when": "^3.1.0", "mock-fs": "^5.1.0" }, diff --git a/yarn.lock b/yarn.lock index c9039f34f2..d86404f314 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3696,7 +3696,7 @@ __metadata: resolution: "@backstage/cli-common@workspace:packages/cli-common" dependencies: "@backstage/cli": "workspace:^" - "@types/node": ^16.0.0 + "@types/node": ^18.17.8 languageName: unknown linkType: soft @@ -3773,7 +3773,7 @@ __metadata: "@types/jest": ^29.0.0 "@types/minimatch": ^5.0.0 "@types/mock-fs": ^4.13.0 - "@types/node": ^16.11.26 + "@types/node": ^18.17.8 "@types/npm-packlist": ^3.0.0 "@types/recursive-readdir": ^2.2.0 "@types/rollup-plugin-peer-deps-external": ^2.2.0 @@ -3878,7 +3878,7 @@ __metadata: "@backstage/cli": "workspace:^" "@backstage/cli-common": "workspace:^" "@types/jscodeshift": ^0.11.0 - "@types/node": ^16.11.26 + "@types/node": ^18.17.8 chalk: ^4.0.0 commander: ^9.1.0 jscodeshift: ^0.15.0 @@ -4133,7 +4133,7 @@ __metadata: "@types/command-exists": ^1.2.0 "@types/fs-extra": ^9.0.1 "@types/inquirer": ^8.1.3 - "@types/node": ^16.11.26 + "@types/node": ^18.17.8 "@types/recursive-readdir": ^2.2.0 chalk: ^4.0.0 commander: ^9.1.0 @@ -8344,7 +8344,7 @@ __metadata: "@types/command-exists": ^1.2.0 "@types/fs-extra": ^9.0.1 "@types/mock-fs": ^4.13.0 - "@types/node": ^16.11.26 + "@types/node": ^18.17.8 command-exists: ^1.2.9 fs-extra: ^10.0.1 jest-when: ^3.1.0 @@ -9719,7 +9719,7 @@ __metadata: "@stoplight/types": ^13.14.0 "@types/is-glob": ^4.0.2 "@types/mock-fs": ^4.13.0 - "@types/node": ^16.11.26 + "@types/node": ^18.17.8 chalk: ^4.0.0 codeowners-utils: ^1.0.2 commander: ^9.1.0 @@ -16457,7 +16457,7 @@ __metadata: "@types/dockerode": ^3.3.0 "@types/fs-extra": ^9.0.6 "@types/http-proxy": ^1.17.4 - "@types/node": ^16.11.26 + "@types/node": ^18.17.8 "@types/serve-handler": ^6.1.0 "@types/webpack-env": ^1.15.3 commander: ^9.1.0 @@ -17767,17 +17767,17 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^16.0.0, @types/node@npm:^16.11.26, @types/node@npm:^16.9.2": - version: 16.18.50 - resolution: "@types/node@npm:16.18.50" - checksum: 8aec1eaf83407197ec2fe947182c238f49b82a7aace867cee1f81f72eb8a76c3c8b2adb1fd356e7443317cffb2546708da8934299a579edd25e3160bf7af30a1 +"@types/node@npm:^16.9.2": + version: 16.18.43 + resolution: "@types/node@npm:16.18.43" + checksum: a3ae424834818d1aa53d05e9de954b4559aaa9c02294e654403d9bd2a2b1db608c328755970071369a0c85159a6f2969502e1b9c7e1f29d2629ca677c33c8bdb languageName: node linkType: hard -"@types/node@npm:^18.11.17": - version: 18.17.15 - resolution: "@types/node@npm:18.17.15" - checksum: eed11d4398ccdb999a4c65658ee75de621a4ad57aece48ed2fb8803b1e2711fadf58d8aefbdb0a447d69cf3cba602ca32fe0fc92077575950a796e1dc13baa0f +"@types/node@npm:^18.11.17, @types/node@npm:^18.17.8": + version: 18.17.8 + resolution: "@types/node@npm:18.17.8" + checksum: ebb71526368c9c58f03e2c2408bfda4aa686c13d84226e2c9b48d9c4aee244fb82e672aaf4aa8ccb6e4993b4274d5f4b2b3d52d0a2e57ab187ae653903376411 languageName: node linkType: hard @@ -23929,7 +23929,7 @@ __metadata: "@backstage/create-app": "workspace:^" "@backstage/errors": "workspace:^" "@types/fs-extra": ^9.0.1 - "@types/node": ^16.11.26 + "@types/node": ^18.17.8 "@types/puppeteer": ^5.4.4 chalk: ^4.0.0 commander: ^9.1.0 @@ -38444,7 +38444,7 @@ __metadata: "@spotify/eslint-plugin": ^14.1.3 "@spotify/prettier-config": ^14.0.0 "@techdocs/cli": "workspace:*" - "@types/node": ^16.11.26 + "@types/node": ^18.17.8 "@types/webpack": ^5.28.0 command-exists: ^1.2.9 concurrently: ^8.0.0 From 47d73e401f434e6295b8061148fa25a8d8422838 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 23 Aug 2023 20:26:56 +0200 Subject: [PATCH 51/82] backend-common: fix type error Signed-off-by: Patrik Oldsberg --- .../backend-common/src/reading/ReadUrlResponseFactory.test.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/backend-common/src/reading/ReadUrlResponseFactory.test.ts b/packages/backend-common/src/reading/ReadUrlResponseFactory.test.ts index 880ab6f1d7..1eb18f5c1d 100644 --- a/packages/backend-common/src/reading/ReadUrlResponseFactory.test.ts +++ b/packages/backend-common/src/reading/ReadUrlResponseFactory.test.ts @@ -78,7 +78,9 @@ describe('ReadUrlResponseFactory', () => { let readable: NodeJS.ReadableStream; beforeEach(() => { - readable = new Stream({ encoding: 'utf-8' }) as NodeJS.ReadableStream; + readable = new Stream({ + encoding: 'utf-8', + }) as unknown as NodeJS.ReadableStream; readable.readable = true; // Write data asynchronously, as soon as possible. From 6246571911cbafabe73e995c2040d53949f5867e Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 31 Aug 2023 21:11:13 +0200 Subject: [PATCH 52/82] test fixes for Node.js v20 Signed-off-by: Patrik Oldsberg --- .../src/reading/tree/ReadableArrayResponse.test.ts | 12 ++++++------ .../src/scanner/plugin-scanner.test.ts | 4 ++-- .../core-app-api/src/app/defaultConfigLoader.test.ts | 2 +- packages/create-app/src/lib/tasks.test.ts | 12 ++++++------ .../builtin/filesystem/rename.examples.test.ts | 6 +++--- .../actions/builtin/filesystem/rename.test.ts | 10 +++++----- .../src/stages/generate/helpers.test.ts | 12 ++++++------ 7 files changed, 29 insertions(+), 29 deletions(-) diff --git a/packages/backend-common/src/reading/tree/ReadableArrayResponse.test.ts b/packages/backend-common/src/reading/tree/ReadableArrayResponse.test.ts index a9bcfd7631..a1f36cbd0f 100644 --- a/packages/backend-common/src/reading/tree/ReadableArrayResponse.test.ts +++ b/packages/backend-common/src/reading/tree/ReadableArrayResponse.test.ts @@ -72,11 +72,11 @@ describe('ReadableArrayResponse', () => { const res = new ReadableArrayResponse(arr, '/tmp', 'etag'); const dir = await res.dir(); - expect(fs.readFileSync(resolvePath(dir, 'file1.yaml'), 'utf8').trim()).toBe( - 'site_name: Test', - ); - expect(fs.readFileSync(resolvePath(dir, 'file2.yaml'), 'utf8').trim()).toBe( - 'site_name: Test2', - ); + await expect( + fs.readFile(resolvePath(dir, 'file1.yaml'), 'utf8'), + ).resolves.toBe('site_name: Test\n'); + await expect( + fs.readFile(resolvePath(dir, 'file2.yaml'), 'utf8'), + ).resolves.toBe('site_name: Test2\n'); }); }); diff --git a/packages/backend-plugin-manager/src/scanner/plugin-scanner.test.ts b/packages/backend-plugin-manager/src/scanner/plugin-scanner.test.ts index 25f07baeaa..4891749a0b 100644 --- a/packages/backend-plugin-manager/src/scanner/plugin-scanner.test.ts +++ b/packages/backend-plugin-manager/src/scanner/plugin-scanner.test.ts @@ -571,7 +571,7 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac "failed to load dynamic plugin manifest from '/backstageRoot/dist-dynamic/test-backend-plugin/alpha'", meta: { name: 'SyntaxError', - message: 'Unexpected token i in JSON at position 0', + message: expect.stringContaining('Unexpected token'), }, }, ], @@ -604,7 +604,7 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac "failed to load dynamic plugin manifest from '/backstageRoot/dist-dynamic/test-backend-plugin'", meta: { name: 'SyntaxError', - message: 'Unexpected token i in JSON at position 0', + message: expect.stringContaining('Unexpected token'), }, }, ], diff --git a/packages/core-app-api/src/app/defaultConfigLoader.test.ts b/packages/core-app-api/src/app/defaultConfigLoader.test.ts index 7579e53dd2..c70ec3fbff 100644 --- a/packages/core-app-api/src/app/defaultConfigLoader.test.ts +++ b/packages/core-app-api/src/app/defaultConfigLoader.test.ts @@ -70,7 +70,7 @@ describe('defaultConfigLoaderSync', () => { anyEnv.APP_CONFIG = [{ data: { my: 'config' }, context: 'a' }]; expect(() => defaultConfigLoaderSync('}')).toThrow( - 'Failed to load runtime configuration, SyntaxError: Unexpected token } in JSON at position 0', + 'Failed to load runtime configuration, SyntaxError: Unexpected token', ); }); diff --git a/packages/create-app/src/lib/tasks.test.ts b/packages/create-app/src/lib/tasks.test.ts index 95ced49490..c94bf43598 100644 --- a/packages/create-app/src/lib/tasks.test.ts +++ b/packages/create-app/src/lib/tasks.test.ts @@ -304,13 +304,13 @@ describe('tasks', () => { }, ); // catalog was populated with `context.name` - expect( - fs.readFileSync('templatedApp/catalog-info.yaml', 'utf-8'), - ).toContain('name: SuperCoolBackstageInstance'); + await expect( + fs.readFile('templatedApp/catalog-info.yaml', 'utf-8'), + ).resolves.toContain('name: SuperCoolBackstageInstance'); // backend dependencies include `sqlite3` from `context.SQLite` - expect( - fs.readFileSync('templatedApp/packages/backend/package.json', 'utf-8'), - ).toContain('sqlite3"'); + await expect( + fs.readFile('templatedApp/packages/backend/package.json', 'utf-8'), + ).resolves.toContain('sqlite3"'); }); }); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/rename.examples.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/rename.examples.test.ts index c4c27cc68e..5139469959 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/rename.examples.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/rename.examples.test.ts @@ -85,8 +85,8 @@ describe('fs:rename examples', () => { const sourceFilePath = resolvePath(workspacePath, sourceFile); const destFilePath = resolvePath(workspacePath, destFile); - const sourceBeforeContent = fs.readFileSync(sourceFilePath, 'utf-8'); - const destBeforeContent = fs.readFileSync(destFilePath, 'utf-8'); + const sourceBeforeContent = await fs.readFile(sourceFilePath, 'utf-8'); + const destBeforeContent = await fs.readFile(destFilePath, 'utf-8'); expect(sourceBeforeContent).not.toEqual(destBeforeContent); @@ -97,7 +97,7 @@ describe('fs:rename examples', () => { }, }); - const destAfterContent = fs.readFileSync(destFilePath, 'utf-8'); + const destAfterContent = await fs.readFile(destFilePath, 'utf-8'); expect(sourceBeforeContent).toEqual(destAfterContent); }); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/rename.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/rename.test.ts index b12e4269c2..6804c9f5a9 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/rename.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/rename.test.ts @@ -148,7 +148,7 @@ describe('fs:rename', () => { it('should throw is trying to override by mistake', async () => { const destFile = 'unit-test-c.js'; const filePath = resolvePath(workspacePath, destFile); - const beforeContent = fs.readFileSync(filePath, 'utf-8'); + const beforeContent = await fs.readFile(filePath, 'utf-8'); await expect( action.handler({ @@ -164,7 +164,7 @@ describe('fs:rename', () => { }), ).rejects.toThrow(/dest already exists/); - const afterContent = fs.readFileSync(filePath, 'utf-8'); + const afterContent = await fs.readFile(filePath, 'utf-8'); expect(beforeContent).toEqual(afterContent); }); @@ -191,8 +191,8 @@ describe('fs:rename', () => { const sourceFilePath = resolvePath(workspacePath, sourceFile); const destFilePath = resolvePath(workspacePath, destFile); - const sourceBeforeContent = fs.readFileSync(sourceFilePath, 'utf-8'); - const destBeforeContent = fs.readFileSync(destFilePath, 'utf-8'); + const sourceBeforeContent = await fs.readFile(sourceFilePath, 'utf-8'); + const destBeforeContent = await fs.readFile(destFilePath, 'utf-8'); expect(sourceBeforeContent).not.toEqual(destBeforeContent); @@ -209,7 +209,7 @@ describe('fs:rename', () => { }, }); - const destAfterContent = fs.readFileSync(destFilePath, 'utf-8'); + const destAfterContent = await fs.readFile(destFilePath, 'utf-8'); expect(sourceBeforeContent).toEqual(destAfterContent); }); diff --git a/plugins/techdocs-node/src/stages/generate/helpers.test.ts b/plugins/techdocs-node/src/stages/generate/helpers.test.ts index e20e20ea5b..4d422d7125 100644 --- a/plugins/techdocs-node/src/stages/generate/helpers.test.ts +++ b/plugins/techdocs-node/src/stages/generate/helpers.test.ts @@ -393,7 +393,7 @@ describe('helpers', () => { await patchIndexPreBuild({ inputDir: '/', logger: mockLogger }); - expect(fs.readFileSync('/docs/index.md', 'utf-8')).toEqual( + await expect(fs.readFile('/docs/index.md', 'utf-8')).resolves.toEqual( 'index.md content', ); expect(warn).not.toHaveBeenCalledWith(); @@ -407,7 +407,7 @@ describe('helpers', () => { await patchIndexPreBuild({ inputDir: '/', logger: mockLogger }); - expect(fs.readFileSync('/docs/index.md', 'utf-8')).toEqual( + await expect(fs.readFile('/docs/index.md', 'utf-8')).resolves.toEqual( 'docs/README.md content', ); expect(warn.mock.calls).toEqual([ @@ -422,7 +422,7 @@ describe('helpers', () => { await patchIndexPreBuild({ inputDir: '/', logger: mockLogger }); - expect(fs.readFileSync('/docs/index.md', 'utf-8')).toEqual( + await expect(fs.readFile('/docs/index.md', 'utf-8')).resolves.toEqual( 'main README.md content', ); expect(warn.mock.calls).toEqual([ @@ -437,7 +437,7 @@ describe('helpers', () => { await patchIndexPreBuild({ inputDir: '/', logger: mockLogger }); - expect(() => fs.readFileSync('/docs/index.md', 'utf-8')).toThrow(); + await expect(fs.readFile('/docs/index.md', 'utf-8')).rejects.toThrow(); const paths = [ path.normalize('docs/index.md'), path.normalize('docs/README.md'), @@ -483,7 +483,7 @@ describe('helpers', () => { await expect( createOrUpdateMetadata(filePath, mockLogger), - ).rejects.toThrow('Unexpected token d in JSON at position 0'); + ).rejects.toThrow('Unexpected token'); }); it('should add build timestamp to the metadata json', async () => { @@ -520,7 +520,7 @@ describe('helpers', () => { const filePath = path.join(rootDir, 'invalid_techdocs_metadata.json'); await expect(storeEtagMetadata(filePath, 'etag123abc')).rejects.toThrow( - 'Unexpected token d in JSON at position 0', + 'Unexpected token', ); }); From 92cfcdd63256d1e06efbe6268dbd2c4ab6e3fac3 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 6 Sep 2023 10:14:06 +0200 Subject: [PATCH 53/82] sync mock-fs versions Signed-off-by: Patrik Oldsberg --- .changeset/silent-years-bake.md | 2 +- packages/backend-common/package.json | 2 +- packages/cli/package.json | 2 +- packages/config-loader/package.json | 2 +- packages/create-app/package.json | 2 +- packages/repo-tools/package.json | 2 +- plugins/app-backend/package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- plugins/scaffolder-backend/package.json | 2 +- plugins/techdocs-node/package.json | 2 +- yarn.lock | 22 +++++++++---------- 12 files changed, 22 insertions(+), 22 deletions(-) diff --git a/.changeset/silent-years-bake.md b/.changeset/silent-years-bake.md index b7adbc4f63..4f50c37c31 100644 --- a/.changeset/silent-years-bake.md +++ b/.changeset/silent-years-bake.md @@ -8,4 +8,4 @@ '@backstage/repo-tools': patch --- -Bumped `@types/node` dependency to `^18.17.8`. +Bumped dev dependencies `@types/node` and `mock-fs`. diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index 20476e04be..a1487163b2 100644 --- a/packages/backend-common/package.json +++ b/packages/backend-common/package.json @@ -138,7 +138,7 @@ "aws-sdk-client-mock": "^2.0.0", "better-sqlite3": "^8.0.0", "http-errors": "^2.0.0", - "mock-fs": "^5.1.0", + "mock-fs": "^5.2.0", "msw": "^1.0.0", "mysql2": "^2.2.5", "recursive-readdir": "^2.2.2", diff --git a/packages/cli/package.json b/packages/cli/package.json index 66f82f8e44..45d7c8468d 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -168,7 +168,7 @@ "@types/terser-webpack-plugin": "^5.0.4", "@types/yarnpkg__lockfile": "^1.1.4", "del": "^7.0.0", - "mock-fs": "^5.1.0", + "mock-fs": "^5.2.0", "msw": "^1.0.0", "nodemon": "^3.0.1", "ts-node": "^10.0.0", diff --git a/packages/config-loader/package.json b/packages/config-loader/package.json index 46c017217d..51c7d4a599 100644 --- a/packages/config-loader/package.json +++ b/packages/config-loader/package.json @@ -57,7 +57,7 @@ "@types/json-schema-merge-allof": "^0.6.0", "@types/mock-fs": "^4.10.0", "@types/yup": "^0.29.13", - "mock-fs": "^5.1.0", + "mock-fs": "^5.2.0", "msw": "^1.0.0", "zen-observable": "^0.10.0" }, diff --git a/packages/create-app/package.json b/packages/create-app/package.json index 431c61be32..15db38b1c5 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -48,7 +48,7 @@ "@types/inquirer": "^8.1.3", "@types/node": "^18.17.8", "@types/recursive-readdir": "^2.2.0", - "mock-fs": "^5.1.1", + "mock-fs": "^5.2.0", "nodemon": "^3.0.1", "ts-node": "^10.0.0" }, diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json index 3a0a60bcc9..0eb881aea8 100644 --- a/packages/repo-tools/package.json +++ b/packages/repo-tools/package.json @@ -65,7 +65,7 @@ "@types/is-glob": "^4.0.2", "@types/mock-fs": "^4.13.0", "@types/node": "^18.17.8", - "mock-fs": "^5.1.0" + "mock-fs": "^5.2.0" }, "peerDependencies": { "@microsoft/api-extractor-model": "*", diff --git a/plugins/app-backend/package.json b/plugins/app-backend/package.json index c308b40720..561dbff245 100644 --- a/plugins/app-backend/package.json +++ b/plugins/app-backend/package.json @@ -69,7 +69,7 @@ "@backstage/cli": "workspace:^", "@backstage/types": "workspace:^", "@types/supertest": "^2.0.8", - "mock-fs": "^5.1.0", + "mock-fs": "^5.2.0", "msw": "^1.0.0", "node-fetch": "^2.6.7", "supertest": "^6.1.3" diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index 2d4be6aab4..152b103919 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/package.json +++ b/plugins/scaffolder-backend-module-cookiecutter/package.json @@ -45,7 +45,7 @@ "@types/command-exists": "^1.2.0", "@types/fs-extra": "^9.0.1", "@types/mock-fs": "^4.13.0", - "mock-fs": "^5.1.0", + "mock-fs": "^5.2.0", "msw": "^1.0.0" }, "files": [ diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index d687f82280..f53072ebc3 100644 --- a/plugins/scaffolder-backend-module-rails/package.json +++ b/plugins/scaffolder-backend-module-rails/package.json @@ -45,7 +45,7 @@ "@types/mock-fs": "^4.13.0", "@types/node": "^18.17.8", "jest-when": "^3.1.0", - "mock-fs": "^5.1.0" + "mock-fs": "^5.2.0" }, "files": [ "dist" diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index 3e274e6ad2..99f6256069 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -113,7 +113,7 @@ "@types/zen-observable": "^0.8.0", "esbuild": "^0.19.0", "jest-when": "^3.1.0", - "mock-fs": "^5.1.0", + "mock-fs": "^5.2.0", "msw": "^1.0.0", "supertest": "^6.1.3", "wait-for-expect": "^3.0.2", diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index 07fc2a74b8..28de8a94fd 100644 --- a/plugins/techdocs-node/package.json +++ b/plugins/techdocs-node/package.json @@ -63,7 +63,7 @@ "js-yaml": "^4.0.0", "json5": "^2.1.3", "mime-types": "^2.1.27", - "mock-fs": "^5.1.0", + "mock-fs": "^5.2.0", "p-limit": "^3.1.0", "recursive-readdir": "^2.2.2", "winston": "^3.2.1" diff --git a/yarn.lock b/yarn.lock index d86404f314..f5d61c59ca 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3497,7 +3497,7 @@ __metadata: luxon: ^3.0.0 minimatch: ^5.0.0 minimist: ^1.2.5 - mock-fs: ^5.1.0 + mock-fs: ^5.2.0 morgan: ^1.10.0 msw: ^1.0.0 mysql2: ^2.2.5 @@ -3826,7 +3826,7 @@ __metadata: lodash: ^4.17.21 mini-css-extract-plugin: ^2.4.2 minimatch: ^5.1.1 - mock-fs: ^5.1.0 + mock-fs: ^5.2.0 msw: ^1.0.0 node-fetch: ^2.6.7 node-libs-browser: ^2.2.1 @@ -3911,7 +3911,7 @@ __metadata: json-schema-traverse: ^1.0.0 lodash: ^4.17.21 minimist: ^1.2.5 - mock-fs: ^5.1.0 + mock-fs: ^5.2.0 msw: ^1.0.0 node-fetch: ^2.6.7 typescript-json-schema: ^0.55.0 @@ -4140,7 +4140,7 @@ __metadata: fs-extra: 10.1.0 handlebars: ^4.7.3 inquirer: ^8.2.0 - mock-fs: ^5.1.1 + mock-fs: ^5.2.0 nodemon: ^3.0.1 ora: ^5.3.0 recursive-readdir: ^2.2.2 @@ -4691,7 +4691,7 @@ __metadata: knex: ^2.0.0 lodash: ^4.17.21 luxon: ^3.0.0 - mock-fs: ^5.1.0 + mock-fs: ^5.2.0 msw: ^1.0.0 node-fetch: ^2.6.7 supertest: ^6.1.3 @@ -8307,7 +8307,7 @@ __metadata: "@types/mock-fs": ^4.13.0 command-exists: ^1.2.9 fs-extra: 10.1.0 - mock-fs: ^5.1.0 + mock-fs: ^5.2.0 msw: ^1.0.0 winston: ^3.2.1 yn: ^4.0.0 @@ -8348,7 +8348,7 @@ __metadata: command-exists: ^1.2.9 fs-extra: ^10.0.1 jest-when: ^3.1.0 - mock-fs: ^5.1.0 + mock-fs: ^5.2.0 languageName: unknown linkType: soft @@ -8433,7 +8433,7 @@ __metadata: libsodium-wrappers: ^0.7.11 lodash: ^4.17.21 luxon: ^3.0.0 - mock-fs: ^5.1.0 + mock-fs: ^5.2.0 morgan: ^1.10.0 msw: ^1.0.0 node-fetch: ^2.6.7 @@ -9391,7 +9391,7 @@ __metadata: js-yaml: ^4.0.0 json5: ^2.1.3 mime-types: ^2.1.27 - mock-fs: ^5.1.0 + mock-fs: ^5.2.0 p-limit: ^3.1.0 recursive-readdir: ^2.2.2 supertest: ^6.1.3 @@ -9729,7 +9729,7 @@ __metadata: js-yaml: ^4.1.0 lodash: ^4.17.21 minimatch: ^5.1.1 - mock-fs: ^5.1.0 + mock-fs: ^5.2.0 p-limit: ^3.0.2 ts-node: ^10.0.0 yaml-diff-patch: ^2.0.0 @@ -33198,7 +33198,7 @@ __metadata: languageName: node linkType: hard -"mock-fs@npm:^5.1.0, mock-fs@npm:^5.1.1, mock-fs@npm:^5.2.0": +"mock-fs@npm:^5.2.0": version: 5.2.0 resolution: "mock-fs@npm:5.2.0" checksum: c25835247bd26fa4e0189addd61f98973f61a72741e4d2a5694b143a2069b84978443a7ac0fdb1a71aead99273ec22ff4e9c968de11bbd076db020264c5b8312 From 52f2416abe6517cff002c4670a93f84977cc9da0 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 6 Sep 2023 10:14:38 +0200 Subject: [PATCH 54/82] root: patch mock-fs Signed-off-by: Patrik Oldsberg --- .yarn/patches/mock-fs-npm-5.2.0-5103a7b507.patch | 13 +++++++++++++ package.json | 3 ++- yarn.lock | 9 ++++++++- 3 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 .yarn/patches/mock-fs-npm-5.2.0-5103a7b507.patch diff --git a/.yarn/patches/mock-fs-npm-5.2.0-5103a7b507.patch b/.yarn/patches/mock-fs-npm-5.2.0-5103a7b507.patch new file mode 100644 index 0000000000..ed5555203b --- /dev/null +++ b/.yarn/patches/mock-fs-npm-5.2.0-5103a7b507.patch @@ -0,0 +1,13 @@ +diff --git a/lib/binding.js b/lib/binding.js +index a4a3e6cdc197bd0f12fe2d060640e91ac58ab457..ab04ce3115fe93073a3e25008730272b6fa21bd7 100644 +--- a/lib/binding.js ++++ b/lib/binding.js +@@ -165,6 +165,8 @@ function Binding(system) { + this.trackDescriptor(stderr); + } + ++Binding.prototype.readFileSync = path => require('fs').readFileSync(path).toString('utf8'); ++ + /** + * Get the file system underlying this binding. + * @return {FileSystem} The underlying file system. diff --git a/package.json b/package.json index 0cc12b7214..dcdd66f7c3 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,8 @@ }, "resolutions": { "@types/react": "^17", - "@types/react-dom": "^17" + "@types/react-dom": "^17", + "mock-fs@^5.2.0": "patch:mock-fs@npm%3A5.2.0#./.yarn/patches/mock-fs-npm-5.2.0-5103a7b507.patch" }, "version": "1.18.0", "dependencies": { diff --git a/yarn.lock b/yarn.lock index f5d61c59ca..51abaf0aa6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -33198,13 +33198,20 @@ __metadata: languageName: node linkType: hard -"mock-fs@npm:^5.2.0": +"mock-fs@npm:5.2.0": version: 5.2.0 resolution: "mock-fs@npm:5.2.0" checksum: c25835247bd26fa4e0189addd61f98973f61a72741e4d2a5694b143a2069b84978443a7ac0fdb1a71aead99273ec22ff4e9c968de11bbd076db020264c5b8312 languageName: node linkType: hard +"mock-fs@patch:mock-fs@npm%3A5.2.0#./.yarn/patches/mock-fs-npm-5.2.0-5103a7b507.patch::locator=root%40workspace%3A.": + version: 5.2.0 + resolution: "mock-fs@patch:mock-fs@npm%3A5.2.0#./.yarn/patches/mock-fs-npm-5.2.0-5103a7b507.patch::version=5.2.0&hash=920f99&locator=root%40workspace%3A." + checksum: 84e306d7a798735ed8ee110b60ed8fc0b5db451df3a990e2a01432fac99decd15e5534c92d87f8067425329dbd9bf5c12e2673d3d770fb40f2936810e02bb07a + languageName: node + linkType: hard + "mock-socket@npm:^9.3.0": version: 9.3.1 resolution: "mock-socket@npm:9.3.1" From f863947ea714a8befddd83b12a28e69923189b3a Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 12 Sep 2023 17:39:40 +0200 Subject: [PATCH 55/82] e2e-test: copy yarn patches to dist dir Signed-off-by: Patrik Oldsberg --- packages/e2e-test/src/commands/run.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/e2e-test/src/commands/run.ts b/packages/e2e-test/src/commands/run.ts index 20b2753f6b..6cca0fb987 100644 --- a/packages/e2e-test/src/commands/run.ts +++ b/packages/e2e-test/src/commands/run.ts @@ -181,6 +181,12 @@ async function buildDistWorkspace(workspaceName: string, rootDir: string) { print('Pinning yarn version in workspace'); await pinYarnVersion(workspaceDir); + const yarnPatchesPath = paths.resolveOwnRoot('.yarn/patches'); + if (await fs.pathExists(yarnPatchesPath)) { + print('Copying yarn patches'); + await fs.copy(yarnPatchesPath, resolvePath(workspaceDir, '.yarn/patches')); + } + print('Installing workspace dependencies'); await runPlain(['yarn', 'workspaces', 'focus', '--all', '--production'], { cwd: workspaceDir, From b994839448ad5b1a8fb9661e0e3589ca1677058c Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sat, 16 Sep 2023 17:19:23 +0200 Subject: [PATCH 56/82] backend-plugin-manager: fix test in Node.js v20 Signed-off-by: Patrik Oldsberg --- .../backend-plugin-manager/src/manager/plugin-manager.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend-plugin-manager/src/manager/plugin-manager.test.ts b/packages/backend-plugin-manager/src/manager/plugin-manager.test.ts index 8a17fe082a..92703fa589 100644 --- a/packages/backend-plugin-manager/src/manager/plugin-manager.test.ts +++ b/packages/backend-plugin-manager/src/manager/plugin-manager.test.ts @@ -274,7 +274,7 @@ describe('backend-plugin-manager', () => { { message: `an error occured while loading dynamic backend plugin 'backend-dynamic-plugin-test' from '${location}'`, meta: { - message: 'Unexpected identifier', + message: expect.stringContaining('Unexpected identifier'), name: 'SyntaxError', }, }, From 9b78090f5f6f4e888fe2b22e077aef98d522bb3f Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sat, 16 Sep 2023 17:18:55 +0200 Subject: [PATCH 57/82] backend-defaults: update createBackend test to avoid starting backend Signed-off-by: Patrik Oldsberg --- .../backend-defaults/src/CreateBackend.test.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/backend-defaults/src/CreateBackend.test.ts b/packages/backend-defaults/src/CreateBackend.test.ts index 23e5c571bd..55fdbe5a6a 100644 --- a/packages/backend-defaults/src/CreateBackend.test.ts +++ b/packages/backend-defaults/src/CreateBackend.test.ts @@ -18,16 +18,24 @@ import { coreServices, createServiceFactory, } from '@backstage/backend-plugin-api'; -import { mockServices } from '@backstage/backend-test-utils'; import { createBackend } from './CreateBackend'; describe('createBackend', () => { it('should not throw when overriding a default service implementation', async () => { const backend = createBackend(); - backend.add(mockServices.rootConfig.factory()); + backend.add( + createServiceFactory({ + service: coreServices.rootConfig, + deps: {}, + factory(): never { + throw new Error('NOPE'); + }, + }), + ); - await expect(backend.start()).resolves.toBe(undefined); + // We expect the service factory error to be thrown, rather than any earlier validation + await expect(backend.start()).rejects.toThrow('NOPE'); }); it('should throw on duplicate service implementations', async () => { From 407f4284be7d45dcc39e2f099b92dd881598d272 Mon Sep 17 00:00:00 2001 From: Andrew Thauer Date: Tue, 19 Sep 2023 16:08:29 -0400 Subject: [PATCH 58/82] fix(rollbar): ensure token is hidden Signed-off-by: Andrew Thauer --- .changeset/four-jars-protect.md | 5 +++++ plugins/rollbar-backend/config.d.ts | 1 + 2 files changed, 6 insertions(+) create mode 100644 .changeset/four-jars-protect.md diff --git a/.changeset/four-jars-protect.md b/.changeset/four-jars-protect.md new file mode 100644 index 0000000000..8469839856 --- /dev/null +++ b/.changeset/four-jars-protect.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-rollbar-backend': patch +--- + +ensure rollbar token is hidden diff --git a/plugins/rollbar-backend/config.d.ts b/plugins/rollbar-backend/config.d.ts index 255d06d633..dd32c16483 100644 --- a/plugins/rollbar-backend/config.d.ts +++ b/plugins/rollbar-backend/config.d.ts @@ -20,6 +20,7 @@ export interface Config { /** * The authentication token for accessing the Rollbar API * @see https://explorer.docs.rollbar.com/#section/Authentication + * @visibility secret */ accountToken: string; }; From 3ef18f8c06c66e6186001c0143883cd68c6725de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 20 Sep 2023 14:16:40 +0200 Subject: [PATCH 59/82] use named exports in cjs builds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/tasty-doors-switch.md | 5 +++++ packages/cli/src/lib/builder/config.ts | 1 + 2 files changed, 6 insertions(+) create mode 100644 .changeset/tasty-doors-switch.md diff --git a/.changeset/tasty-doors-switch.md b/.changeset/tasty-doors-switch.md new file mode 100644 index 0000000000..e35bf9cfa4 --- /dev/null +++ b/.changeset/tasty-doors-switch.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Explicitly set `exports: 'named'` for CJS builds, ensuring that they have e.g. `exports["default"] = catalogPlugin;` diff --git a/packages/cli/src/lib/builder/config.ts b/packages/cli/src/lib/builder/config.ts index 99d8e96498..f614581320 100644 --- a/packages/cli/src/lib/builder/config.ts +++ b/packages/cli/src/lib/builder/config.ts @@ -90,6 +90,7 @@ export async function makeRollupConfigs( chunkFileNames: `cjs/[name]-[hash].cjs.js`, format: 'commonjs', sourcemap: true, + exports: 'named', }); } if (options.outputs.has(Output.esm)) { From b1663b1e0819585ec8d068e6f84a4e44861c7db9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 08:57:44 +0000 Subject: [PATCH 60/82] fix(deps): update dependency knex to v2.5.1 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index 51abaf0aa6..b014834651 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21924,6 +21924,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:^10.0.0": + version: 10.0.1 + resolution: "commander@npm:10.0.1" + checksum: 436901d64a818295803c1996cd856621a74f30b9f9e28a588e726b2b1670665bccd7c1a77007ebf328729f0139838a88a19265858a0fa7a8728c4656796db948 + languageName: node + linkType: hard + "commander@npm:^2.19.0, commander@npm:^2.20.0, commander@npm:^2.7.1": version: 2.20.3 resolution: "commander@npm:2.20.3" @@ -31028,11 +31035,11 @@ __metadata: linkType: hard "knex@npm:^2.0.0, knex@npm:^2.3.0, knex@npm:^2.4.2": - version: 2.4.2 - resolution: "knex@npm:2.4.2" + version: 2.5.1 + resolution: "knex@npm:2.5.1" dependencies: colorette: 2.0.19 - commander: ^9.1.0 + commander: ^10.0.0 debug: 4.3.4 escalade: ^3.1.1 esm: ^3.2.25 @@ -31040,7 +31047,7 @@ __metadata: getopts: 2.3.0 interpret: ^2.2.0 lodash: ^4.17.21 - pg-connection-string: 2.5.0 + pg-connection-string: 2.6.1 rechoir: ^0.8.0 resolve-from: ^5.0.0 tarn: ^3.0.2 @@ -31062,7 +31069,7 @@ __metadata: optional: true bin: knex: bin/cli.js - checksum: cfb6436c0e3df3cd1f55d3637e4f222d1acbc7b6ec3757e52c92cbf0a7da4055d40156d707ffede57dc155af75d7f5739a49d1b31d8755bc77bc0e4e2a570748 + checksum: 4f2da7fda51a450de25274eb76034c869de0427c17831dc8472b8116e879d23aae0592c2ce4e9b2a473417867063ac6e7b29021b39b4a4d502335017a5a09278 languageName: node linkType: hard @@ -35200,10 +35207,10 @@ __metadata: languageName: node linkType: hard -"pg-connection-string@npm:2.5.0": - version: 2.5.0 - resolution: "pg-connection-string@npm:2.5.0" - checksum: a6f3a068f7c9416a5b33a326811caf0dfaaee045c225b7c628b4c9b4e9a2b25bdd12a21e4c48940e1000ea223a4e608ca122d2ff3dd08c8b1db0fc9f5705133a +"pg-connection-string@npm:2.6.1": + version: 2.6.1 + resolution: "pg-connection-string@npm:2.6.1" + checksum: 882344a47e1ecf3a91383e0809bf2ac48facea97fcec0358d6e060e1cbcb8737acde419b4c86f05da4ce4a16634ee50fff1d2bb787d73b52ccbfde697243ad8a languageName: node linkType: hard From 25f095da304f9736383d29d5bf2fb066f19646d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 20 Sep 2023 15:00:38 +0200 Subject: [PATCH 61/82] fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- packages/backend-common/src/database/DatabaseManager.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/backend-common/src/database/DatabaseManager.ts b/packages/backend-common/src/database/DatabaseManager.ts index c1c9e56257..7564f82028 100644 --- a/packages/backend-common/src/database/DatabaseManager.ts +++ b/packages/backend-common/src/database/DatabaseManager.ts @@ -227,9 +227,7 @@ export class DatabaseManager { * all supported databases excluding SQLite unless `pluginDivisionMode` is set * to `schema`. */ - private getConnectionConfig( - pluginId: string, - ): Partial { + private getConnectionConfig(pluginId: string): Knex.StaticConnectionConfig { const { client, overridden } = this.getClientType(pluginId); let baseConnection = normalizeConnection( @@ -271,7 +269,7 @@ export class DatabaseManager { // include base connection if client type has not been overridden ...(overridden ? {} : baseConnection), ...connection, - } as Partial; + } as Knex.StaticConnectionConfig; } /** From 3963d0b885e7afc36fc1f5238587e660b0234578 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 20 Sep 2023 13:44:13 +0200 Subject: [PATCH 62/82] Ensure that all relevant config fields are properly marked as secret MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/dull-bugs-build.md | 6 ++++++ packages/integration/config.d.ts | 4 ++-- plugins/search-backend-module-elasticsearch/config.d.ts | 3 +++ 3 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 .changeset/dull-bugs-build.md diff --git a/.changeset/dull-bugs-build.md b/.changeset/dull-bugs-build.md new file mode 100644 index 0000000000..7acfe2a8a2 --- /dev/null +++ b/.changeset/dull-bugs-build.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-search-backend-module-elasticsearch': patch +'@backstage/integration': patch +--- + +Ensure that all relevant config fields are properly marked as secret diff --git a/packages/integration/config.d.ts b/packages/integration/config.d.ts index 9c08ec03a9..44303bf25c 100644 --- a/packages/integration/config.d.ts +++ b/packages/integration/config.d.ts @@ -39,7 +39,7 @@ export interface Config { * * If no credential is specified anonymous access is used. * - * @visibility secret + * @deepVisibility secret * @deprecated Use `credentials` instead. */ credential?: { @@ -54,7 +54,7 @@ export interface Config { * If not organization matches the first credential without an organization is used. * * If no credentials are specified at all, either a default credential (for Azure DevOps) or anonymous access (for Azure DevOps Server) is used. - * @visibility secret + * @deepVisibility secret */ credentials?: { clientId?: string; diff --git a/plugins/search-backend-module-elasticsearch/config.d.ts b/plugins/search-backend-module-elasticsearch/config.d.ts index d7fdd0cd1b..95f1588fb4 100644 --- a/plugins/search-backend-module-elasticsearch/config.d.ts +++ b/plugins/search-backend-module-elasticsearch/config.d.ts @@ -192,6 +192,9 @@ export interface Config { password: string; } | { + /** + * @visibility secret + */ apiKey: string; }; } From a7aba64e1dd7a09e8fec76b47a4de06a0b69cb06 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 Sep 2023 11:55:03 +0000 Subject: [PATCH 63/82] fix(deps): update dependency uuid to v9.0.1 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 51abaf0aa6..7359a7e62c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -42061,11 +42061,11 @@ __metadata: linkType: hard "uuid@npm:^9.0.0": - version: 9.0.0 - resolution: "uuid@npm:9.0.0" + version: 9.0.1 + resolution: "uuid@npm:9.0.1" bin: uuid: dist/bin/uuid - checksum: 8dd2c83c43ddc7e1c71e36b60aea40030a6505139af6bee0f382ebcd1a56f6cd3028f7f06ffb07f8cf6ced320b76aea275284b224b002b289f89fe89c389b028 + checksum: 39931f6da74e307f51c0fb463dc2462807531dc80760a9bff1e35af4316131b4fc3203d16da60ae33f07fdca5b56f3f1dd662da0c99fea9aaeab2004780cc5f4 languageName: node linkType: hard From 2744de0abc5446f086fb102606a0f5d7d32f68ff Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 13 Sep 2023 00:17:05 +0000 Subject: [PATCH 64/82] chore(deps): update dependency @types/tar to v6.1.6 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 51abaf0aa6..90da25232d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18391,12 +18391,12 @@ __metadata: linkType: hard "@types/tar@npm:^6.1.1": - version: 6.1.5 - resolution: "@types/tar@npm:6.1.5" + version: 6.1.6 + resolution: "@types/tar@npm:6.1.6" dependencies: "@types/node": "*" minipass: ^4.0.0 - checksum: 1efa71c8d72f2b02d16ffecb65c4a96be9dacce000c4207532a686477386524dd99b6e26904319354be3ac9ac4d41296a0cb9cf87d05f8f21ae31c68fe446348 + checksum: d4bcb5a06d8e4b6eac564f22274d72f6a14c614eaf5f6c6c270f3a43c197da2797a7c707bc0377cd2e6d8c429f277e1ca446121546c86021e9782034a306eafb languageName: node linkType: hard From 1224faf58ed2dacd611b31d53f659c0fc825252d Mon Sep 17 00:00:00 2001 From: Jamie Klassen Date: Wed, 20 Sep 2023 10:30:09 -0400 Subject: [PATCH 65/82] document more significant breaking change Signed-off-by: Jamie Klassen --- plugins/kubernetes-backend/CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/kubernetes-backend/CHANGELOG.md b/plugins/kubernetes-backend/CHANGELOG.md index 1c473ea18d..710d104033 100644 --- a/plugins/kubernetes-backend/CHANGELOG.md +++ b/plugins/kubernetes-backend/CHANGELOG.md @@ -6,6 +6,8 @@ - 0ad36158d980: Integrators can now bring their own auth strategies through the use of the `addAuthStrategy` method on `KubernetesBuilder`. + **BREAKING** the `ClusterDetails` interface has been refactored to add an `authMetadata` field, and the`authProvider`, `serviceAccountToken`, `assumeRole`, and `externalID` fields have all been removed -- they appear within `authMetadata` using the same keys as those read by the `catalog` cluster locator. This means that if you are using a custom cluster supplier, your code will need to be updated -- as an example, instead of returning a `ClusterDetails` like `{authProvider: 'aws'}`, you will need to return one like `{authMetadata: {['kubernetes.io/auth-provider']: 'aws'}`. + **BREAKING** on the slight chance you were using the `setAuthTranslatorMap` method on `KubernetesBuilder`, it has been removed along with the entire `KubernetesAuthTranslator` interface. This notion has been replaced with the more focused concept of an `AuthenticationStrategy`. Converting a translator to a strategy should not be especially difficult. ### Patch Changes From 64534e29c9c1e7c6375569c20d1e4319701a482a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 20 Sep 2023 15:00:48 +0000 Subject: [PATCH 66/82] chore(deps): update dependency @types/http-proxy to v1.17.12 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4c5e7615da..da98e5a3d6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17326,11 +17326,11 @@ __metadata: linkType: hard "@types/http-proxy@npm:*, @types/http-proxy@npm:^1.17.4, @types/http-proxy@npm:^1.17.8": - version: 1.17.11 - resolution: "@types/http-proxy@npm:1.17.11" + version: 1.17.12 + resolution: "@types/http-proxy@npm:1.17.12" dependencies: "@types/node": "*" - checksum: 38ef4f8c91c7a5b664cf6dd4d90de7863f88549a9f8ef997f2f1184e4f8cf2e7b9b63c04f0b7b962f34a09983073a31a9856de5aae5159b2ddbb905a4c44dc9f + checksum: 89700c8e3c8f2c59c87c8db8e7a070c97a3b30a4a38223aca6b8b817e6f2ca931f5a500e16ecadc1ebcfed2676cc60e073d8f887e621d84420298728ec6fd000 languageName: node linkType: hard From bdc9c9cfa3babe13c9bb1893263e824862e658b4 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 20 Sep 2023 17:20:55 +0200 Subject: [PATCH 67/82] docs: add missing attributions to 1.18 release notes Signed-off-by: Patrik Oldsberg --- docs/releases/v1.18.0.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/releases/v1.18.0.md b/docs/releases/v1.18.0.md index fe59ae2403..cae0301fd5 100644 --- a/docs/releases/v1.18.0.md +++ b/docs/releases/v1.18.0.md @@ -79,6 +79,8 @@ You can read more about these changes in the [`@backstage/plugin-auth-node` chan A new set of experimental APIs have been added to the frontend system to support internationalization. This allows for both translations to other languages, as well as overriding default messages. Partial support has so far been added to the `@backstage/plugin-user-settings` and `@backstage/plugin-adr` plugins. See [the docs](https://backstage.io/docs/plugins/internationalization) for more details. +Contributed by [@mario-mui](https://github.com/mario-mui) in [#17436](https://github.com/backstage/backstage/pull/17436) + ### Experimental Packages for Frontend Declarative Integration Two new packages have been added to support the work towards frontend declarative integration: `@backstage/frontend-plugin-api` and `@backstage/frontend-app-api`. These packages are still highly experimental and should not be used. @@ -91,9 +93,13 @@ The session expiration check has been improved for all auth providers. The expir It is now possible to download the results of a dry-run as a zip archive from the template editor dry-run results view. +Contributed by [@fyyyyy](https://github.com/fyyyyy) in [#19388](https://github.com/backstage/backstage/pull/19388) + ### Support for Multiple Azure DevOps Organizations -The integration for Azure DevOps now allows for configuration of separate credentials for different organizations. See the [documentation](https://backstage.io/docs/integrations/azure/locations/) for more information. Contributed by [@sanderaernouts](https://github.com/sanderaernouts) in [#18213](https://github.com/backstage/backstage/pull/18213) +The integration for Azure DevOps now allows for configuration of separate credentials for different organizations. See the [documentation](https://backstage.io/docs/integrations/azure/locations/) for more information. + +Contributed by [@sanderaernouts](https://github.com/sanderaernouts) in [#18213](https://github.com/backstage/backstage/pull/18213) ### New package: `@backstage/plugin-catalog-backend-module-scaffolder-entity-model` From 5ddc03813ed22b7069e9ee0fb11a433ef324b035 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 20 Sep 2023 17:52:33 +0200 Subject: [PATCH 68/82] backend-test-utils: remove last type parameter for MockInstance Signed-off-by: Patrik Oldsberg --- .changeset/quick-weeks-explode.md | 5 +++++ packages/backend-test-utils/api-report.md | 3 +-- .../backend-test-utils/src/next/services/mockServices.ts | 3 +-- 3 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 .changeset/quick-weeks-explode.md diff --git a/.changeset/quick-weeks-explode.md b/.changeset/quick-weeks-explode.md new file mode 100644 index 0000000000..fcc88263ec --- /dev/null +++ b/.changeset/quick-weeks-explode.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-test-utils': patch +--- + +Remove third type parameter used for `MockInstance`, in order to be compatible with older versions of `@types/jest`. diff --git a/packages/backend-test-utils/api-report.md b/packages/backend-test-utils/api-report.md index 43e671e440..4a27ac21a9 100644 --- a/packages/backend-test-utils/api-report.md +++ b/packages/backend-test-utils/api-report.md @@ -210,10 +210,9 @@ export type ServiceMock = { factory: ServiceFactory; } & { [Key in keyof TService]: TService[Key] extends ( - this: infer This, ...args: infer Args ) => infer Return - ? TService[Key] & jest.MockInstance + ? TService[Key] & jest.MockInstance : TService[Key]; }; diff --git a/packages/backend-test-utils/src/next/services/mockServices.ts b/packages/backend-test-utils/src/next/services/mockServices.ts index 22fba38fda..bd684f7560 100644 --- a/packages/backend-test-utils/src/next/services/mockServices.ts +++ b/packages/backend-test-utils/src/next/services/mockServices.ts @@ -64,10 +64,9 @@ export type ServiceMock = { factory: ServiceFactory; } & { [Key in keyof TService]: TService[Key] extends ( - this: infer This, ...args: infer Args ) => infer Return - ? TService[Key] & jest.MockInstance + ? TService[Key] & jest.MockInstance : TService[Key]; }; From 42ad082d937256b693f9ead3738ac83d9b3cc0dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 20 Sep 2023 21:15:15 +0200 Subject: [PATCH 69/82] finally fix win tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../src/reading/tree/ReadableArrayResponse.test.ts | 4 ++-- packages/config-loader/src/loader.test.ts | 2 +- packages/config-loader/src/sources/ConfigSources.test.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/backend-common/src/reading/tree/ReadableArrayResponse.test.ts b/packages/backend-common/src/reading/tree/ReadableArrayResponse.test.ts index a1f36cbd0f..a5728a6169 100644 --- a/packages/backend-common/src/reading/tree/ReadableArrayResponse.test.ts +++ b/packages/backend-common/src/reading/tree/ReadableArrayResponse.test.ts @@ -74,9 +74,9 @@ describe('ReadableArrayResponse', () => { await expect( fs.readFile(resolvePath(dir, 'file1.yaml'), 'utf8'), - ).resolves.toBe('site_name: Test\n'); + ).resolves.toMatch(/site_name: Test/); await expect( fs.readFile(resolvePath(dir, 'file2.yaml'), 'utf8'), - ).resolves.toBe('site_name: Test2\n'); + ).resolves.toMatch(/site_name: Test2/); }); }); diff --git a/packages/config-loader/src/loader.test.ts b/packages/config-loader/src/loader.test.ts index ff6d5b2551..9554e8767e 100644 --- a/packages/config-loader/src/loader.test.ts +++ b/packages/config-loader/src/loader.test.ts @@ -339,7 +339,7 @@ describe('loadConfig', () => { title: 'New Title', }, }, - path: '/root/app-config.yaml', + path: `${root}root${sep}app-config.yaml`, }, ]); diff --git a/packages/config-loader/src/sources/ConfigSources.test.ts b/packages/config-loader/src/sources/ConfigSources.test.ts index 9a02b684ab..43feb3ca27 100644 --- a/packages/config-loader/src/sources/ConfigSources.test.ts +++ b/packages/config-loader/src/sources/ConfigSources.test.ts @@ -107,7 +107,7 @@ describe('ConfigSources', () => { ).toEqual([ { name: 'FileConfigSource', - path: `${root}config.yaml`, + path: '/config.yaml', substitutionFunc: subFunc, }, ]); From dd0d1bae58be6954508de5034f538642d79e6fdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 20 Sep 2023 21:22:26 +0200 Subject: [PATCH 70/82] fetch tags too in the VP flow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .github/workflows/sync_version-packages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/sync_version-packages.yml b/.github/workflows/sync_version-packages.yml index 28fb1b64a2..127c11791d 100644 --- a/.github/workflows/sync_version-packages.yml +++ b/.github/workflows/sync_version-packages.yml @@ -16,6 +16,7 @@ jobs: - uses: actions/checkout@v3 with: fetch-depth: 20000 + fetch-tags: true token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} - name: Install Dependencies run: yarn --immutable From c0ed2394f53678ae55dcd56512c6fd7180acd031 Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Thu, 24 Aug 2023 14:58:09 +0200 Subject: [PATCH 71/82] catalog: encode entity name in EntityRefLink Signed-off-by: Vincenzo Scamporlino --- .../EntityRefLink/EntityRefLink.test.tsx | 22 +++++++++++++++++++ .../EntityRefLink/EntityRefLink.tsx | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/plugins/catalog-react/src/components/EntityRefLink/EntityRefLink.test.tsx b/plugins/catalog-react/src/components/EntityRefLink/EntityRefLink.test.tsx index b0a6b46bf5..eb783ae02b 100644 --- a/plugins/catalog-react/src/components/EntityRefLink/EntityRefLink.test.tsx +++ b/plugins/catalog-react/src/components/EntityRefLink/EntityRefLink.test.tsx @@ -174,4 +174,26 @@ describe('', () => { '/catalog/test/component/software', ); }); + + it('renders link by encoding name as URI component', async () => { + const entityName = { + kind: 'Component', + namespace: 'test', + name: 'softw#are', + }; + await renderInTestApp( + + Custom Children + , + { + mountedRoutes: { + '/catalog/:namespace/:kind/:name/*': entityRouteRef, + }, + }, + ); + expect(screen.getByText('Custom Children')).toHaveAttribute( + 'href', + '/catalog/test/component/softw%23are', + ); + }); }); diff --git a/plugins/catalog-react/src/components/EntityRefLink/EntityRefLink.tsx b/plugins/catalog-react/src/components/EntityRefLink/EntityRefLink.tsx index 06a632232e..82a98ca417 100644 --- a/plugins/catalog-react/src/components/EntityRefLink/EntityRefLink.tsx +++ b/plugins/catalog-react/src/components/EntityRefLink/EntityRefLink.tsx @@ -71,7 +71,7 @@ export const EntityRefLink = forwardRef( kind = kind.toLocaleLowerCase('en-US'); namespace = namespace?.toLocaleLowerCase('en-US') ?? DEFAULT_NAMESPACE; - const routeParams = { kind, namespace, name }; + const routeParams = { kind, namespace, name: encodeURIComponent(name) }; const formattedEntityRefTitle = humanizeEntityRef( { kind, namespace, name }, { defaultKind }, From 300466e1c1a202645e196968ad70f8268360ee4c Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Mon, 18 Sep 2023 23:37:31 +0200 Subject: [PATCH 72/82] catalog: encode entity namespace and kind Signed-off-by: Vincenzo Scamporlino --- .../src/components/EntityRefLink/EntityRefLink.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/catalog-react/src/components/EntityRefLink/EntityRefLink.tsx b/plugins/catalog-react/src/components/EntityRefLink/EntityRefLink.tsx index 82a98ca417..d682abdc2b 100644 --- a/plugins/catalog-react/src/components/EntityRefLink/EntityRefLink.tsx +++ b/plugins/catalog-react/src/components/EntityRefLink/EntityRefLink.tsx @@ -71,7 +71,11 @@ export const EntityRefLink = forwardRef( kind = kind.toLocaleLowerCase('en-US'); namespace = namespace?.toLocaleLowerCase('en-US') ?? DEFAULT_NAMESPACE; - const routeParams = { kind, namespace, name: encodeURIComponent(name) }; + const routeParams = { + kind: encodeURIComponent(kind), + namespace: encodeURIComponent(namespace), + name: encodeURIComponent(name), + }; const formattedEntityRefTitle = humanizeEntityRef( { kind, namespace, name }, { defaultKind }, From a402e1dfb977aa2d33627dfc34d15e34aacfb78f Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Mon, 18 Sep 2023 23:43:30 +0200 Subject: [PATCH 73/82] changeset Signed-off-by: Vincenzo Scamporlino --- .changeset/dull-experts-kiss.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/dull-experts-kiss.md diff --git a/.changeset/dull-experts-kiss.md b/.changeset/dull-experts-kiss.md new file mode 100644 index 0000000000..eaea346e49 --- /dev/null +++ b/.changeset/dull-experts-kiss.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-react': patch +--- + +Fixed an issue causing `EntityPage` to show an error for entities containing special characters From 951a8a71d79db06fda212270b939b75ecb958826 Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Mon, 18 Sep 2023 23:46:19 +0200 Subject: [PATCH 74/82] catalog: add tests for special characters in namespace and kind Signed-off-by: Vincenzo Scamporlino --- .../src/components/EntityRefLink/EntityRefLink.test.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/catalog-react/src/components/EntityRefLink/EntityRefLink.test.tsx b/plugins/catalog-react/src/components/EntityRefLink/EntityRefLink.test.tsx index eb783ae02b..cecf27be24 100644 --- a/plugins/catalog-react/src/components/EntityRefLink/EntityRefLink.test.tsx +++ b/plugins/catalog-react/src/components/EntityRefLink/EntityRefLink.test.tsx @@ -177,8 +177,8 @@ describe('', () => { it('renders link by encoding name as URI component', async () => { const entityName = { - kind: 'Component', - namespace: 'test', + kind: 'Compone&nt', + namespace: 'tes[t', name: 'softw#are', }; await renderInTestApp( @@ -193,7 +193,7 @@ describe('', () => { ); expect(screen.getByText('Custom Children')).toHaveAttribute( 'href', - '/catalog/test/component/softw%23are', + '/catalog/tes%5Bt/compone%26nt/softw%23are', ); }); }); From 4709607c1564a34b027888c21040dd16cbb338e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 20 Sep 2023 21:33:49 +0200 Subject: [PATCH 75/82] enter pre mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/pre.json | 250 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 250 insertions(+) create mode 100644 .changeset/pre.json diff --git a/.changeset/pre.json b/.changeset/pre.json new file mode 100644 index 0000000000..63e218f886 --- /dev/null +++ b/.changeset/pre.json @@ -0,0 +1,250 @@ +{ + "mode": "pre", + "tag": "next", + "initialVersions": { + "example-app": "0.2.87", + "@backstage/app-defaults": "1.4.3", + "example-app-next": "0.0.1", + "app-next-example-plugin": "0.0.1", + "example-backend": "0.2.87", + "@backstage/backend-app-api": "0.5.3", + "@backstage/backend-common": "0.19.5", + "@backstage/backend-defaults": "0.2.3", + "@backstage/backend-dev-utils": "0.1.1", + "example-backend-next": "0.0.15", + "@backstage/backend-openapi-utils": "0.0.4", + "@backstage/backend-plugin-api": "0.6.3", + "@backstage/backend-plugin-manager": "0.0.1", + "@backstage/backend-tasks": "0.5.8", + "@backstage/backend-test-utils": "0.2.3", + "@backstage/catalog-client": "1.4.4", + "@backstage/catalog-model": "1.4.2", + "@backstage/cli": "0.22.13", + "@backstage/cli-common": "0.1.12", + "@backstage/cli-node": "0.1.4", + "@backstage/codemods": "0.1.45", + "@backstage/config": "1.1.0", + "@backstage/config-loader": "1.5.0", + "@backstage/core-app-api": "1.10.0", + "@backstage/core-components": "0.13.5", + "@backstage/core-plugin-api": "1.6.0", + "@backstage/create-app": "0.5.5", + "@backstage/dev-utils": "1.0.21", + "e2e-test": "0.2.7", + "@backstage/errors": "1.2.2", + "@backstage/eslint-plugin": "0.1.3", + "@backstage/frontend-app-api": "0.1.0", + "@backstage/frontend-plugin-api": "0.1.0", + "@backstage/integration": "1.7.0", + "@backstage/integration-aws-node": "0.1.6", + "@backstage/integration-react": "1.1.19", + "@backstage/release-manifests": "0.0.10", + "@backstage/repo-tools": "0.3.4", + "@techdocs/cli": "1.5.0", + "techdocs-cli-embedded-app": "0.2.86", + "@backstage/test-utils": "1.4.3", + "@backstage/theme": "0.4.2", + "@backstage/types": "1.1.1", + "@backstage/version-bridge": "1.0.5", + "@backstage/plugin-adr": "0.6.7", + "@backstage/plugin-adr-backend": "0.4.0", + "@backstage/plugin-adr-common": "0.2.15", + "@backstage/plugin-airbrake": "0.3.24", + "@backstage/plugin-airbrake-backend": "0.3.0", + "@backstage/plugin-allure": "0.1.40", + "@backstage/plugin-analytics-module-ga": "0.1.33", + "@backstage/plugin-analytics-module-ga4": "0.1.4", + "@backstage/plugin-analytics-module-newrelic-browser": "0.0.2", + "@backstage/plugin-apache-airflow": "0.2.15", + "@backstage/plugin-api-docs": "0.9.11", + "@backstage/plugin-api-docs-module-protoc-gen-doc": "0.1.3", + "@backstage/plugin-apollo-explorer": "0.1.15", + "@backstage/plugin-app-backend": "0.3.51", + "@backstage/plugin-app-node": "0.1.3", + "@backstage/plugin-auth-backend": "0.19.0", + "@backstage/plugin-auth-backend-module-gcp-iap-provider": "0.1.0", + "@backstage/plugin-auth-backend-module-github-provider": "0.1.0", + "@backstage/plugin-auth-backend-module-gitlab-provider": "0.1.0", + "@backstage/plugin-auth-backend-module-google-provider": "0.1.0", + "@backstage/plugin-auth-backend-module-oauth2-provider": "0.1.0", + "@backstage/plugin-auth-node": "0.3.0", + "@backstage/plugin-azure-devops": "0.3.6", + "@backstage/plugin-azure-devops-backend": "0.4.0", + "@backstage/plugin-azure-devops-common": "0.3.1", + "@backstage/plugin-azure-sites": "0.1.13", + "@backstage/plugin-azure-sites-backend": "0.1.13", + "@backstage/plugin-azure-sites-common": "0.1.1", + "@backstage/plugin-badges": "0.2.48", + "@backstage/plugin-badges-backend": "0.3.0", + "@backstage/plugin-bazaar": "0.2.16", + "@backstage/plugin-bazaar-backend": "0.3.0", + "@backstage/plugin-bitbucket-cloud-common": "0.2.12", + "@backstage/plugin-bitrise": "0.1.51", + "@backstage/plugin-catalog": "1.13.0", + "@backstage/plugin-catalog-backend": "1.13.0", + "@backstage/plugin-catalog-backend-module-aws": "0.2.6", + "@backstage/plugin-catalog-backend-module-azure": "0.1.22", + "@backstage/plugin-catalog-backend-module-bitbucket": "0.2.18", + "@backstage/plugin-catalog-backend-module-bitbucket-cloud": "0.1.18", + "@backstage/plugin-catalog-backend-module-bitbucket-server": "0.1.16", + "@backstage/plugin-catalog-backend-module-gcp": "0.1.3", + "@backstage/plugin-catalog-backend-module-gerrit": "0.1.19", + "@backstage/plugin-catalog-backend-module-github": "0.4.0", + "@backstage/plugin-catalog-backend-module-gitlab": "0.3.0", + "@backstage/plugin-catalog-backend-module-incremental-ingestion": "0.4.6", + "@backstage/plugin-catalog-backend-module-ldap": "0.5.18", + "@backstage/plugin-catalog-backend-module-msgraph": "0.5.10", + "@backstage/plugin-catalog-backend-module-openapi": "0.1.19", + "@backstage/plugin-catalog-backend-module-puppetdb": "0.1.8", + "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "0.1.0", + "@backstage/plugin-catalog-backend-module-unprocessed": "0.3.0", + "@backstage/plugin-catalog-common": "1.0.16", + "@internal/plugin-catalog-customized": "0.0.14", + "@backstage/plugin-catalog-graph": "0.2.36", + "@backstage/plugin-catalog-graphql": "0.3.23", + "@backstage/plugin-catalog-import": "0.10.0", + "@backstage/plugin-catalog-node": "1.4.4", + "@backstage/plugin-catalog-react": "1.8.4", + "@backstage/plugin-catalog-unprocessed-entities": "0.1.3", + "@backstage/plugin-cicd-statistics": "0.1.26", + "@backstage/plugin-cicd-statistics-module-gitlab": "0.1.20", + "@backstage/plugin-circleci": "0.3.24", + "@backstage/plugin-cloudbuild": "0.3.24", + "@backstage/plugin-code-climate": "0.1.24", + "@backstage/plugin-code-coverage": "0.2.17", + "@backstage/plugin-code-coverage-backend": "0.2.17", + "@backstage/plugin-codescene": "0.1.17", + "@backstage/plugin-config-schema": "0.1.45", + "@backstage/plugin-cost-insights": "0.12.13", + "@backstage/plugin-cost-insights-common": "0.1.2", + "@backstage/plugin-devtools": "0.1.4", + "@backstage/plugin-devtools-backend": "0.2.0", + "@backstage/plugin-devtools-common": "0.1.4", + "@backstage/plugin-dynatrace": "7.0.4", + "@backstage/plugin-entity-feedback": "0.2.7", + "@backstage/plugin-entity-feedback-backend": "0.2.0", + "@backstage/plugin-entity-feedback-common": "0.1.3", + "@backstage/plugin-entity-validation": "0.1.9", + "@backstage/plugin-events-backend": "0.2.12", + "@backstage/plugin-events-backend-module-aws-sqs": "0.2.6", + "@backstage/plugin-events-backend-module-azure": "0.1.13", + "@backstage/plugin-events-backend-module-bitbucket-cloud": "0.1.13", + "@backstage/plugin-events-backend-module-gerrit": "0.1.13", + "@backstage/plugin-events-backend-module-github": "0.1.13", + "@backstage/plugin-events-backend-module-gitlab": "0.1.13", + "@backstage/plugin-events-backend-test-utils": "0.1.13", + "@backstage/plugin-events-node": "0.2.12", + "@internal/plugin-todo-list": "1.0.17", + "@internal/plugin-todo-list-backend": "1.0.17", + "@internal/plugin-todo-list-common": "1.0.13", + "@backstage/plugin-explore": "0.4.10", + "@backstage/plugin-explore-backend": "0.0.13", + "@backstage/plugin-explore-common": "0.0.2", + "@backstage/plugin-explore-react": "0.0.31", + "@backstage/plugin-firehydrant": "0.2.8", + "@backstage/plugin-fossa": "0.2.56", + "@backstage/plugin-gcalendar": "0.3.18", + "@backstage/plugin-gcp-projects": "0.3.41", + "@backstage/plugin-git-release-manager": "0.3.37", + "@backstage/plugin-github-actions": "0.6.5", + "@backstage/plugin-github-deployments": "0.1.55", + "@backstage/plugin-github-issues": "0.2.13", + "@backstage/plugin-github-pull-requests-board": "0.1.18", + "@backstage/plugin-gitops-profiles": "0.3.40", + "@backstage/plugin-gocd": "0.1.30", + "@backstage/plugin-graphiql": "0.2.54", + "@backstage/plugin-graphql-backend": "0.1.41", + "@backstage/plugin-graphql-voyager": "0.1.7", + "@backstage/plugin-home": "0.5.8", + "@backstage/plugin-home-react": "0.1.3", + "@backstage/plugin-ilert": "0.2.13", + "@backstage/plugin-jenkins": "0.8.6", + "@backstage/plugin-jenkins-backend": "0.2.6", + "@backstage/plugin-jenkins-common": "0.1.19", + "@backstage/plugin-kafka": "0.3.24", + "@backstage/plugin-kafka-backend": "0.3.0", + "@backstage/plugin-kubernetes": "0.10.3", + "@backstage/plugin-kubernetes-backend": "0.12.0", + "@backstage/plugin-kubernetes-common": "0.6.6", + "@backstage/plugin-lighthouse": "0.4.9", + "@backstage/plugin-lighthouse-backend": "0.3.0", + "@backstage/plugin-lighthouse-common": "0.1.3", + "@backstage/plugin-linguist": "0.1.9", + "@backstage/plugin-linguist-backend": "0.5.0", + "@backstage/plugin-linguist-common": "0.1.2", + "@backstage/plugin-microsoft-calendar": "0.1.7", + "@backstage/plugin-newrelic": "0.3.40", + "@backstage/plugin-newrelic-dashboard": "0.2.17", + "@backstage/plugin-nomad": "0.1.5", + "@backstage/plugin-nomad-backend": "0.1.5", + "@backstage/plugin-octopus-deploy": "0.2.6", + "@backstage/plugin-opencost": "0.2.0", + "@backstage/plugin-org": "0.6.14", + "@backstage/plugin-org-react": "0.1.13", + "@backstage/plugin-pagerduty": "0.6.5", + "@backstage/plugin-periskop": "0.1.22", + "@backstage/plugin-periskop-backend": "0.2.0", + "@backstage/plugin-permission-backend": "0.5.26", + "@backstage/plugin-permission-backend-module-allow-all-policy": "0.1.0", + "@backstage/plugin-permission-common": "0.7.8", + "@backstage/plugin-permission-node": "0.7.14", + "@backstage/plugin-permission-react": "0.4.15", + "@backstage/plugin-playlist": "0.1.16", + "@backstage/plugin-playlist-backend": "0.3.7", + "@backstage/plugin-playlist-common": "0.1.10", + "@backstage/plugin-proxy-backend": "0.4.0", + "@backstage/plugin-puppetdb": "0.1.7", + "@backstage/plugin-rollbar": "0.4.24", + "@backstage/plugin-rollbar-backend": "0.1.48", + "@backstage/plugin-scaffolder": "1.15.0", + "@backstage/plugin-scaffolder-backend": "1.17.0", + "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown": "0.2.4", + "@backstage/plugin-scaffolder-backend-module-cookiecutter": "0.2.27", + "@backstage/plugin-scaffolder-backend-module-gitlab": "0.2.6", + "@backstage/plugin-scaffolder-backend-module-rails": "0.4.20", + "@backstage/plugin-scaffolder-backend-module-sentry": "0.1.11", + "@backstage/plugin-scaffolder-backend-module-yeoman": "0.2.24", + "@backstage/plugin-scaffolder-common": "1.4.1", + "@backstage/plugin-scaffolder-node": "0.2.3", + "@backstage/plugin-scaffolder-react": "1.5.5", + "@backstage/plugin-search": "1.4.0", + "@backstage/plugin-search-backend": "1.4.3", + "@backstage/plugin-search-backend-module-catalog": "0.1.7", + "@backstage/plugin-search-backend-module-elasticsearch": "1.3.6", + "@backstage/plugin-search-backend-module-explore": "0.1.7", + "@backstage/plugin-search-backend-module-pg": "0.5.12", + "@backstage/plugin-search-backend-module-techdocs": "0.1.7", + "@backstage/plugin-search-backend-node": "1.2.7", + "@backstage/plugin-search-common": "1.2.6", + "@backstage/plugin-search-react": "1.7.0", + "@backstage/plugin-sentry": "0.5.9", + "@backstage/plugin-shortcuts": "0.3.14", + "@backstage/plugin-sonarqube": "0.7.5", + "@backstage/plugin-sonarqube-backend": "0.2.5", + "@backstage/plugin-sonarqube-react": "0.1.8", + "@backstage/plugin-splunk-on-call": "0.4.13", + "@backstage/plugin-stack-overflow": "0.1.20", + "@backstage/plugin-stack-overflow-backend": "0.2.7", + "@backstage/plugin-stackstorm": "0.1.6", + "@backstage/plugin-tech-insights": "0.3.16", + "@backstage/plugin-tech-insights-backend": "0.5.17", + "@backstage/plugin-tech-insights-backend-module-jsonfc": "0.1.35", + "@backstage/plugin-tech-insights-common": "0.2.12", + "@backstage/plugin-tech-insights-node": "0.4.9", + "@backstage/plugin-tech-radar": "0.6.8", + "@backstage/plugin-techdocs": "1.7.0", + "@backstage/plugin-techdocs-addons-test-utils": "1.0.21", + "@backstage/plugin-techdocs-backend": "1.7.0", + "@backstage/plugin-techdocs-module-addons-contrib": "1.1.0", + "@backstage/plugin-techdocs-node": "1.8.0", + "@backstage/plugin-techdocs-react": "1.1.11", + "@backstage/plugin-todo": "0.2.27", + "@backstage/plugin-todo-backend": "0.3.1", + "@backstage/plugin-user-settings": "0.7.10", + "@backstage/plugin-user-settings-backend": "0.2.1", + "@backstage/plugin-vault": "0.1.19", + "@backstage/plugin-vault-backend": "0.3.8", + "@backstage/plugin-xcmetrics": "0.2.43" + }, + "changesets": [] +} From ea80760d7e07ee07c1925b42e632e7d3b7ffed68 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 20 Sep 2023 19:34:30 +0000 Subject: [PATCH 76/82] chore(deps): update dependency @types/google-protobuf to v3.15.7 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index da98e5a3d6..8c63a98bc1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17250,9 +17250,9 @@ __metadata: linkType: hard "@types/google-protobuf@npm:^3.7.2": - version: 3.15.6 - resolution: "@types/google-protobuf@npm:3.15.6" - checksum: e8f7cd9d263093cd0a72eb10ff0bb8221e28aa8b9f601eddbe19b286932aae96fbc9ccb1f3a744525e7811fa87a6aeefd431858b6e2034f14a2dc68710a86d54 + version: 3.15.7 + resolution: "@types/google-protobuf@npm:3.15.7" + checksum: d369f1442ec943150dfc1e8af6fbc5ae2402cf3ef44953e3f4d447c203affe64d6c5d614de59561df0e03f23151df85c456d58a7e5b26a7f3ccec5899b1c22be languageName: node linkType: hard From ed7f5ebaca66fc4d0c7fd06986529dd39bc75bc9 Mon Sep 17 00:00:00 2001 From: Aramis Sennyey Date: Wed, 20 Sep 2023 16:36:01 -0400 Subject: [PATCH 77/82] rename oss plugin listing page to directory. Signed-off-by: Aramis Sennyey --- .../{add-to-marketplace.md => add-to-directory.md} | 8 ++++---- microsite/sidebars.json | 2 +- microsite/src/pages/on-demand/index.tsx | 4 ++-- microsite/src/pages/on-demand/onDemand.module.scss | 4 ++-- microsite/src/pages/plugins/index.tsx | 10 +++++----- microsite/src/pages/plugins/plugins.module.scss | 4 ++-- mkdocs.yml | 2 +- 7 files changed, 17 insertions(+), 17 deletions(-) rename docs/plugins/{add-to-marketplace.md => add-to-directory.md} (83%) diff --git a/docs/plugins/add-to-marketplace.md b/docs/plugins/add-to-directory.md similarity index 83% rename from docs/plugins/add-to-marketplace.md rename to docs/plugins/add-to-directory.md index e4281d9b3c..ae2c1cf1a2 100644 --- a/docs/plugins/add-to-marketplace.md +++ b/docs/plugins/add-to-directory.md @@ -1,12 +1,12 @@ --- -id: add-to-marketplace -title: Add to Marketplace -description: Documentation on Adding Plugin to Marketplace +id: add-to-directory +title: Add to Directory +description: Documentation on Adding Plugin to Plugin Directory --- ## Adding a Plugin to the Marketplace -To add a new plugin to the [plugin marketplace](https://backstage.io/plugins) +To add a new plugin to the [plugin directory](https://backstage.io/plugins) create a file in [`microsite/data/plugins`](https://github.com/backstage/backstage/tree/master/microsite/data/plugins) with your plugin's information. Example: diff --git a/microsite/sidebars.json b/microsite/sidebars.json index 3db2ab754d..0f4aef1373 100644 --- a/microsite/sidebars.json +++ b/microsite/sidebars.json @@ -267,7 +267,7 @@ "label": "Publishing", "items": [ "plugins/publish-private", - "plugins/add-to-marketplace", + "plugins/add-to-directory", "plugins/observability" ] } diff --git a/microsite/src/pages/on-demand/index.tsx b/microsite/src/pages/on-demand/index.tsx index 19c227b550..8d78c393ce 100644 --- a/microsite/src/pages/on-demand/index.tsx +++ b/microsite/src/pages/on-demand/index.tsx @@ -36,8 +36,8 @@ const Plugins = () => (
-
-
+
+

Community sessions

diff --git a/microsite/src/pages/on-demand/onDemand.module.scss b/microsite/src/pages/on-demand/onDemand.module.scss index fba051ec97..ff5797b687 100644 --- a/microsite/src/pages/on-demand/onDemand.module.scss +++ b/microsite/src/pages/on-demand/onDemand.module.scss @@ -1,10 +1,10 @@ .onDemandPage { - :global(.marketplaceBanner) { + :global(.communityBanner) { display: flex; align-items: center; } - :global(.marketplaceContent) { + :global(.communityContent) { flex: 1; } diff --git a/microsite/src/pages/plugins/index.tsx b/microsite/src/pages/plugins/index.tsx index 94e9df0e8d..006b7d4807 100644 --- a/microsite/src/pages/plugins/index.tsx +++ b/microsite/src/pages/plugins/index.tsx @@ -102,9 +102,9 @@ const Plugins = () => {

-
-
-

Plugin Marketplace

+
+
+

Plugin directory

Open source plugins that you can add to your Backstage deployment. @@ -113,10 +113,10 @@ const Plugins = () => {

- Add to Marketplace + Add to Directory
diff --git a/microsite/src/pages/plugins/plugins.module.scss b/microsite/src/pages/plugins/plugins.module.scss index ba2ab970a4..80ac60cf98 100644 --- a/microsite/src/pages/plugins/plugins.module.scss +++ b/microsite/src/pages/plugins/plugins.module.scss @@ -1,10 +1,10 @@ .pluginsPage { - :global(.marketplaceBanner) { + :global(.directoryBanner) { display: flex; align-items: center; } - :global(.marketplaceContent) { + :global(.directoryContent) { flex: 1; } diff --git a/mkdocs.yml b/mkdocs.yml index 66cd7ab977..de66c97884 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -137,7 +137,7 @@ nav: - Testing with Jest: 'plugins/testing.md' - Publishing: - Publish private: 'plugins/publish-private.md' - - Add to Marketplace: 'plugins/add-to-marketplace.md' + - Add to Directory: 'plugins/add-to-directory.md' - Observability: 'plugins/observability.md' - Configuration: - Static Configuration in Backstage: 'conf/index.md' From e910efaa898deb73dbda0950a27db83ab1983f83 Mon Sep 17 00:00:00 2001 From: Aramis Sennyey Date: Wed, 20 Sep 2023 16:47:21 -0400 Subject: [PATCH 78/82] additional updates in docs Signed-off-by: Aramis Sennyey --- docs/FAQ.md | 4 ++-- docs/dls/design.md | 2 +- docs/getting-started/configure-app-with-plugins.md | 2 +- docs/getting-started/project-structure.md | 2 +- docs/plugins/add-to-directory.md | 4 ++-- docs/plugins/existing-plugins.md | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/FAQ.md b/docs/FAQ.md index 3b3ae4bf73..7b935140e6 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -162,9 +162,9 @@ APIs in TypeScript, but aren't forcing it on individual plugins. ### How do I find out if a plugin already exists? You can browse and search for all available plugins in the -[Plugin Marketplace](https://backstage.io/plugins). +[Plugin Directory](https://backstage.io/plugins). -If you can't find it in the marketplace, before you write a plugin +If you can't find it in the directory, before you write a plugin [search the plugin issues](https://github.com/backstage/backstage/issues?q=is%3Aissue+label%3Aplugin+) to see if is in the works. If no one's thought of it yet, great! Open a new issue as diff --git a/docs/dls/design.md b/docs/dls/design.md index 3444ff3ad2..7e2ae90528 100644 --- a/docs/dls/design.md +++ b/docs/dls/design.md @@ -86,7 +86,7 @@ building it up with your help! ### Core Backstage User Experience This is the universal user experience that is shared amongst all Backstage -users. From more concrete aspects like the plugins marketplace to more abstract +users. From more concrete aspects like the plugins directory to more abstract ones like end-to-end workflows on Backstage, we’ll be working with the community to create a core user experience that best serves you and your organization. diff --git a/docs/getting-started/configure-app-with-plugins.md b/docs/getting-started/configure-app-with-plugins.md index 85942a8f0d..b44f7877a7 100644 --- a/docs/getting-started/configure-app-with-plugins.md +++ b/docs/getting-started/configure-app-with-plugins.md @@ -5,7 +5,7 @@ description: Documentation on How Configuring App with plugins --- Backstage plugins customize the app for your needs. There is a -[plugin marketplace](https://backstage.io/plugins) with plugins for many common +[plugin directory](https://backstage.io/plugins) with plugins for many common infrastructure needs - CI/CD, monitoring, auditing, and more. ## Adding existing plugins to your app diff --git a/docs/getting-started/project-structure.md b/docs/getting-started/project-structure.md index 7873613a7b..16f20a66ca 100644 --- a/docs/getting-started/project-structure.md +++ b/docs/getting-started/project-structure.md @@ -186,7 +186,7 @@ a dash-suffix. `-backend` means it’s a backend plugin and so on. One reason for splitting a plugin is because of its dependencies. Another reason is for clear separation of concerns. -Take a look at our [Plugin Marketplace](https://backstage.io/plugins) or browse +Take a look at our [Plugin Directory](https://backstage.io/plugins) or browse through the [`plugins/`](https://github.com/backstage/backstage/tree/master/plugins) folder. diff --git a/docs/plugins/add-to-directory.md b/docs/plugins/add-to-directory.md index ae2c1cf1a2..dfa43c2ed7 100644 --- a/docs/plugins/add-to-directory.md +++ b/docs/plugins/add-to-directory.md @@ -4,7 +4,7 @@ title: Add to Directory description: Documentation on Adding Plugin to Plugin Directory --- -## Adding a Plugin to the Marketplace +## Adding a Plugin to the Directory To add a new plugin to the [plugin directory](https://backstage.io/plugins) create a file in @@ -23,5 +23,5 @@ iconUrl: # Used as the src attribute for your logo. # You can provide an external url or add your logo under static/img and provide a path # relative to static/ e.g. img/my-logo.png npmPackageName: # Your npm package name E.g. '@backstage/plugin-' quotes are required -addedDate: # The date plugin added to marketplace E.g. '2022-10-01' quotes are required +addedDate: # The date plugin added to directory E.g. '2022-10-01' quotes are required ``` diff --git a/docs/plugins/existing-plugins.md b/docs/plugins/existing-plugins.md index 3c1ccb6438..181650adc1 100644 --- a/docs/plugins/existing-plugins.md +++ b/docs/plugins/existing-plugins.md @@ -4,7 +4,7 @@ title: Existing plugins description: Lists of existing open source plugins --- -## The Plugin Marketplace +## The Plugin Directory Open source plugins that you can add to your Backstage deployment can be found at: @@ -15,4 +15,4 @@ https://backstage.io/plugins ## Links -- [[blog] The Plugin Marketplace is open](https://backstage.io/blog/2020/09/30/plugin-marketplace) +- [[blog] The Plugin Directory is open](https://backstage.io/blog/2020/09/30/plugin-marketplace) From 594ee56e57b74b56c97fd6884450e042574df944 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 20 Sep 2023 21:08:34 +0000 Subject: [PATCH 79/82] chore(deps): update dependency @types/base64-stream to v1.0.3 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 24010f7943..ec99d344aa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16738,11 +16738,11 @@ __metadata: linkType: hard "@types/base64-stream@npm:^1.0.2": - version: 1.0.2 - resolution: "@types/base64-stream@npm:1.0.2" + version: 1.0.3 + resolution: "@types/base64-stream@npm:1.0.3" dependencies: "@types/node": "*" - checksum: 4cba1a7dedfb8bef8517a8c9ba47672835342e075de50e9cd00ea52985cb882afa85170756a6983796326c026f62253bbcf4401a25c5ca461b4783194ace2bb5 + checksum: 4c0328ad7540d57e0f7ddf0135941adc0d1902e6b0f5d6f93537b417d82ae8f996389e14269c67e7c29f9eb6fc717f2f47ffa3f7e35f9a8096e84c3ee7b9853f languageName: node linkType: hard From 9f235e67421a124bc198386349b6d0dc1694bd5b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 20 Sep 2023 21:09:27 +0000 Subject: [PATCH 80/82] chore(deps): update dependency @types/body-parser to v1.19.3 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 24010f7943..a25a912f66 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16760,12 +16760,12 @@ __metadata: linkType: hard "@types/body-parser@npm:*, @types/body-parser@npm:^1.19.0": - version: 1.19.2 - resolution: "@types/body-parser@npm:1.19.2" + version: 1.19.3 + resolution: "@types/body-parser@npm:1.19.3" dependencies: "@types/connect": "*" "@types/node": "*" - checksum: e17840c7d747a549f00aebe72c89313d09fbc4b632b949b2470c5cb3b1cb73863901ae84d9335b567a79ec5efcfb8a28ff8e3f36bc8748a9686756b6d5681f40 + checksum: 932fa71437c275023799123680ef26ffd90efd37f51a1abe405e6ae6e5b4ad9511b7a3a8f5a12877ed1444a02b6286c0a137a98e914b3c61932390c83643cc2c languageName: node linkType: hard From 8e248a6cbec5573c775283b533871e10b3272a2b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 20 Sep 2023 21:11:06 +0000 Subject: [PATCH 81/82] chore(deps): update dependency @types/semver to v7.5.2 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 24010f7943..041c6a662d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18217,9 +18217,9 @@ __metadata: linkType: hard "@types/semver@npm:^7.3.12, @types/semver@npm:^7.3.8, @types/semver@npm:^7.5.0": - version: 7.5.1 - resolution: "@types/semver@npm:7.5.1" - checksum: 2fffe938c7ac168711f245a16e1856a3578d77161ca17e29a05c3e02c7be3e9c5beefa29a3350f6c1bd982fb70aa28cc52e4845eb7d36246bcdc0377170d584d + version: 7.5.2 + resolution: "@types/semver@npm:7.5.2" + checksum: 743aa8a2b58e20b329c19bd2459152cb049d12fafab7279b90ac11e0f268c97efbcb606ea0c681cca03f79015381b40d9b1244349b354270bec3f939ed49f6e9 languageName: node linkType: hard From c703c4b62dd077334c87294c6e679bf40c5f4231 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 20 Sep 2023 21:58:36 +0000 Subject: [PATCH 82/82] chore(deps): update dependency @types/jquery to v3.5.19 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 041c6a662d..2e024a9add 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17431,11 +17431,11 @@ __metadata: linkType: hard "@types/jquery@npm:^3.3.34": - version: 3.5.18 - resolution: "@types/jquery@npm:3.5.18" + version: 3.5.19 + resolution: "@types/jquery@npm:3.5.19" dependencies: "@types/sizzle": "*" - checksum: 6576bc9a6d35671ceb464e8f937b7eb916227b38b4edf8769a0bc628cfbb9f211b61ccd4158d42aa31591f2c6766b7095430f820d374f70245258ac6cec3e439 + checksum: 0298e53a353089e2abae4be2f660b5f2bfb4797464623701c5c2f2c911317b554f1887c2c3d587d0f724d70a3fb5e31907bf7fa5d96df33af07e2842660ef52a languageName: node linkType: hard