From 91767ddc5442226896d52e83b01824b988ac15fe Mon Sep 17 00:00:00 2001 From: Julien Date: Wed, 26 Jun 2024 17:11:16 +0200 Subject: [PATCH 001/217] feat(visitsApi): make use of limit query param Signed-off-by: Julien --- plugins/home/src/api/VisitsStorageApi.test.ts | 48 +++++++++++++++---- plugins/home/src/api/VisitsStorageApi.ts | 4 +- 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/plugins/home/src/api/VisitsStorageApi.test.ts b/plugins/home/src/api/VisitsStorageApi.test.ts index e361c624b9..5e8bc2dbfc 100644 --- a/plugins/home/src/api/VisitsStorageApi.test.ts +++ b/plugins/home/src/api/VisitsStorageApi.test.ts @@ -134,11 +134,25 @@ describe('VisitsStorageApi.create', () => { let visitsToSave: Array>; let baseDate: number; + const fillVisitsApi = () => { + baseDate = Date.now(); + // Chaining items to ensure the right setSystemTime + return visitsToSave.reduce( + (acc, visit, index) => + acc.then(() => { + jest.setSystemTime(baseDate + 360_000 * index); + return api.save({ visit }); + }), + Promise.resolve({}), + ); + }; + beforeEach(() => { api = VisitsStorageApi.create({ storageApi: MockStorageApi.create(), identityApi: mockIdentityApi, }); + visitsToSave = [ { pathname: '/catalog/default/component/playback-order-1', @@ -156,16 +170,8 @@ describe('VisitsStorageApi.create', () => { name: 'Playback Order Odd', }, ]; - baseDate = Date.now(); - // Chaining items to ensure the right setSystemTime - return visitsToSave.reduce( - (acc, visit, index) => - acc.then(() => { - jest.setSystemTime(baseDate + 360_000 * index); - return api.save({ visit }); - }), - Promise.resolve({}), - ); + + return fillVisitsApi(); }); it('retrieves visits', async () => { @@ -335,5 +341,27 @@ describe('VisitsStorageApi.create', () => { expect(visits).toHaveLength(1); expect(visits).toEqual([expect.objectContaining(visitsToSave[0])]); }); + + it('retrieves a limited set of visits according to given limit', async () => { + const visits = await api.list({ + limit: 2, + }); + expect(visitsToSave.length).toBeGreaterThan(2); + expect(visits.length).toEqual(2); + }); + + it('retrieves a default set of 8 visits', async () => { + visitsToSave = Array.from({ length: 9 }, (_, index) => ({ + pathname: `/catalog/default/component/playback-order-${index}`, + entityRef: `component:default/playback-order-${index}`, + name: `Playback Order ${index}`, + })); + + await fillVisitsApi(); + + const visits = await api.list(); + expect(visitsToSave.length).toBeGreaterThan(8); + expect(visits.length).toEqual(8); + }); }); }); diff --git a/plugins/home/src/api/VisitsStorageApi.ts b/plugins/home/src/api/VisitsStorageApi.ts index a7cd063455..ca19dcbdf1 100644 --- a/plugins/home/src/api/VisitsStorageApi.ts +++ b/plugins/home/src/api/VisitsStorageApi.ts @@ -30,6 +30,8 @@ export type VisitsStorageApiOptions = { type ArrayElement = A extends readonly (infer T)[] ? T : never; +const DEFAULT_LIST_LIMIT = 8; + /** * @public * This is an implementation of VisitsApi that relies on a StorageApi. @@ -83,7 +85,7 @@ export class VisitsStorageApi implements VisitsApi { }); }); - return visits; + return visits.slice(0, queryParams?.limit ?? DEFAULT_LIST_LIMIT); } /** From 9893bb52a48caffb0ebd188d587c8de238855dc7 Mon Sep 17 00:00:00 2001 From: Julien Date: Wed, 26 Jun 2024 17:11:40 +0200 Subject: [PATCH 002/217] chore: add changeset Signed-off-by: Julien --- .changeset/olive-walls-wave.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/olive-walls-wave.md diff --git a/.changeset/olive-walls-wave.md b/.changeset/olive-walls-wave.md new file mode 100644 index 0000000000..bc6264bbcb --- /dev/null +++ b/.changeset/olive-walls-wave.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-home': minor +--- + +**BREAKING** Implement usage of unused `limit` query param in visits API `.list()` function From 875ceaee9a016b2af1dac949bf4735623fcfd535 Mon Sep 17 00:00:00 2001 From: Jordan Snow Date: Thu, 29 Aug 2024 17:16:36 +0200 Subject: [PATCH 003/217] Negation key word to entity filter Signed-off-by: Jordan Snow --- .../alpha/filter/matchers/createHasMatcher.ts | 5 +++- .../alpha/filter/matchers/createIsMatcher.ts | 4 ++- .../filter/matchers/createKindMatcher.ts | 5 +++- .../filter/matchers/createTypeMatcher.ts | 7 ++--- .../filter/parseFilterExpression.test.ts | 14 ++++++++++ .../src/alpha/filter/parseFilterExpression.ts | 27 ++++++++++++++++--- 6 files changed, 52 insertions(+), 10 deletions(-) diff --git a/plugins/catalog/src/alpha/filter/matchers/createHasMatcher.ts b/plugins/catalog/src/alpha/filter/matchers/createHasMatcher.ts index 9fd393a561..a34834e40d 100644 --- a/plugins/catalog/src/alpha/filter/matchers/createHasMatcher.ts +++ b/plugins/catalog/src/alpha/filter/matchers/createHasMatcher.ts @@ -16,6 +16,7 @@ import { InputError } from '@backstage/errors'; import { EntityMatcherFn } from './types'; +import { Entity } from '@backstage/catalog-model'; const allowedMatchers: Record = { labels: entity => { @@ -32,6 +33,7 @@ const allowedMatchers: Record = { export function createHasMatcher( parameters: string[], onParseError: (error: Error) => void, + negation?: boolean, ): EntityMatcherFn { const matchers = parameters.flatMap(parameter => { const matcher = allowedMatchers[parameter.toLocaleLowerCase('en-US')]; @@ -47,6 +49,7 @@ export function createHasMatcher( return [matcher]; }); - return entity => + const isMatch = (entity: Entity) => matchers.length ? matchers.some(matcher => matcher(entity)) : true; + return negation ? entity => !isMatch(entity) : isMatch; } diff --git a/plugins/catalog/src/alpha/filter/matchers/createIsMatcher.ts b/plugins/catalog/src/alpha/filter/matchers/createIsMatcher.ts index 49a54349d1..5df4f2ffe8 100644 --- a/plugins/catalog/src/alpha/filter/matchers/createIsMatcher.ts +++ b/plugins/catalog/src/alpha/filter/matchers/createIsMatcher.ts @@ -28,6 +28,7 @@ const allowedMatchers: Record = { export function createIsMatcher( parameters: string[], onParseError: (error: Error) => void, + negation?: boolean, ): EntityMatcherFn { const matchers = parameters.flatMap(parameter => { const matcher = allowedMatchers[parameter.toLocaleLowerCase('en-US')]; @@ -43,6 +44,7 @@ export function createIsMatcher( return [matcher]; }); - return entity => + const isMatch = (entity: any) => matchers.length ? matchers.some(matcher => matcher(entity)) : true; + return negation ? entity => !isMatch(entity) : isMatch; } diff --git a/plugins/catalog/src/alpha/filter/matchers/createKindMatcher.ts b/plugins/catalog/src/alpha/filter/matchers/createKindMatcher.ts index 4f7c475ebe..6d7a3ff162 100644 --- a/plugins/catalog/src/alpha/filter/matchers/createKindMatcher.ts +++ b/plugins/catalog/src/alpha/filter/matchers/createKindMatcher.ts @@ -22,7 +22,10 @@ import { EntityMatcherFn } from './types'; export function createKindMatcher( parameters: string[], _onParseError: (error: Error) => void, + negation?: boolean, ): EntityMatcherFn { const items = parameters.map(p => p.toLocaleLowerCase('en-US')); - return entity => items.includes(entity.kind.toLocaleLowerCase('en-US')); + const isMatch = (entity: any) => + items.includes(entity.kind.toLocaleLowerCase('en-US')); + return negation ? entity => !isMatch(entity) : isMatch; } diff --git a/plugins/catalog/src/alpha/filter/matchers/createTypeMatcher.ts b/plugins/catalog/src/alpha/filter/matchers/createTypeMatcher.ts index 31f7a5a461..7bd7e56dfe 100644 --- a/plugins/catalog/src/alpha/filter/matchers/createTypeMatcher.ts +++ b/plugins/catalog/src/alpha/filter/matchers/createTypeMatcher.ts @@ -22,13 +22,14 @@ import { EntityMatcherFn } from './types'; export function createTypeMatcher( parameters: string[], _onParseError: (error: Error) => void, + negation?: boolean, ): EntityMatcherFn { const items = parameters.map(p => p.toLocaleLowerCase('en-US')); return entity => { const value = entity.spec?.type; - return ( + const isMatch = typeof value === 'string' && - items.includes(value.toLocaleLowerCase('en-US')) - ); + items.includes(value.toLocaleLowerCase('en-US')); + return negation ? !isMatch : isMatch; }; } diff --git a/plugins/catalog/src/alpha/filter/parseFilterExpression.test.ts b/plugins/catalog/src/alpha/filter/parseFilterExpression.test.ts index 616091739e..7ebadde13a 100644 --- a/plugins/catalog/src/alpha/filter/parseFilterExpression.test.ts +++ b/plugins/catalog/src/alpha/filter/parseFilterExpression.test.ts @@ -93,6 +93,20 @@ describe('parseFilterExpression', () => { ); }); + it('recognizes negation key', () => { + const component = { kind: 'Component' } as unknown as Entity; + expect(run('not:kind:user')(component)).toBe(true); + }); + + it('supports negation and affirmative expressions', () => { + const component = { + kind: 'Component', + spec: { type: 'service' }, + } as unknown as Entity; + expect(run('not:kind:user type:service')(component)).toBe(true); + expect(run('type:service not:kind:user')(component)).toBe(true); + }); + it('rejects unknown keys', () => { expect(() => run('unknown:foo')).toThrowErrorMatchingInlineSnapshot( `"'unknown' is not a valid filter expression key, expected one of 'kind','type','is','has'"`, diff --git a/plugins/catalog/src/alpha/filter/parseFilterExpression.ts b/plugins/catalog/src/alpha/filter/parseFilterExpression.ts index 4f809690f7..906fa45367 100644 --- a/plugins/catalog/src/alpha/filter/parseFilterExpression.ts +++ b/plugins/catalog/src/alpha/filter/parseFilterExpression.ts @@ -27,6 +27,7 @@ const rootMatcherFactories: Record< ( parameters: string[], onParseError: (error: Error) => void, + negation?: boolean, ) => EntityMatcherFn > = { kind: createKindMatcher, @@ -60,10 +61,14 @@ export function parseFilterExpression(expression: string): { const parts = splitFilterExpression(expression, e => expressionParseErrors.push(e), ); - + let negation = false; const matchers = parts.flatMap(part => { const factory = rootMatcherFactories[part.key]; if (!factory) { + if (isNegation(part.key)) { + negation = true; + return []; + } const known = Object.keys(rootMatcherFactories).map(m => `'${m}'`); expressionParseErrors.push( new InputError( @@ -73,9 +78,12 @@ export function parseFilterExpression(expression: string): { return []; } - const matcher = factory(part.parameters, e => - expressionParseErrors.push(e), + const matcher = factory( + part.parameters, + e => expressionParseErrors.push(e), + negation, ); + negation = false; return [matcher]; }); @@ -106,7 +114,11 @@ export function splitFilterExpression( const result = new Array<{ key: string; parameters: string[] }>(); for (const word of words) { - const match = word.match(/^([^:]+):(.+)$/); + let match = word.match(/^([^:]+):(.+)$/); + if (match && isNegation(match[1])) { + result.push({ key: 'not', parameters: [] }); + match = match[2].match(/^([^:]+):(.+)$/) || null; + } if (!match) { onParseError( new InputError( @@ -124,3 +136,10 @@ export function splitFilterExpression( return result; } + +function isNegation(parameter: string): boolean { + if (parameter.toLocaleLowerCase('en-US') === 'not') { + return true; + } + return false; +} From 77748284446866374f5404d7b93532743afd15b8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Sep 2024 16:20:05 +0000 Subject: [PATCH 004/217] fix(deps): update dependency @smithy/node-http-handler to v3 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .changeset/renovate-7874fad.md | 5 +++ plugins/techdocs-node/package.json | 2 +- yarn.lock | 66 +----------------------------- 3 files changed, 8 insertions(+), 65 deletions(-) create mode 100644 .changeset/renovate-7874fad.md diff --git a/.changeset/renovate-7874fad.md b/.changeset/renovate-7874fad.md new file mode 100644 index 0000000000..b7ccd5fe95 --- /dev/null +++ b/.changeset/renovate-7874fad.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs-node': patch +--- + +Updated dependency `@smithy/node-http-handler` to `^3.0.0`. diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index 079beba786..cf1253a17d 100644 --- a/plugins/techdocs-node/package.json +++ b/plugins/techdocs-node/package.json @@ -62,7 +62,7 @@ "@backstage/plugin-search-common": "workspace:^", "@backstage/plugin-techdocs-common": "workspace:^", "@google-cloud/storage": "^7.0.0", - "@smithy/node-http-handler": "^2.1.7", + "@smithy/node-http-handler": "^3.0.0", "@trendyol-js/openstack-swift-sdk": "^0.0.7", "@types/express": "^4.17.6", "dockerode": "^4.0.0", diff --git a/yarn.lock b/yarn.lock index eda2edf116..8ba7984659 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7935,7 +7935,7 @@ __metadata: "@backstage/plugin-search-common": "workspace:^" "@backstage/plugin-techdocs-common": "workspace:^" "@google-cloud/storage": ^7.0.0 - "@smithy/node-http-handler": ^2.1.7 + "@smithy/node-http-handler": ^3.0.0 "@trendyol-js/openstack-swift-sdk": ^0.0.7 "@types/express": ^4.17.6 "@types/fs-extra": ^11.0.0 @@ -14864,16 +14864,6 @@ __metadata: languageName: node linkType: hard -"@smithy/abort-controller@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/abort-controller@npm:2.2.0" - dependencies: - "@smithy/types": ^2.12.0 - tslib: ^2.6.2 - checksum: d0d7fcaa7b67b04c9ad825017110cc294ff06af07f8054ac3b75d8de88ff5fbef1d08f5c1ae672db1839d14ce25f277c459d2b7b7263cbe9e6c3d4518a19230e - languageName: node - linkType: hard - "@smithy/abort-controller@npm:^3.1.2": version: 3.1.2 resolution: "@smithy/abort-controller@npm:3.1.2" @@ -15164,20 +15154,7 @@ __metadata: languageName: node linkType: hard -"@smithy/node-http-handler@npm:^2.1.7": - version: 2.5.0 - resolution: "@smithy/node-http-handler@npm:2.5.0" - dependencies: - "@smithy/abort-controller": ^2.2.0 - "@smithy/protocol-http": ^3.3.0 - "@smithy/querystring-builder": ^2.2.0 - "@smithy/types": ^2.12.0 - tslib: ^2.6.2 - checksum: 2e63fafdac5bef62181994af2ec065b0f7f04eaed88fb2990a21a9925226fead5013cf4f232b527f3f4d9ffb68ccbe8cd263ad22a7351d36b0dc23e975929a0c - languageName: node - linkType: hard - -"@smithy/node-http-handler@npm:^3.2.0": +"@smithy/node-http-handler@npm:^3.0.0, @smithy/node-http-handler@npm:^3.2.0": version: 3.2.0 resolution: "@smithy/node-http-handler@npm:3.2.0" dependencies: @@ -15200,16 +15177,6 @@ __metadata: languageName: node linkType: hard -"@smithy/protocol-http@npm:^3.3.0": - version: 3.3.0 - resolution: "@smithy/protocol-http@npm:3.3.0" - dependencies: - "@smithy/types": ^2.12.0 - tslib: ^2.6.2 - checksum: 6c1aaaee9f6ecfb841766938312268f30cbda253f172de7467463aae7d7bfea19a801ab570f3737334e992d2d0ee7446e6af6a6fd82b08533790c489289dff76 - languageName: node - linkType: hard - "@smithy/protocol-http@npm:^4.1.1": version: 4.1.1 resolution: "@smithy/protocol-http@npm:4.1.1" @@ -15220,17 +15187,6 @@ __metadata: languageName: node linkType: hard -"@smithy/querystring-builder@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/querystring-builder@npm:2.2.0" - dependencies: - "@smithy/types": ^2.12.0 - "@smithy/util-uri-escape": ^2.2.0 - tslib: ^2.6.2 - checksum: db492903302a694a0e982c37b9a74314160c5ee485742f24f8b6d0da66f121e7ff8588742a3a1964f6b983c15cacd52b883c5efa714882a754f575da7a7e014d - languageName: node - linkType: hard - "@smithy/querystring-builder@npm:^3.0.4": version: 3.0.4 resolution: "@smithy/querystring-builder@npm:3.0.4" @@ -15310,15 +15266,6 @@ __metadata: languageName: node linkType: hard -"@smithy/types@npm:^2.12.0": - version: 2.12.0 - resolution: "@smithy/types@npm:2.12.0" - dependencies: - tslib: ^2.6.2 - checksum: 2dd93746624d87afbf51c22116fc69f82e95004b78cf681c4a283d908155c22a2b7a3afbd64a3aff7deefb6619276f186e212422ad200df3b42c32ef5330374e - languageName: node - linkType: hard - "@smithy/types@npm:^3.4.0": version: 3.4.0 resolution: "@smithy/types@npm:3.4.0" @@ -15482,15 +15429,6 @@ __metadata: languageName: node linkType: hard -"@smithy/util-uri-escape@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/util-uri-escape@npm:2.2.0" - dependencies: - tslib: ^2.6.2 - checksum: bade35312d75d1c84226f2a81b70dfef91766c02ecb6c6854b6f920cddb423e01963f7d0c183d523b5991f8e7ca93bcf73f8b3c6923979152b8350c9f3c24fd6 - languageName: node - linkType: hard - "@smithy/util-uri-escape@npm:^3.0.0": version: 3.0.0 resolution: "@smithy/util-uri-escape@npm:3.0.0" From b06aa48d97900ff895d4810d6b593f78c97a00d1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 12 Sep 2024 09:46:31 +0000 Subject: [PATCH 005/217] fix(deps): update dependency azure-devops-node-api to v14 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .changeset/renovate-87a3bd2.md | 5 +++ packages/backend-legacy/package.json | 2 +- .../package.json | 2 +- yarn.lock | 43 +++++++++++-------- 4 files changed, 33 insertions(+), 19 deletions(-) create mode 100644 .changeset/renovate-87a3bd2.md diff --git a/.changeset/renovate-87a3bd2.md b/.changeset/renovate-87a3bd2.md new file mode 100644 index 0000000000..c14def75b7 --- /dev/null +++ b/.changeset/renovate-87a3bd2.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-azure': patch +--- + +Updated dependency `azure-devops-node-api` to `^14.0.0`. diff --git a/packages/backend-legacy/package.json b/packages/backend-legacy/package.json index 5a19677e99..c09afa950d 100644 --- a/packages/backend-legacy/package.json +++ b/packages/backend-legacy/package.json @@ -66,7 +66,7 @@ "@backstage/plugin-techdocs-backend": "workspace:^", "@gitbeaker/node": "^35.1.0", "@octokit/rest": "^19.0.3", - "azure-devops-node-api": "^12.0.0", + "azure-devops-node-api": "^14.0.0", "better-sqlite3": "^11.0.0", "dockerode": "^4.0.0", "example-app": "link:../app", diff --git a/plugins/scaffolder-backend-module-azure/package.json b/plugins/scaffolder-backend-module-azure/package.json index 7c5dd0a317..3dea25c433 100644 --- a/plugins/scaffolder-backend-module-azure/package.json +++ b/plugins/scaffolder-backend-module-azure/package.json @@ -47,7 +47,7 @@ "@backstage/errors": "workspace:^", "@backstage/integration": "workspace:^", "@backstage/plugin-scaffolder-node": "workspace:^", - "azure-devops-node-api": "^12.0.0", + "azure-devops-node-api": "^14.0.0", "yaml": "^2.0.0" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index f1a35276a2..92894d8438 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6936,7 +6936,7 @@ __metadata: "@backstage/integration": "workspace:^" "@backstage/plugin-scaffolder-node": "workspace:^" "@backstage/plugin-scaffolder-node-test-utils": "workspace:^" - azure-devops-node-api: ^12.0.0 + azure-devops-node-api: ^14.0.0 yaml: ^2.0.0 languageName: unknown linkType: soft @@ -21084,13 +21084,13 @@ __metadata: languageName: node linkType: hard -"azure-devops-node-api@npm:^12.0.0": - version: 12.5.0 - resolution: "azure-devops-node-api@npm:12.5.0" +"azure-devops-node-api@npm:^14.0.0": + version: 14.0.2 + resolution: "azure-devops-node-api@npm:14.0.2" dependencies: tunnel: 0.0.6 - typed-rest-client: ^1.8.4 - checksum: 7c2c3ae21eaf1bc3627ba4ea87bdac1085a3594eacf40eb6d7b11292f057988db38f718f4597733c6861d854c28bfe146bcf3964a13adddebe1085270bb63097 + typed-rest-client: ^2.0.1 + checksum: 26f39c7772d313befd49696fe2a1e91a8ffd75cfeb0c7f305a7102867f1090d299544361663b14e99bbebbf5855d1fc56ead0e4e32ee53bc83b487cdbe30d254 languageName: node linkType: hard @@ -24510,13 +24510,13 @@ __metadata: languageName: node linkType: hard -"des.js@npm:^1.0.0": - version: 1.0.1 - resolution: "des.js@npm:1.0.1" +"des.js@npm:^1.0.0, des.js@npm:^1.1.0": + version: 1.1.0 + resolution: "des.js@npm:1.1.0" dependencies: inherits: ^2.0.1 minimalistic-assert: ^1.0.0 - checksum: 1ec2eedd7ed6bd61dd5e0519fd4c96124e93bb22de8a9d211b02d63e5dd152824853d919bb2090f965cc0e3eb9c515950a9836b332020d810f9c71feb0fd7df4 + checksum: 0e9c1584b70d31e20f20a613fc9ef60fbc6a147dfec9e448a168794a4b97ac04d8dc47ea008f1fa93b0f8aaf7c1ead632a5e59ce1913a6079d2d244c9f5ebe33 languageName: node linkType: hard @@ -26467,7 +26467,7 @@ __metadata: "@types/express": ^4.17.6 "@types/express-serve-static-core": ^4.17.5 "@types/luxon": ^3.0.0 - azure-devops-node-api: ^12.0.0 + azure-devops-node-api: ^14.0.0 better-sqlite3: ^11.0.0 dockerode: ^4.0.0 example-app: "link:../app" @@ -31105,6 +31105,13 @@ __metadata: languageName: node linkType: hard +"js-md4@npm:^0.3.2": + version: 0.3.2 + resolution: "js-md4@npm:0.3.2" + checksum: aa7b7cbd738b105f86fc0fa50ce2a7a6b6b329ff3f713d1bd38b12c2a72929bab5a16e658a03830faa8d656356aa89b4f77f1fbf05ffa8d095bda6d831441c2d + languageName: node + linkType: hard + "js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" @@ -37562,7 +37569,7 @@ __metadata: languageName: node linkType: hard -"qs@npm:6.13.0, qs@npm:^6.10.1, qs@npm:^6.10.2, qs@npm:^6.11.0, qs@npm:^6.11.2, qs@npm:^6.12.2, qs@npm:^6.9.1, qs@npm:^6.9.4": +"qs@npm:6.13.0, qs@npm:^6.10.1, qs@npm:^6.10.2, qs@npm:^6.10.3, qs@npm:^6.11.0, qs@npm:^6.11.2, qs@npm:^6.12.2, qs@npm:^6.9.4": version: 6.13.0 resolution: "qs@npm:6.13.0" dependencies: @@ -42634,14 +42641,16 @@ __metadata: languageName: node linkType: hard -"typed-rest-client@npm:^1.8.4": - version: 1.8.4 - resolution: "typed-rest-client@npm:1.8.4" +"typed-rest-client@npm:^2.0.1": + version: 2.0.2 + resolution: "typed-rest-client@npm:2.0.2" dependencies: - qs: ^6.9.1 + des.js: ^1.1.0 + js-md4: ^0.3.2 + qs: ^6.10.3 tunnel: 0.0.6 underscore: ^1.12.1 - checksum: 238e2139724310fed39756ae734fbc811e803abaa7598720ad6cc5ab7f160d415d8107551422b186f6b2e08c5761c0e7b66ca47d60b2ccd952bb5e20d3b92f3c + checksum: f1d9a0ffd5b7266f01df9ea4eb08b8da04793cf6902d82b3c6a46d1328cdefe80bb0cfc8f96afa645077c234ec218d8b16f642da35c1e2f1adf3d61a5904d8d1 languageName: node linkType: hard From 74802300c42808126b9b324a80445f7e6f13ba2d Mon Sep 17 00:00:00 2001 From: Matthew Bednarski Date: Sun, 15 Sep 2024 19:43:16 +0200 Subject: [PATCH 006/217] Update bitbucketServerPullRequest.ts - protocol from apiBaseUrl use the protocol from apiBaseUrl instead of hard-coded "https" Signed-off-by: Matthew Bednarski --- .../src/actions/bitbucketServerPullRequest.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts b/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts index 440e402764..2ff06aa45d 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts +++ b/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts @@ -237,6 +237,10 @@ const getDefaultBranch = async (opts: { } return defaultBranch; }; +const parseProtocol = (apiBaseUrl: string) => { + const url = new Url(apiBaseUrl); + return url.protocol || 'https'; +}; /** * Creates a BitbucketServer Pull Request action. * @public @@ -401,7 +405,8 @@ export function createPublishBitbucketServerPullRequestAction(options: { startPoint: latestCommit, }); - const remoteUrl = `https://${host}/scm/${project}/${repo}.git`; + const protocol = parseProtocol(apiBaseUrl); + const remoteUrl = `${protocol}://${host}/scm/${project}/${repo}.git`; const auth = authConfig.token ? { From 461216de6505a87265cac088c56e35de3388d69d Mon Sep 17 00:00:00 2001 From: Joshua Jung Date: Tue, 17 Sep 2024 19:35:12 -0500 Subject: [PATCH 007/217] Updating docs for issue 26754 Signed-off-by: Joshua Jung --- docs/features/search/how-to-guides.md | 53 ++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 10 deletions(-) diff --git a/docs/features/search/how-to-guides.md b/docs/features/search/how-to-guides.md index 93c04c7af4..7cbb5c3bb8 100644 --- a/docs/features/search/how-to-guides.md +++ b/docs/features/search/how-to-guides.md @@ -143,21 +143,54 @@ how highlighted terms look you can follow Backstage's guide on how to [Customize the look-and-feel of your App](https://backstage.io/docs/getting-started/app-custom-theme) to create an override with your preferred styling. -For example, the following will result in highlighted terms to be bold & underlined: +For example, using the new MUI V4+V5 unified theming method, the following will result +in highlighted words to be bold & underlined: -```tsx -const highlightOverride = { - BackstageHighlightedSearchResultText: { - highlight: { - color: 'inherit', - backgroundColor: 'inherit', - fontWeight: 'bold', - textDecoration: 'underline', +```typescript jsx title=packages/app/src/theme/theme.ts +import { + createBaseThemeOptions, + createUnifiedTheme, + palettes, + UnifiedTheme, +} from '@backstage/theme'; + +export const myLightTheme: UnifiedTheme = createUnifiedTheme({ + ...createBaseThemeOptions({ + palette: palettes.light, + }), + defaultPageTheme: 'home', + components: { + /** @ts-ignore This is temporarily necessary until MUI V5 transition is completed. */ + BackstageHighlightedSearchResultText: { + styleOverrides: { + highlight: { + color: 'inherit', + backgroundColor: 'inherit', + fontWeight: 'bold', + textDecoration: 'underline', + }, + }, }, }, -}; +}); ``` +```typescript jsx title= packages/app/src/App.tsx + +const app : BackstageApp = createApp({ + ... + themes: [{ + id: 'my-light-theme', + title: 'Light Theme', + variant: 'light', + icon: , + Provider: ({ children }) => () + }] +}); +``` + +Obviously if you wanted a dark theme, you would need to provide that as well. + ## How to render search results using extensions Extensions for search results let you customize components used to render search result items, It is possible to provide your own search result item extensions or use the ones provided by plugin packages. From 5b6edf1ccfde6ef7d3e61b6254d7333bec524ffb Mon Sep 17 00:00:00 2001 From: Thomas Cardonne Date: Wed, 18 Sep 2024 22:44:14 +0200 Subject: [PATCH 008/217] fix(catalog-backend-module-gerrit): add schedule in config.d.ts Signed-off-by: Thomas Cardonne --- .changeset/cyan-cooks-sing.md | 5 +++++ plugins/catalog-backend-module-gerrit/config.d.ts | 6 ++++++ 2 files changed, 11 insertions(+) create mode 100644 .changeset/cyan-cooks-sing.md diff --git a/.changeset/cyan-cooks-sing.md b/.changeset/cyan-cooks-sing.md new file mode 100644 index 0000000000..18aa3966ec --- /dev/null +++ b/.changeset/cyan-cooks-sing.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-gerrit': patch +--- + +Add missing `schedule` key in `config.d.ts` diff --git a/plugins/catalog-backend-module-gerrit/config.d.ts b/plugins/catalog-backend-module-gerrit/config.d.ts index a246662b0a..8f38b47771 100644 --- a/plugins/catalog-backend-module-gerrit/config.d.ts +++ b/plugins/catalog-backend-module-gerrit/config.d.ts @@ -14,6 +14,8 @@ * limitations under the License. */ +import { SchedulerServiceTaskScheduleDefinition } from '@backstage/backend-plugin-api'; + export interface Config { catalog?: { /** @@ -41,6 +43,10 @@ export interface Config { * The branch where the provider will try to find entities. Defaults to "master". */ branch?: string; + /** + * (Optional) TaskScheduleDefinition for the discovery. + */ + schedule?: SchedulerServiceTaskScheduleDefinition; }; }; }; From 66a6b4579c79632b029cc68396d755c1275a9854 Mon Sep 17 00:00:00 2001 From: Matthew Bednarski Date: Mon, 16 Sep 2024 17:43:03 +0200 Subject: [PATCH 009/217] chore: adding generated changeset PR-26687 Signed-off-by: Matthew Bednarski --- .changeset/two-plums-fail.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/two-plums-fail.md diff --git a/.changeset/two-plums-fail.md b/.changeset/two-plums-fail.md new file mode 100644 index 0000000000..ed1b4af4ab --- /dev/null +++ b/.changeset/two-plums-fail.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-bitbucket-server': minor +--- + +Use protocol from Bitbucket Server apiBaseUrl config parameter instead of hard-coded https From f5436329884007ea1e04aef07817a200bdb1121f Mon Sep 17 00:00:00 2001 From: Matthew Bednarski Date: Mon, 16 Sep 2024 18:06:35 +0200 Subject: [PATCH 010/217] fix: wrong url instantiation Signed-off-by: Matthew Bednarski --- .../src/actions/bitbucketServerPullRequest.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts b/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts index 2ff06aa45d..ed7c0411b5 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts +++ b/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts @@ -238,7 +238,7 @@ const getDefaultBranch = async (opts: { return defaultBranch; }; const parseProtocol = (apiBaseUrl: string) => { - const url = new Url(apiBaseUrl); + const url = new URL(apiBaseUrl); return url.protocol || 'https'; }; /** From 2001ff8aee8f37d80436feac89ca0500759424de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Fri, 20 Sep 2024 12:56:06 +0200 Subject: [PATCH 011/217] Update .changeset/olive-walls-wave.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/olive-walls-wave.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/olive-walls-wave.md b/.changeset/olive-walls-wave.md index bc6264bbcb..f7dc5434a6 100644 --- a/.changeset/olive-walls-wave.md +++ b/.changeset/olive-walls-wave.md @@ -2,4 +2,4 @@ '@backstage/plugin-home': minor --- -**BREAKING** Implement usage of unused `limit` query param in visits API `.list()` function +**BREAKING** Implement usage of unused `limit` query parameter in visits API `.list()` function From 2f90932e0c94c6acc137e4fa9628d7893f11b9b6 Mon Sep 17 00:00:00 2001 From: bnechyporenko Date: Sun, 22 Sep 2024 20:25:43 +0200 Subject: [PATCH 012/217] Included step name and step id into check point key. Signed-off-by: bnechyporenko --- .changeset/cyan-vans-study.md | 5 +++++ .../src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts | 4 ++-- .../src/scaffolder/tasks/NunjucksWorkflowRunner.ts | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 .changeset/cyan-vans-study.md diff --git a/.changeset/cyan-vans-study.md b/.changeset/cyan-vans-study.md new file mode 100644 index 0000000000..a69b95fd85 --- /dev/null +++ b/.changeset/cyan-vans-study.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': patch +--- + +Include step name and step id to checkpoint key diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts index aece424f5f..8bce6fba17 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts @@ -601,11 +601,11 @@ describe('NunjucksWorkflowRunner', () => { return Promise.resolve({ state: { checkpoints: { - ['v1.task.checkpoint.key1']: { + ['v1.task.checkpoint.name.test.key1']: { status: 'success', value: 'initial', }, - ['v1.task.checkpoint.key2']: { + ['v1.task.checkpoint.name.test2.key2']: { status: 'failed', reason: 'fatal error', }, diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index 09fc162ea6..cfdd34365d 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -375,7 +375,7 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { keySuffix: string, fn: () => Promise, ) { - const key = `v1.task.checkpoint.${keySuffix}`; + const key = `v1.task.checkpoint.${step.name}.${step.id}.${keySuffix}`; try { let prevValue: U | undefined; if (prevTaskState) { From 9a46cbc9602fd3f62493a9d90ee45b52b598e94c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20Br=C3=A4uer?= Date: Mon, 23 Sep 2024 11:00:43 +0200 Subject: [PATCH 013/217] docs: Adopter spotlight blog post MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Johannes Bräuer --- ...2024-09-24-dynatrace-adopter-spotlight.mdx | 91 ++++++++++++++++++ ...kstage_catalog_security_vulnerabilites.png | Bin 0 -> 225603 bytes .../backstage_dynatrace_plugin_K8s.png | Bin 0 -> 118314 bytes .../2024-09-24/backstage_srg_validations.png | Bin 0 -> 174123 bytes 4 files changed, 91 insertions(+) create mode 100644 microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx create mode 100644 microsite/blog/assets/2024-09-24/backstage_catalog_security_vulnerabilites.png create mode 100644 microsite/blog/assets/2024-09-24/backstage_dynatrace_plugin_K8s.png create mode 100644 microsite/blog/assets/2024-09-24/backstage_srg_validations.png diff --git a/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx b/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx new file mode 100644 index 0000000000..593f31a475 --- /dev/null +++ b/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx @@ -0,0 +1,91 @@ +--- +# prettier-ignore +title: "Adopter Spotlight: Level-up developer experience with observability and security in context" +author: Johannes Bräuer, Dynatrace +authorURL: https://github.com/johannes-b +authorImageURL: https://avatars.githubusercontent.com/u/729071?v=4 +--- + +**TL;DR** +![Backstage Engineer Journey](assets/2024-09-24/backstage-engineer-journey.svg) + +{/* truncate */} + +## Why and how Dynatrace rolled out Backstage + +A few years ago, Dynatrace developers worked with large monolithic repositories to develop functionality for our platform’s agent and server sides. The server component was particularly large, consisting of 260 Gradle projects in a single repository. This setup centralized development processes for the developers, making it easier for them to push the code while versioning, delivery, and hotfixes were handled automatically. However, maintaining the speed and manageability of these processes required a lot of effort. + +Dynatrace decided to move towards the current Dynatrace platform model as the next evolutionary step of our product. This decision led to an architectural change of splitting the monolithic repository into multiple projects. The platform is designed to enable the development of apps on top of platform capabilities to unlock faster innovations and decouple them from the release cycles of other components. Based on this decision, it became apparent that the number of platform components and individual apps would increase significantly, eliminating the option of a single repository to unify all processes. Besides, the risk of increasing cognitive load in software development was high due to development being spread across multiple touchpoints, a challenge discussed in research for years. Consequently, the need to standardize project creation became crucial to ensure corporate governance and compliance even before the first commit was pushed. [^1, ^2] + +[^1]: John Sweller, Cognitive load during problem solving: Effects on learning, Cognitive Science, Volume 12, Issue 2, 1988, Pages 257-285, ISSN 0364-0213, https://doi.org/10.1016/0364-0213(88)90023-7. + +[^2]: Robert C. Martin Series, Clean Code: A Handbook of Agile Software Craftsmanship (Robert C. Martin Series), 2008, ISBN 9780132350884 + +Therefore, the Dynatrace Platform Engineering team initiated a project to standardize and simplify the process for starting service or application development. This effort was initially named “project initializer” and launched around the same time Backstage joined the CNCF. Although the platform engineering team saw initial success with the project initializer, we quickly realized that there was a greater demand for centralizing development activities and providing appropriate guidelines. For example, we noted that the complexity of integrating new code had shifted from the build phase to the deployment phase, transferring relatively complex integration tasks from continuous integration to continuous deployment. Overall, the main requirements and focal points were: + +- **Ownership**: Who is responsible for which service or app? Who owns infrastructure resources? +- **Documentation**: Where is the documentation of a service or app? +- **CI/CD view**: How does the build pipeline in GitHub/Jenkins progress, and what about the ArgoCD deployment? +- **Dependency management**: Do we know which APIs are used? +- **Observability and security**: Where is a service deployed, and is it healthy and secure? + +For more details on Dynatrace's adoption of Backstage, please watch the recording, [How We Made Backstage Improve Developer Efficiency of 1000+ Engineers](https://www.youtube.com/watch?v=0or5K_3HieA), BackstageCon, November 6, 2023 in Chicago. Illinois. + +## Quick wins with ownership democratization and self-service templates + +The discussion on whether to make, buy, or adopt led us to heavily favor Backstage as the chosen solution for our internal developer platform (IDP). We have successfully integrated Backstage within Dynatrace, marking our early wins. This was accomplished by linking it to our internal team management solution. Feeding this data into Backstage resolved the previously lacking transparency concerning the responsibilities and ownership of services and infrastructure. Furthermore, we have contextualized Stack Overflow and CI/CD solutions with entities monitored by Backstage to fulfill developers' requests for a unified view. + +Next to establishing a solid software catalog view, providing self-service templates for project and infrastructure creation—initially a focus of the original developer experience—has also been incorporated into Backstage. This enhancement allows the use of a comprehensive set of templates for bootstrapping platform services or applications across different tool stacks. Ultimately, developers can effortlessly use a template to create a ready-to-use repository with observability and security pre-configured. + +## Static model enrichment with real-time observability and security + +After addressing ownership, documentation, and a centralized CI/CD view, our developers highlighted the necessity of accessing real-time data about their services and applications within the Backstage service catalog. This need arose from the understanding that integrating a code change can be optimally evaluated on a deployed version of their service alongside related components. Specifically, the developers were interested in seeing at a high level: + +- Where specific versions of services are deployed, +- How their services perform in the hardening phase and production environments, +- Which inbound and outbound dependencies their service has, +- Whether any problems, security vulnerabilities, or SLO breaches are related to their service, and +- Which recent error logs have been collected. + +The open source community already developed a Backstage plugin capable of fetching Dynatrace problems and synthetics into Backstage. However, we chose to develop a new plugin that works with the new Dynatrace platform API. Additionally, it was necessary to support Kubernetes use cases by default to offer, for example, deployment overviews out-of-the-box. Based on the feedback from developers, we identified four essential requirements. + +### Coverage of the software development lifecycle + +Observing the software development lifecycle necessitates consolidating all development and delivery phases. In Dynatrace, monitoring the development stage is distinct from rolling out new versions to the hardening and production stages. Nonetheless, developers desire an end-to-end view from development to production. To support this, the plugin allows connections to multiple Dynatrace environments to retrieve data for the various rollout phases. + +### Kubernetes observability + +When using the Backstage Kubernetes plugin, an annotation is required to surface your Kubernetes components as part of an entity (for more information, please refer to [Backstage documentation](https://backstage.io/docs/features/kubernetes/configuration/#surfacing-your-kubernetes-components-as-part-of-an-entity)). The Dynatrace plugin utilizes this convention to automatically populate monitoring data from Kubernetes deployments into the deployment overview in Backstage. Therefore, additional configuration is unnecessary to enrich Backstage entities with real-time observability data from Kubernetes, as shown below. Additionally, deep links open Dynatrace analysis views for more contextual details. + +![Kubernetes deployment overview](assets/2024-09-24/backstage_dynatrace_plugin_K8s.svg) + +### Reliability and security in context + +While Kubernetes observability was requested to be provided out of the box, we quickly realized that developers prefer to define the insights they want to see by themselves. To remain flexible and to reduce the customization effort required from the platform engineering teams, the plugin allows for the definition of custom queries within the `config.yaml` file. The Backstage `config.yaml` file requires special attention since platform teams use this file to standardize entity specifications, while developers use it to customize their Backstage views. After releasing this new functionality, we observed developers moving in two distinct directions: + +- Querying quality gate validation results of a new version they’re developing + +![Release validation overview](assets/2024-09-24/backstage_srg_validations.svg) + +- Fetching runtime security vulnerability information across different stages + +![Security vulnerabilities in context](assets/2024-09-24/backstage_catalog_security_vulnerabilites.svg) + +### Error logs at hand + +Developers love logs. Direct access to logs, especially error logs, was a crucial requirement for the plugin. Our developers want to see the current number of error logs accompanied by a direct link to the raw log line, which provides significant value in problem triaging and fixing. With the plugin, we offer a high-level overview of log statistics, with the rich analysis capabilities of Dynatrace available at a single click. + +## Conclusion + +To enhance the developer experience, Dynatrace adopted Backstage as its central developer portal and enhances Backstage entities with real-time data. This decision, along with the symbiosis between the Dynatrace platform and Backstage, has unlocked two significant opportunities. + +First, centralizing all development-related artifacts and democratizing ownership have reduced onboarding time for our teams. Although it might seem that onboarding time is only relevant for new developers, it is also important when developers move to a different team, pick up a service or application they haven’t worked on for a while, or replace their laptops. Moreover, a low onboarding time is crucial when quickly kicking off work on a new service or solution app. This became a necessity with the new Dynatrace platform. + +Second, we enhanced the developer experience by integrating observability and security data into Backstage, offering seamless entry points to Dynatrace for in-depth analysis. This improvement was crucial as we noted a shift in integration tasks from build to development time, necessitating insights into a later phase of the software lifecycle for our developers. In essence, end-to-end validation of code changes could no longer be accomplished with build pipelines—either in Jenkins or GitHub—but required deployment in production-like environments that facilitate real-world interaction with other components. Consequently, real-time observability data from these environments must be relayed to the developer. + +## What`s next? + +Backstage is a crucial element for Dynatrace's developer experience, providing out-of-the-box core functionality for every developer and supporting extensibility where needed. Our Backstage extension is maintained as an open-source project and is available for every Backstage user. Don't hesitate to utilize it or to contribute: https://github.com/Dynatrace/backstage-plugin + +If you have a great Backstage story to tell, please share your experience with us to the variety of use case areas. + diff --git a/microsite/blog/assets/2024-09-24/backstage_catalog_security_vulnerabilites.png b/microsite/blog/assets/2024-09-24/backstage_catalog_security_vulnerabilites.png new file mode 100644 index 0000000000000000000000000000000000000000..19d74cf47279f51bb88c585add4d01f528a8a6fd GIT binary patch literal 225603 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 z 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 literal 0 HcmV?d00001 diff --git a/microsite/blog/assets/2024-09-24/backstage_dynatrace_plugin_K8s.png b/microsite/blog/assets/2024-09-24/backstage_dynatrace_plugin_K8s.png new file mode 100644 index 0000000000000000000000000000000000000000..e7fc34a2358bcc386d426e8cb7df792d9681eb98 GIT binary patch literal 118314 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 literal 0 HcmV?d00001 diff --git a/microsite/blog/assets/2024-09-24/backstage_srg_validations.png b/microsite/blog/assets/2024-09-24/backstage_srg_validations.png new file mode 100644 index 0000000000000000000000000000000000000000..49d23710920e097b82feb7c5c00d0fd2aa2c78f3 GIT binary patch literal 174123 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
    QDI8yE~2d4}R& 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ⅅ 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 EKgwT@;{X5v literal 0 HcmV?d00001 From b1e5501b900844dc64f083c63e5813f5c1bb83af Mon Sep 17 00:00:00 2001 From: Matthew Bednarski Date: Mon, 23 Sep 2024 12:30:13 +0200 Subject: [PATCH 014/217] Update bitbucketServerPullRequest.ts - refactor parseProtocol to isApiBaseUrlHttps refactor parseProtocol to isApiBaseUrlHttps; ie. instead of taking the protocol scheme from the URL object, use boolean based on the apiBaseUrl to get whether to use "http" or "https". The default will still be "https". Signed-off-by: Matthew Bednarski --- .../src/actions/bitbucketServerPullRequest.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts b/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts index ed7c0411b5..51d097410b 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts +++ b/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts @@ -237,9 +237,9 @@ const getDefaultBranch = async (opts: { } return defaultBranch; }; -const parseProtocol = (apiBaseUrl: string) => { +const isApiBaseUrlHttps = (apiBaseUrl: string) : boolean => { const url = new URL(apiBaseUrl); - return url.protocol || 'https'; + return url.protocol === 'https:'; }; /** * Creates a BitbucketServer Pull Request action. @@ -405,8 +405,8 @@ export function createPublishBitbucketServerPullRequestAction(options: { startPoint: latestCommit, }); - const protocol = parseProtocol(apiBaseUrl); - const remoteUrl = `${protocol}://${host}/scm/${project}/${repo}.git`; + const isHttps: boolean = isApiBaseUrlHttps(apiBaseUrl); + const remoteUrl = `${isHttps ? 'https' : 'http' }://${host}/scm/${project}/${repo}.git`; const auth = authConfig.token ? { From 37402200d852a12fe33484d1e1b9751d7bc2a95e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20Br=C3=A4uer?= Date: Mon, 23 Sep 2024 12:39:02 +0200 Subject: [PATCH 015/217] Minor fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Johannes Bräuer --- microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx b/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx index 593f31a475..d096c4c5dd 100644 --- a/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx +++ b/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx @@ -7,7 +7,7 @@ authorImageURL: https://avatars.githubusercontent.com/u/729071?v=4 --- **TL;DR** -![Backstage Engineer Journey](assets/2024-09-24/backstage-engineer-journey.svg) +![IMAGE-NEEDED](assets/2024-09-24/image-needed.svg) {/* truncate */} @@ -19,7 +19,7 @@ Dynatrace decided to move towards the current Dynatrace platform model as the ne [^1]: John Sweller, Cognitive load during problem solving: Effects on learning, Cognitive Science, Volume 12, Issue 2, 1988, Pages 257-285, ISSN 0364-0213, https://doi.org/10.1016/0364-0213(88)90023-7. -[^2]: Robert C. Martin Series, Clean Code: A Handbook of Agile Software Craftsmanship (Robert C. Martin Series), 2008, ISBN 9780132350884 +[^2]: Robert C. Martin Series, Clean Code: A Handbook of Agile Software Craftsmanship (Robert C. Martin Series), 2008, ISBN 9780132350884. Therefore, the Dynatrace Platform Engineering team initiated a project to standardize and simplify the process for starting service or application development. This effort was initially named “project initializer” and launched around the same time Backstage joined the CNCF. Although the platform engineering team saw initial success with the project initializer, we quickly realized that there was a greater demand for centralizing development activities and providing appropriate guidelines. For example, we noted that the complexity of integrating new code had shifted from the build phase to the deployment phase, transferring relatively complex integration tasks from continuous integration to continuous deployment. Overall, the main requirements and focal points were: @@ -87,5 +87,4 @@ Second, we enhanced the developer experience by integrating observability and se Backstage is a crucial element for Dynatrace's developer experience, providing out-of-the-box core functionality for every developer and supporting extensibility where needed. Our Backstage extension is maintained as an open-source project and is available for every Backstage user. Don't hesitate to utilize it or to contribute: https://github.com/Dynatrace/backstage-plugin -If you have a great Backstage story to tell, please share your experience with us to the variety of use case areas. - +If you have a great Backstage story to tell, please share your experience with us to the variety of use case areas. \ No newline at end of file From e791df0539d0dd396249929beb16835677580014 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20Br=C3=A4uer?= Date: Mon, 23 Sep 2024 12:46:53 +0200 Subject: [PATCH 016/217] Provide introduction MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Johannes Bräuer --- microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx b/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx index d096c4c5dd..c401722d01 100644 --- a/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx +++ b/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx @@ -9,6 +9,11 @@ authorImageURL: https://avatars.githubusercontent.com/u/729071?v=4 **TL;DR** ![IMAGE-NEEDED](assets/2024-09-24/image-needed.svg) +To enhance the developer experience, Dynatrace adopted Backstage as its central developer portal and enhances Backstage entities with real-time data. This decision, along with the symbiosis between the Dynatrace platform and Backstage, has unlocked two significant opportunities. + +* First, centralizing all development-related artifacts and democratizing ownership have reduced onboarding time for our teams. +* Second, we enhanced the developer experience by integrating observability and security data into Backstage, offering seamless entry points to Dynatrace for in-depth analysis. + {/* truncate */} ## Why and how Dynatrace rolled out Backstage From 9e3c0891cab82d66c982ac7f30d0a8c739a75c06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20Br=C3=A4uer?= Date: Mon, 23 Sep 2024 12:53:00 +0200 Subject: [PATCH 017/217] Image changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Johannes Bräuer --- .../backstage_dynatrace_plugin_K8s.png | Bin 118314 -> 116403 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/microsite/blog/assets/2024-09-24/backstage_dynatrace_plugin_K8s.png b/microsite/blog/assets/2024-09-24/backstage_dynatrace_plugin_K8s.png index e7fc34a2358bcc386d426e8cb7df792d9681eb98..11681e064e3d24af3dd0a6d4b600baaf03a46b90 100644 GIT binary patch delta 65438 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%0Adf;DeX*t7E7#Vc? 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 z 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 Date: Mon, 23 Sep 2024 13:29:47 +0200 Subject: [PATCH 018/217] Run yarn prettier MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Johannes Bräuer --- ...2024-09-24-dynatrace-adopter-spotlight.mdx | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx b/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx index c401722d01..ec8bdf89ae 100644 --- a/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx +++ b/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx @@ -1,44 +1,42 @@ --- -# prettier-ignore -title: "Adopter Spotlight: Level-up developer experience with observability and security in context" +title: 'Adopter Spotlight: Level-up developer experience with observability and security in context' author: Johannes Bräuer, Dynatrace authorURL: https://github.com/johannes-b authorImageURL: https://avatars.githubusercontent.com/u/729071?v=4 --- -**TL;DR** +**TL;DR** ![IMAGE-NEEDED](assets/2024-09-24/image-needed.svg) To enhance the developer experience, Dynatrace adopted Backstage as its central developer portal and enhances Backstage entities with real-time data. This decision, along with the symbiosis between the Dynatrace platform and Backstage, has unlocked two significant opportunities. -* First, centralizing all development-related artifacts and democratizing ownership have reduced onboarding time for our teams. -* Second, we enhanced the developer experience by integrating observability and security data into Backstage, offering seamless entry points to Dynatrace for in-depth analysis. +- First, centralizing all development-related artifacts and democratizing ownership have reduced onboarding time for our teams. +- Second, we enhanced the developer experience by integrating observability and security data into Backstage, offering seamless entry points to Dynatrace for in-depth analysis. {/* truncate */} ## Why and how Dynatrace rolled out Backstage -A few years ago, Dynatrace developers worked with large monolithic repositories to develop functionality for our platform’s agent and server sides. The server component was particularly large, consisting of 260 Gradle projects in a single repository. This setup centralized development processes for the developers, making it easier for them to push the code while versioning, delivery, and hotfixes were handled automatically. However, maintaining the speed and manageability of these processes required a lot of effort. +A few years ago, Dynatrace developers worked with large monolithic repositories to develop functionality for our platform’s agent and server sides. The server component was particularly large, consisting of 260 Gradle projects in a single repository. This setup centralized development processes for the developers, making it easier for them to push the code while versioning, delivery, and hotfixes were handled automatically. However, maintaining the speed and manageability of these processes required a lot of effort. Dynatrace decided to move towards the current Dynatrace platform model as the next evolutionary step of our product. This decision led to an architectural change of splitting the monolithic repository into multiple projects. The platform is designed to enable the development of apps on top of platform capabilities to unlock faster innovations and decouple them from the release cycles of other components. Based on this decision, it became apparent that the number of platform components and individual apps would increase significantly, eliminating the option of a single repository to unify all processes. Besides, the risk of increasing cognitive load in software development was high due to development being spread across multiple touchpoints, a challenge discussed in research for years. Consequently, the need to standardize project creation became crucial to ensure corporate governance and compliance even before the first commit was pushed. [^1, ^2] [^1]: John Sweller, Cognitive load during problem solving: Effects on learning, Cognitive Science, Volume 12, Issue 2, 1988, Pages 257-285, ISSN 0364-0213, https://doi.org/10.1016/0364-0213(88)90023-7. - -[^2]: Robert C. Martin Series, Clean Code: A Handbook of Agile Software Craftsmanship (Robert C. Martin Series), 2008, ISBN 9780132350884. +[^2]: Robert C. Martin Series, Clean Code: A Handbook of Agile Software Craftsmanship (Robert C. Martin Series), 2008, ISBN 9780132350884. Therefore, the Dynatrace Platform Engineering team initiated a project to standardize and simplify the process for starting service or application development. This effort was initially named “project initializer” and launched around the same time Backstage joined the CNCF. Although the platform engineering team saw initial success with the project initializer, we quickly realized that there was a greater demand for centralizing development activities and providing appropriate guidelines. For example, we noted that the complexity of integrating new code had shifted from the build phase to the deployment phase, transferring relatively complex integration tasks from continuous integration to continuous deployment. Overall, the main requirements and focal points were: - **Ownership**: Who is responsible for which service or app? Who owns infrastructure resources? - **Documentation**: Where is the documentation of a service or app? - **CI/CD view**: How does the build pipeline in GitHub/Jenkins progress, and what about the ArgoCD deployment? -- **Dependency management**: Do we know which APIs are used? +- **Dependency management**: Do we know which APIs are used? - **Observability and security**: Where is a service deployed, and is it healthy and secure? -For more details on Dynatrace's adoption of Backstage, please watch the recording, [How We Made Backstage Improve Developer Efficiency of 1000+ Engineers](https://www.youtube.com/watch?v=0or5K_3HieA), BackstageCon, November 6, 2023 in Chicago. Illinois. +For more details on Dynatrace's adoption of Backstage, please watch the recording, [How We Made Backstage Improve Developer Efficiency of 1000+ Engineers](https://www.youtube.com/watch?v=0or5K_3HieA), BackstageCon, November 6, 2023 in Chicago. Illinois. ## Quick wins with ownership democratization and self-service templates -The discussion on whether to make, buy, or adopt led us to heavily favor Backstage as the chosen solution for our internal developer platform (IDP). We have successfully integrated Backstage within Dynatrace, marking our early wins. This was accomplished by linking it to our internal team management solution. Feeding this data into Backstage resolved the previously lacking transparency concerning the responsibilities and ownership of services and infrastructure. Furthermore, we have contextualized Stack Overflow and CI/CD solutions with entities monitored by Backstage to fulfill developers' requests for a unified view. +The discussion on whether to make, buy, or adopt led us to heavily favor Backstage as the chosen solution for our internal developer platform (IDP). We have successfully integrated Backstage within Dynatrace, marking our early wins. This was accomplished by linking it to our internal team management solution. Feeding this data into Backstage resolved the previously lacking transparency concerning the responsibilities and ownership of services and infrastructure. Furthermore, we have contextualized Stack Overflow and CI/CD solutions with entities monitored by Backstage to fulfill developers' requests for a unified view. Next to establishing a solid software catalog view, providing self-service templates for project and infrastructure creation—initially a focus of the original developer experience—has also been incorporated into Backstage. This enhancement allows the use of a comprehensive set of templates for bootstrapping platform services or applications across different tool stacks. Ultimately, developers can effortlessly use a template to create a ready-to-use repository with observability and security pre-configured. @@ -88,8 +86,8 @@ First, centralizing all development-related artifacts and democratizing ownershi Second, we enhanced the developer experience by integrating observability and security data into Backstage, offering seamless entry points to Dynatrace for in-depth analysis. This improvement was crucial as we noted a shift in integration tasks from build to development time, necessitating insights into a later phase of the software lifecycle for our developers. In essence, end-to-end validation of code changes could no longer be accomplished with build pipelines—either in Jenkins or GitHub—but required deployment in production-like environments that facilitate real-world interaction with other components. Consequently, real-time observability data from these environments must be relayed to the developer. -## What`s next? +## What`s next? -Backstage is a crucial element for Dynatrace's developer experience, providing out-of-the-box core functionality for every developer and supporting extensibility where needed. Our Backstage extension is maintained as an open-source project and is available for every Backstage user. Don't hesitate to utilize it or to contribute: https://github.com/Dynatrace/backstage-plugin +Backstage is a crucial element for Dynatrace's developer experience, providing out-of-the-box core functionality for every developer and supporting extensibility where needed. Our Backstage extension is maintained as an open-source project and is available for every Backstage user. Don't hesitate to utilize it or to contribute: https://github.com/Dynatrace/backstage-plugin -If you have a great Backstage story to tell, please share your experience with us to the variety of use case areas. \ No newline at end of file +If you have a great Backstage story to tell, please share your experience with us to the variety of use case areas. From da40acdaab19b535d02f29ed47ef16f28d6deb80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20Br=C3=A4uer?= Date: Mon, 23 Sep 2024 15:02:50 +0200 Subject: [PATCH 019/217] Removed image ref MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Johannes Bräuer --- microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx | 2 -- 1 file changed, 2 deletions(-) diff --git a/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx b/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx index ec8bdf89ae..cfd511232e 100644 --- a/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx +++ b/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx @@ -6,8 +6,6 @@ authorImageURL: https://avatars.githubusercontent.com/u/729071?v=4 --- **TL;DR** -![IMAGE-NEEDED](assets/2024-09-24/image-needed.svg) - To enhance the developer experience, Dynatrace adopted Backstage as its central developer portal and enhances Backstage entities with real-time data. This decision, along with the symbiosis between the Dynatrace platform and Backstage, has unlocked two significant opportunities. - First, centralizing all development-related artifacts and democratizing ownership have reduced onboarding time for our teams. From 691c89e8e1ef15f76a3873d8063327ea3c2f7d0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20Br=C3=A4uer?= Date: Tue, 24 Sep 2024 09:05:11 +0200 Subject: [PATCH 020/217] Changed file extension MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Johannes Bräuer --- microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx b/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx index cfd511232e..24f751f07c 100644 --- a/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx +++ b/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx @@ -58,7 +58,7 @@ Observing the software development lifecycle necessitates consolidating all deve When using the Backstage Kubernetes plugin, an annotation is required to surface your Kubernetes components as part of an entity (for more information, please refer to [Backstage documentation](https://backstage.io/docs/features/kubernetes/configuration/#surfacing-your-kubernetes-components-as-part-of-an-entity)). The Dynatrace plugin utilizes this convention to automatically populate monitoring data from Kubernetes deployments into the deployment overview in Backstage. Therefore, additional configuration is unnecessary to enrich Backstage entities with real-time observability data from Kubernetes, as shown below. Additionally, deep links open Dynatrace analysis views for more contextual details. -![Kubernetes deployment overview](assets/2024-09-24/backstage_dynatrace_plugin_K8s.svg) +![Kubernetes deployment overview](assets/2024-09-24/backstage_dynatrace_plugin_K8s.png) ### Reliability and security in context @@ -66,11 +66,11 @@ While Kubernetes observability was requested to be provided out of the box, we q - Querying quality gate validation results of a new version they’re developing -![Release validation overview](assets/2024-09-24/backstage_srg_validations.svg) +![Release validation overview](assets/2024-09-24/backstage_srg_validations.png) - Fetching runtime security vulnerability information across different stages -![Security vulnerabilities in context](assets/2024-09-24/backstage_catalog_security_vulnerabilites.svg) +![Security vulnerabilities in context](assets/2024-09-24/backstage_catalog_security_vulnerabilites.png) ### Error logs at hand From 2f1a0e944c4782632ab771d815173f188f6f6d5e Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 24 Sep 2024 10:58:43 +0200 Subject: [PATCH 021/217] chore: fix prettier\ Signed-off-by: blam --- .../src/actions/bitbucketServerPullRequest.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts b/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts index 51d097410b..fe79935a1d 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts +++ b/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts @@ -237,7 +237,7 @@ const getDefaultBranch = async (opts: { } return defaultBranch; }; -const isApiBaseUrlHttps = (apiBaseUrl: string) : boolean => { +const isApiBaseUrlHttps = (apiBaseUrl: string): boolean => { const url = new URL(apiBaseUrl); return url.protocol === 'https:'; }; @@ -406,7 +406,9 @@ export function createPublishBitbucketServerPullRequestAction(options: { }); const isHttps: boolean = isApiBaseUrlHttps(apiBaseUrl); - const remoteUrl = `${isHttps ? 'https' : 'http' }://${host}/scm/${project}/${repo}.git`; + const remoteUrl = `${ + isHttps ? 'https' : 'http' + }://${host}/scm/${project}/${repo}.git`; const auth = authConfig.token ? { From 1aecd6a0ca32021e5b29e0aab0957e1b7c970b1d Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 24 Sep 2024 10:59:28 +0200 Subject: [PATCH 022/217] chore: Fixing changeset Signed-off-by: blam --- .changeset/two-plums-fail.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/two-plums-fail.md b/.changeset/two-plums-fail.md index ed1b4af4ab..9d976ab4b5 100644 --- a/.changeset/two-plums-fail.md +++ b/.changeset/two-plums-fail.md @@ -1,5 +1,5 @@ --- -'@backstage/plugin-scaffolder-backend-module-bitbucket-server': minor +'@backstage/plugin-scaffolder-backend-module-bitbucket-server': patch --- Use protocol from Bitbucket Server apiBaseUrl config parameter instead of hard-coded https From 785d68f75aa1bdce2d3232801886c2477606d491 Mon Sep 17 00:00:00 2001 From: Heikki Hellgren Date: Fri, 30 Aug 2024 14:03:24 +0300 Subject: [PATCH 023/217] feat: allow scaffolder tasks pagination in the frontend Requires #26378, relates to #25856 Signed-off-by: Heikki Hellgren --- .changeset/green-bottles-live.md | 6 ++++ plugins/scaffolder-react/report.api.md | 15 ++++++---- plugins/scaffolder-react/src/api/types.ts | 4 ++- plugins/scaffolder/report.api.md | 27 ++++++++++-------- plugins/scaffolder/src/api.test.ts | 28 +++++++++++++++++++ plugins/scaffolder/src/api.ts | 24 +++++++++------- .../ListTasksPage/ListTaskPage.test.tsx | 11 ++++++-- .../ListTasksPage/ListTasksPage.tsx | 22 ++++++++++++--- 8 files changed, 104 insertions(+), 33 deletions(-) create mode 100644 .changeset/green-bottles-live.md diff --git a/.changeset/green-bottles-live.md b/.changeset/green-bottles-live.md new file mode 100644 index 0000000000..6bed257eee --- /dev/null +++ b/.changeset/green-bottles-live.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-scaffolder-react': patch +'@backstage/plugin-scaffolder': patch +--- + +Add support for pagination in scaffolder tasks list diff --git a/plugins/scaffolder-react/report.api.md b/plugins/scaffolder-react/report.api.md index d7cf450bf5..73573b25c4 100644 --- a/plugins/scaffolder-react/report.api.md +++ b/plugins/scaffolder-react/report.api.md @@ -232,8 +232,13 @@ export interface ScaffolderApi { ): Promise; listActions(): Promise; // (undocumented) - listTasks?(options: { filterByOwnership: 'owned' | 'all' }): Promise<{ + listTasks?(options: { + filterByOwnership: 'owned' | 'all'; + limit?: number; + offset?: number; + }): Promise<{ tasks: ScaffolderTask[]; + totalTasks?: number; }>; retry?(taskId: string): Promise; scaffold( @@ -581,10 +586,10 @@ export const useTemplateSecrets: () => ScaffolderUseTemplateSecrets; // src/api/types.d.ts:164:5 - (ae-undocumented) Missing documentation for "getTemplateParameterSchema". // src/api/types.d.ts:172:5 - (ae-undocumented) Missing documentation for "getTask". // src/api/types.d.ts:185:5 - (ae-undocumented) Missing documentation for "listTasks". -// src/api/types.d.ts:190:5 - (ae-undocumented) Missing documentation for "getIntegrationsList". -// src/api/types.d.ts:195:5 - (ae-undocumented) Missing documentation for "streamLogs". -// src/api/types.d.ts:196:5 - (ae-undocumented) Missing documentation for "dryRun". -// src/api/types.d.ts:197:5 - (ae-undocumented) Missing documentation for "autocomplete". +// src/api/types.d.ts:193:5 - (ae-undocumented) Missing documentation for "getIntegrationsList". +// src/api/types.d.ts:198:5 - (ae-undocumented) Missing documentation for "streamLogs". +// src/api/types.d.ts:199:5 - (ae-undocumented) Missing documentation for "dryRun". +// src/api/types.d.ts:200:5 - (ae-undocumented) Missing documentation for "autocomplete". // src/components/types.d.ts:7:1 - (ae-undocumented) Missing documentation for "TemplateGroupFilter". // src/extensions/types.d.ts:13:5 - (ae-undocumented) Missing documentation for "uiSchema". // src/extensions/types.d.ts:30:5 - (ae-undocumented) Missing documentation for ""ui:options"". diff --git a/plugins/scaffolder-react/src/api/types.ts b/plugins/scaffolder-react/src/api/types.ts index 3816c4bcbf..bc37eed47e 100644 --- a/plugins/scaffolder-react/src/api/types.ts +++ b/plugins/scaffolder-react/src/api/types.ts @@ -223,7 +223,9 @@ export interface ScaffolderApi { listTasks?(options: { filterByOwnership: 'owned' | 'all'; - }): Promise<{ tasks: ScaffolderTask[] }>; + limit?: number; + offset?: number; + }): Promise<{ tasks: ScaffolderTask[]; totalTasks?: number }>; getIntegrationsList( options: ScaffolderGetIntegrationsListOptions, diff --git a/plugins/scaffolder/report.api.md b/plugins/scaffolder/report.api.md index b93a59a82c..35b3dad66e 100644 --- a/plugins/scaffolder/report.api.md +++ b/plugins/scaffolder/report.api.md @@ -552,8 +552,13 @@ export class ScaffolderClient implements ScaffolderApi_2 { // (undocumented) listActions(): Promise; // (undocumented) - listTasks(options: { filterByOwnership: 'owned' | 'all' }): Promise<{ + listTasks(options: { + filterByOwnership: 'owned' | 'all'; + limit?: number; + offset?: number; + }): Promise<{ tasks: ScaffolderTask_2[]; + totalTasks?: number; }>; // (undocumented) retry?(taskId: string): Promise; @@ -670,16 +675,16 @@ export const useTemplateSecrets: () => ScaffolderUseTemplateSecrets_2; // Warnings were encountered during analysis: // // src/api.d.ts:23:5 - (ae-undocumented) Missing documentation for "listTasks". -// src/api.d.ts:28:5 - (ae-undocumented) Missing documentation for "getIntegrationsList". -// src/api.d.ts:29:5 - (ae-undocumented) Missing documentation for "getTemplateParameterSchema". -// src/api.d.ts:30:5 - (ae-undocumented) Missing documentation for "scaffold". -// src/api.d.ts:31:5 - (ae-undocumented) Missing documentation for "getTask". -// src/api.d.ts:32:5 - (ae-undocumented) Missing documentation for "streamLogs". -// src/api.d.ts:33:5 - (ae-undocumented) Missing documentation for "dryRun". -// src/api.d.ts:36:5 - (ae-undocumented) Missing documentation for "listActions". -// src/api.d.ts:37:5 - (ae-undocumented) Missing documentation for "cancelTask". -// src/api.d.ts:38:5 - (ae-undocumented) Missing documentation for "retry". -// src/api.d.ts:39:5 - (ae-undocumented) Missing documentation for "autocomplete". +// src/api.d.ts:31:5 - (ae-undocumented) Missing documentation for "getIntegrationsList". +// src/api.d.ts:32:5 - (ae-undocumented) Missing documentation for "getTemplateParameterSchema". +// src/api.d.ts:33:5 - (ae-undocumented) Missing documentation for "scaffold". +// src/api.d.ts:34:5 - (ae-undocumented) Missing documentation for "getTask". +// src/api.d.ts:35:5 - (ae-undocumented) Missing documentation for "streamLogs". +// src/api.d.ts:36:5 - (ae-undocumented) Missing documentation for "dryRun". +// src/api.d.ts:39:5 - (ae-undocumented) Missing documentation for "listActions". +// src/api.d.ts:40:5 - (ae-undocumented) Missing documentation for "cancelTask". +// src/api.d.ts:41:5 - (ae-undocumented) Missing documentation for "retry". +// src/api.d.ts:42:5 - (ae-undocumented) Missing documentation for "autocomplete". // src/components/OngoingTask/OngoingTask.d.ts:6:22 - (ae-undocumented) Missing documentation for "OngoingTask". // src/components/fields/EntityPicker/schema.d.ts:15:22 - (ae-undocumented) Missing documentation for "EntityPickerFieldSchema". // src/components/fields/EntityTagsPicker/schema.d.ts:4:22 - (ae-undocumented) Missing documentation for "EntityTagsPickerFieldSchema". diff --git a/plugins/scaffolder/src/api.test.ts b/plugins/scaffolder/src/api.test.ts index 805828a9fe..1df2dacb17 100644 --- a/plugins/scaffolder/src/api.test.ts +++ b/plugins/scaffolder/src/api.test.ts @@ -356,6 +356,34 @@ describe('api', () => { const result = await apiClient.listTasks({ filterByOwnership: 'all' }); expect(result).toHaveLength(2); }); + + it('should list tasks with limit and offset', async () => { + server.use( + rest.get( + `${mockBaseUrl}/v2/tasks?limit=5&offset=0`, + (_req, res, ctx) => { + return res( + ctx.json([ + { + createdBy: null, + }, + { + createdBy: null, + }, + ]), + ); + }, + ), + ); + + const result = await apiClient.listTasks({ + filterByOwnership: 'all', + limit: 5, + offset: 0, + }); + expect(result).toHaveLength(2); + }); + it('should list task using the current user as owner', async () => { server.use( rest.get(`${mockBaseUrl}/v2/tasks`, (req, res, ctx) => { diff --git a/plugins/scaffolder/src/api.ts b/plugins/scaffolder/src/api.ts index 93db7386f3..df032b536d 100644 --- a/plugins/scaffolder/src/api.ts +++ b/plugins/scaffolder/src/api.ts @@ -24,23 +24,22 @@ import { ResponseError } from '@backstage/errors'; import { ScmIntegrationRegistry } from '@backstage/integration'; import { Observable } from '@backstage/types'; import qs from 'qs'; +import queryString from 'qs'; import ObservableImpl from 'zen-observable'; import { ListActionsResponse, LogEvent, ScaffolderApi, + ScaffolderDryRunOptions, + ScaffolderDryRunResponse, + ScaffolderGetIntegrationsListOptions, + ScaffolderGetIntegrationsListResponse, ScaffolderScaffoldOptions, ScaffolderScaffoldResponse, ScaffolderStreamLogsOptions, - ScaffolderGetIntegrationsListOptions, - ScaffolderGetIntegrationsListResponse, ScaffolderTask, - ScaffolderDryRunOptions, - ScaffolderDryRunResponse, TemplateParameterSchema, } from '@backstage/plugin-scaffolder-react'; - -import queryString from 'qs'; import { EventSourceMessage, fetchEventSource, @@ -74,7 +73,9 @@ export class ScaffolderClient implements ScaffolderApi { async listTasks(options: { filterByOwnership: 'owned' | 'all'; - }): Promise<{ tasks: ScaffolderTask[] }> { + limit?: number; + offset?: number; + }): Promise<{ tasks: ScaffolderTask[]; totalTasks?: number }> { if (!this.identityApi) { throw new Error( 'IdentityApi is not available in the ScaffolderClient, please pass through the IdentityApi to the ScaffolderClient constructor in order to use the listTasks method', @@ -83,9 +84,12 @@ export class ScaffolderClient implements ScaffolderApi { const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder'); const { userEntityRef } = await this.identityApi.getBackstageIdentity(); - const query = queryString.stringify( - options.filterByOwnership === 'owned' ? { createdBy: userEntityRef } : {}, - ); + const query = queryString.stringify({ + createdBy: + options.filterByOwnership === 'owned' ? userEntityRef : undefined, + limit: options.limit, + offset: options.offset, + }); const response = await this.fetchApi.fetch(`${baseUrl}/v2/tasks?${query}`); if (!response.ok) { diff --git a/plugins/scaffolder/src/components/ListTasksPage/ListTaskPage.test.tsx b/plugins/scaffolder/src/components/ListTasksPage/ListTaskPage.test.tsx index b9c5a84da3..f7f75bc3e8 100644 --- a/plugins/scaffolder/src/components/ListTasksPage/ListTaskPage.test.tsx +++ b/plugins/scaffolder/src/components/ListTasksPage/ListTaskPage.test.tsx @@ -25,8 +25,8 @@ import React from 'react'; import { identityApiRef } from '@backstage/core-plugin-api'; import { ListTasksPage } from './ListTasksPage'; import { - scaffolderApiRef, ScaffolderApi, + scaffolderApiRef, } from '@backstage/plugin-scaffolder-react'; import { act, fireEvent } from '@testing-library/react'; import { rootRouteRef } from '../../routes'; @@ -64,7 +64,7 @@ describe('', () => { }; catalogApi.getEntityByRef.mockResolvedValue(entity); - scaffolderApiMock.listTasks.mockResolvedValue({ tasks: [] }); + scaffolderApiMock.listTasks.mockResolvedValue({ tasks: [], totalTasks: 0 }); const { getByText } = await renderInTestApp( ', () => { lastHeartbeatAt: '', }, ], + totalTasks: 1, }); scaffolderApiMock.getTemplateParameterSchema.mockResolvedValue({ @@ -145,6 +146,8 @@ describe('', () => { expect(scaffolderApiMock.listTasks).toHaveBeenCalledWith({ filterByOwnership: 'owned', + limit: 5, + offset: 0, }); expect(getByText('List template tasks')).toBeInTheDocument(); expect(getByText('All tasks that have been started')).toBeInTheDocument(); @@ -194,6 +197,7 @@ describe('', () => { lastHeartbeatAt: '', }, ], + totalTasks: 1, }) .mockResolvedValue({ tasks: [ @@ -212,6 +216,7 @@ describe('', () => { lastHeartbeatAt: '', }, ], + totalTasks: 1, }); scaffolderApiMock.getTemplateParameterSchema.mockResolvedValue({ @@ -244,6 +249,8 @@ describe('', () => { expect(scaffolderApiMock.listTasks).toHaveBeenCalledWith({ filterByOwnership: 'all', + limit: 5, + offset: 0, }); expect(await findByText('One Template')).toBeInTheDocument(); expect(await findByText('OtherUser')).toBeInTheDocument(); diff --git a/plugins/scaffolder/src/components/ListTasksPage/ListTasksPage.tsx b/plugins/scaffolder/src/components/ListTasksPage/ListTasksPage.tsx index 7bc34662ef..b07d7c7fd3 100644 --- a/plugins/scaffolder/src/components/ListTasksPage/ListTasksPage.tsx +++ b/plugins/scaffolder/src/components/ListTasksPage/ListTasksPage.tsx @@ -28,8 +28,8 @@ import { CatalogFilterLayout } from '@backstage/plugin-catalog-react'; import useAsync from 'react-use/esm/useAsync'; import React, { useState } from 'react'; import { - ScaffolderTask, scaffolderApiRef, + ScaffolderTask, } from '@backstage/plugin-scaffolder-react'; import { OwnerListPicker } from './OwnerListPicker'; import { @@ -51,6 +51,8 @@ export interface MyTaskPageProps { const ListTaskPageContent = (props: MyTaskPageProps) => { const { initiallySelectedFilter = 'owned' } = props; const { t } = useTranslationRef(scaffolderTranslationRef); + const [limit, setLimit] = useState(5); + const [page, setPage] = useState(0); const scaffolderApi = useApi(scaffolderApiRef); const rootLink = useRouteRef(rootRouteRef); @@ -58,7 +60,11 @@ const ListTaskPageContent = (props: MyTaskPageProps) => { const [ownerFilter, setOwnerFilter] = useState(initiallySelectedFilter); const { value, loading, error } = useAsync(() => { if (scaffolderApi.listTasks) { - return scaffolderApi.listTasks?.({ filterByOwnership: ownerFilter }); + return scaffolderApi.listTasks?.({ + filterByOwnership: ownerFilter, + limit, + offset: page * limit, + }); } // eslint-disable-next-line no-console @@ -66,8 +72,8 @@ const ListTaskPageContent = (props: MyTaskPageProps) => { 'listTasks is not implemented in the scaffolderApi, please make sure to implement this method.', ); - return Promise.resolve({ tasks: [] }); - }, [scaffolderApi, ownerFilter]); + return Promise.resolve({ tasks: [], totalTasks: 0 }); + }, [scaffolderApi, ownerFilter, limit, page]); if (loading) { return ; @@ -96,7 +102,15 @@ const ListTaskPageContent = (props: MyTaskPageProps) => { + onRowsPerPageChange={pageSize => { + setPage(0); + setLimit(pageSize); + }} + onPageChange={newPage => setPage(newPage)} + options={{ pageSize: limit, emptyRowsWhenPaging: false }} data={value?.tasks ?? []} + page={page} + totalCount={value?.totalTasks ?? 0} title={t('listTaskPage.content.tableTitle')} columns={[ { From dc9d3acc874435844fb83068c6430a9e2457759f Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Tue, 18 Jun 2024 22:14:31 -0400 Subject: [PATCH 024/217] move react types to a dev dependency and peer dependency Signed-off-by: aramissennyeydd --- packages/app-defaults/package.json | 8 +++++++- packages/core-app-api/package.json | 18 ++++++++++++------ packages/core-compat-api/package.json | 13 +++++++++---- packages/core-components/package.json | 8 +++++++- packages/core-plugin-api/package.json | 9 ++------- packages/dev-utils/package.json | 5 +++++ packages/frontend-app-api/package.json | 5 +++++ packages/frontend-plugin-api/package.json | 8 +++++++- packages/frontend-test-utils/package.json | 8 +++++++- packages/integration-react/package.json | 10 ++++++++-- .../techdocs-cli-embedded-app/package.json | 4 ++-- packages/test-utils/package.json | 8 +++++++- packages/theme/package.json | 7 ++++++- packages/version-bridge/package.json | 12 ++++++++---- .../package.json | 10 ++++++++-- plugins/api-docs/package.json | 8 +++++++- plugins/app-visualizer/package.json | 12 +++++++++--- plugins/auth-react/package.json | 10 ++++++++-- plugins/catalog-graph/package.json | 10 ++++++++-- plugins/catalog-import/package.json | 8 +++++++- plugins/catalog-react/package.json | 18 ++++++++++++------ .../catalog-unprocessed-entities/package.json | 10 ++++++++-- plugins/catalog/package.json | 8 +++++++- plugins/config-schema/package.json | 10 ++++++++-- plugins/devtools/package.json | 14 ++++++++++---- plugins/example-todo-list/package.json | 8 +++++++- plugins/home-react/package.json | 10 ++++++++-- plugins/home/package.json | 8 +++++++- plugins/kubernetes-cluster/package.json | 10 ++++++++-- plugins/kubernetes-react/package.json | 14 ++++++++++---- plugins/kubernetes/package.json | 10 ++++++++-- plugins/notifications/package.json | 8 +++++++- plugins/org-react/package.json | 10 ++++++++-- plugins/org/package.json | 10 ++++++++-- plugins/permission-react/package.json | 10 ++++++++-- .../scaffolder-node-test-utils/package.json | 3 +-- plugins/scaffolder-react/package.json | 8 +++++++- plugins/scaffolder/package.json | 8 +++++++- plugins/search-react/package.json | 10 ++++++++-- plugins/search/package.json | 8 +++++++- .../techdocs-addons-test-utils/package.json | 10 ++++++++-- .../package.json | 8 +++++++- plugins/techdocs-react/package.json | 10 ++++++++-- plugins/techdocs/package.json | 9 ++++++++- plugins/user-settings/package.json | 8 +++++++- 45 files changed, 331 insertions(+), 90 deletions(-) diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json index dac7cebeaa..0641cd7096 100644 --- a/packages/app-defaults/package.json +++ b/packages/app-defaults/package.json @@ -49,9 +49,15 @@ "@backstage/test-utils": "workspace:^", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", - "@types/react": "^16.13.1 || ^17.0.0" + "@types/react": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json index a410836f27..b5a173ce0d 100644 --- a/packages/core-app-api/package.json +++ b/packages/core-app-api/package.json @@ -51,7 +51,7 @@ "@backstage/types": "workspace:^", "@backstage/version-bridge": "workspace:^", "@types/prop-types": "^15.7.3", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "@types/react": "^18.0.0", "history": "^5.0.0", "i18next": "^22.4.15", "lodash": "^4.17.21", @@ -60,6 +60,17 @@ "zen-observable": "^0.10.0", "zod": "^3.22.4" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, + "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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": { "@backstage/cli": "workspace:^", "@backstage/test-utils": "workspace:^", @@ -75,10 +86,5 @@ "react-router-dom-stable": "npm:react-router-dom@^6.3.0", "react-router-stable": "npm:react-router@^6.3.0" }, - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0", - "react-router-dom": "6.0.0-beta.0 || ^6.3.0" - }, "configSchema": "config.d.ts" } diff --git a/packages/core-compat-api/package.json b/packages/core-compat-api/package.json index eea6e65717..76e925bd34 100644 --- a/packages/core-compat-api/package.json +++ b/packages/core-compat-api/package.json @@ -33,9 +33,7 @@ "dependencies": { "@backstage/core-plugin-api": "workspace:^", "@backstage/frontend-plugin-api": "workspace:^", - "@backstage/version-bridge": "workspace:^", - "@types/react": "^16.13.1 || ^17.0.0", - "lodash": "^4.17.21" + "@backstage/version-bridge": "workspace:^" }, "devDependencies": { "@backstage-community/plugin-puppetdb": "^0.1.18", @@ -50,9 +48,16 @@ "@oriflame/backstage-plugin-score-card": "^0.8.0", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", - "zod": "^3.22.4" + "zod": "^3.22.4", + "@types/react": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" } diff --git a/packages/core-components/package.json b/packages/core-components/package.json index 4390c2eaf1..69ac146f1a 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -65,7 +65,6 @@ "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^24.0.0", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "@types/react-sparklines": "^1.7.0", "ansi-regex": "^6.0.1", "classnames": "^2.2.6", @@ -108,6 +107,7 @@ "@types/d3-zoom": "^3.0.1", "@types/dagre": "^0.7.44", "@types/google-protobuf": "^3.7.2", + "@types/react": "^18.0.0", "@types/react-helmet": "^6.1.0", "@types/react-syntax-highlighter": "^15.0.0", "@types/react-virtualized-auto-sizer": "^1.0.1", @@ -117,7 +117,13 @@ "history": "^5.0.0", "msw": "^1.0.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json index 7d0e2925ae..5f91bae603 100644 --- a/packages/core-plugin-api/package.json +++ b/packages/core-plugin-api/package.json @@ -53,7 +53,6 @@ "@backstage/errors": "workspace:^", "@backstage/types": "workspace:^", "@backstage/version-bridge": "workspace:^", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "history": "^5.0.0" }, "devDependencies": { @@ -63,11 +62,7 @@ "@testing-library/dom": "^10.0.0", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", - "@testing-library/user-event": "^14.0.0" - }, - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0", - "react-router-dom": "6.0.0-beta.0 || ^6.3.0" + "@testing-library/user-event": "^14.0.0", + "@types/react": "^18.0.0" } } diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index fbdbd454f2..7a087657e8 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -58,6 +58,11 @@ "@testing-library/user-event": "^14.0.0", "zen-observable": "^0.10.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/packages/frontend-app-api/package.json b/packages/frontend-app-api/package.json index 1a7ac69820..e14867fecb 100644 --- a/packages/frontend-app-api/package.json +++ b/packages/frontend-app-api/package.json @@ -44,6 +44,11 @@ "lodash": "^4.17.21", "zod": "^3.22.4" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/plugin-app": "workspace:^", diff --git a/packages/frontend-plugin-api/package.json b/packages/frontend-plugin-api/package.json index 9595d6670f..0a64f9222c 100644 --- a/packages/frontend-plugin-api/package.json +++ b/packages/frontend-plugin-api/package.json @@ -36,7 +36,6 @@ "@backstage/types": "workspace:^", "@backstage/version-bridge": "workspace:^", "@material-ui/core": "^4.12.4", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "lodash": "^4.17.21", "zod": "^3.22.4", "zod-to-json-schema": "^3.21.4" @@ -48,9 +47,16 @@ "@backstage/test-utils": "workspace:^", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", + "@types/react": "^18.0.0", "history": "^5.3.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" } diff --git a/packages/frontend-test-utils/package.json b/packages/frontend-test-utils/package.json index f6ecd28a97..0661c0df95 100644 --- a/packages/frontend-test-utils/package.json +++ b/packages/frontend-test-utils/package.json @@ -43,10 +43,16 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@testing-library/jest-dom": "^6.0.0", - "@types/react": "*" + "@types/react": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "peerDependencies": { "@testing-library/react": "^16.0.0", + "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" } diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index 610ce6f02f..c4e920cc91 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -37,8 +37,7 @@ "@backstage/core-plugin-api": "workspace:^", "@backstage/integration": "workspace:^", "@material-ui/core": "^4.12.2", - "@material-ui/icons": "^4.9.1", - "@types/react": "^16.13.1 || ^17.0.0" + "@material-ui/icons": "^4.9.1" }, "devDependencies": { "@backstage/cli": "workspace:^", @@ -47,9 +46,16 @@ "@backstage/test-utils": "workspace:^", "@testing-library/dom": "^10.0.0", "@testing-library/jest-dom": "^6.0.0", + "@types/react": "^18.0.0", "msw": "^1.0.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index 249ec2f062..00baa817d6 100644 --- a/packages/techdocs-cli-embedded-app/package.json +++ b/packages/techdocs-cli-embedded-app/package.json @@ -59,8 +59,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", - "@types/react": "*", - "@types/react-dom": "*", + "@types/react": "^18.0.0", + "@types/react-dom": "^18.0.0", "cross-env": "^7.0.0" }, "bundled": true diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index b504419e76..857652cb62 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -58,7 +58,6 @@ "@backstage/types": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "cross-fetch": "^4.0.0", "i18next": "^22.4.15", "zen-observable": "^0.10.0" @@ -66,10 +65,17 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@testing-library/jest-dom": "^6.0.0", + "@types/react": "^18.0.0", "msw": "^1.0.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "peerDependencies": { "@testing-library/react": "^16.0.0", + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/packages/theme/package.json b/packages/theme/package.json index e0c1d049d9..6d46e96ec0 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -45,7 +45,12 @@ "@mui/styles": "^5.14.18", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", - "@types/react": "^16.13.1 || ^17.0.0" + "@types/react": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "peerDependencies": { "@material-ui/core": "^4.12.2", diff --git a/packages/version-bridge/package.json b/packages/version-bridge/package.json index e69fb3b364..ce68394e6d 100644 --- a/packages/version-bridge/package.json +++ b/packages/version-bridge/package.json @@ -35,15 +35,19 @@ "start": "backstage-cli package start", "test": "backstage-cli package test" }, - "dependencies": { - "@types/react": "^16.13.1 || ^17.0.0" - }, "devDependencies": { "@backstage/cli": "workspace:^", "@testing-library/jest-dom": "^6.0.0", - "@testing-library/react": "^16.0.0" + "@testing-library/react": "^16.0.0", + "@types/react": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/plugins/api-docs-module-protoc-gen-doc/package.json b/plugins/api-docs-module-protoc-gen-doc/package.json index ce2758e528..260491d620 100644 --- a/plugins/api-docs-module-protoc-gen-doc/package.json +++ b/plugins/api-docs-module-protoc-gen-doc/package.json @@ -37,14 +37,20 @@ "test": "backstage-cli package test" }, "dependencies": { - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "grpc-docs": "^1.1.2" }, "devDependencies": { "@backstage/cli": "workspace:^", - "@testing-library/jest-dom": "^6.0.0" + "@testing-library/jest-dom": "^6.0.0", + "@types/react": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index 9adaf2319d..5da52d0bb2 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -67,7 +67,6 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "graphiql": "3.1.1", "graphql": "^16.0.0", "graphql-config": "^5.0.2", @@ -85,9 +84,16 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/highlightjs": "^10.1.0", + "@types/react": "^18.0.0", "@types/swagger-ui-react": "^4.18.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/plugins/app-visualizer/package.json b/plugins/app-visualizer/package.json index b25b27d60c..945b6e3e76 100644 --- a/plugins/app-visualizer/package.json +++ b/plugins/app-visualizer/package.json @@ -38,13 +38,19 @@ "@backstage/core-plugin-api": "workspace:^", "@backstage/frontend-plugin-api": "workspace:^", "@material-ui/core": "^4.12.2", - "@material-ui/icons": "^4.9.1", - "@types/react": "^16.13.1 || ^17.0.0" + "@material-ui/icons": "^4.9.1" }, "devDependencies": { - "@backstage/cli": "workspace:^" + "@backstage/cli": "workspace:^", + "@types/react": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/plugins/auth-react/package.json b/plugins/auth-react/package.json index 0fc89df74c..17923097dc 100644 --- a/plugins/auth-react/package.json +++ b/plugins/auth-react/package.json @@ -42,8 +42,7 @@ "@backstage/core-plugin-api": "workspace:^", "@backstage/errors": "workspace:^", "@material-ui/core": "^4.9.13", - "@react-hookz/web": "^24.0.0", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0" + "@react-hookz/web": "^24.0.0" }, "devDependencies": { "@backstage/cli": "workspace:^", @@ -51,9 +50,16 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", + "@types/react": "^18.0.0", "msw": "^1.0.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react": "^16.13.1 || ^17.0.0 || ^18.0.0" } } diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index d9c0198853..2d26a57ab6 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -60,7 +60,6 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "classnames": "^2.3.1", "lodash": "^4.17.15", "p-limit": "^3.1.0", @@ -76,9 +75,16 @@ "@testing-library/dom": "^10.0.0", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", - "@testing-library/user-event": "^14.0.0" + "@testing-library/user-event": "^14.0.0", + "@types/react": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index aeddafc06f..bf0630b989 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -70,7 +70,6 @@ "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@octokit/rest": "^19.0.3", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "git-url-parse": "^14.0.0", "js-base64": "^3.6.0", "lodash": "^4.17.21", @@ -88,9 +87,16 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", + "@types/react": "^18.0.0", "msw": "^1.0.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index 974a6e1817..330c3ad191 100644 --- a/plugins/catalog-react/package.json +++ b/plugins/catalog-react/package.json @@ -74,7 +74,6 @@ "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^24.0.0", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "classnames": "^2.2.6", "lodash": "^4.17.21", "material-ui-popup-state": "^1.9.3", @@ -83,6 +82,17 @@ "yaml": "^2.0.0", "zen-observable": "^0.10.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, + "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", @@ -94,12 +104,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", + "@types/react": "^18.0.0", "@types/zen-observable": "^0.8.0", "react-test-renderer": "^16.13.1" - }, - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0", - "react-router-dom": "6.0.0-beta.0 || ^6.3.0" } } diff --git a/plugins/catalog-unprocessed-entities/package.json b/plugins/catalog-unprocessed-entities/package.json index 038cee37fc..c019eee3fa 100644 --- a/plugins/catalog-unprocessed-entities/package.json +++ b/plugins/catalog-unprocessed-entities/package.json @@ -44,7 +44,6 @@ "@material-ui/core": "^4.9.13", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "^4.0.0-alpha.60", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "luxon": "^3.5.0", "react-use": "^17.2.4" }, @@ -52,9 +51,16 @@ "@backstage/cli": "workspace:^", "@backstage/dev-utils": "workspace:^", "@testing-library/jest-dom": "^6.0.0", - "@testing-library/react": "^16.0.0" + "@testing-library/react": "^16.0.0", + "@types/react": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index e6cfb9ca47..ffd0480f29 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -77,7 +77,6 @@ "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@mui/utils": "^5.14.15", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "dataloader": "^2.0.0", "expiry-map": "^2.0.0", "history": "^5.0.0", @@ -98,9 +97,16 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/pluralize": "^0.0.33", + "@types/react": "^18.0.0", "swr": "^2.2.5" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json index 5739b187b7..28e294ab3d 100644 --- a/plugins/config-schema/package.json +++ b/plugins/config-schema/package.json @@ -44,7 +44,6 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "jsonschema": "^1.2.6", "react-use": "^17.2.4", "zen-observable": "^0.10.0" @@ -54,9 +53,16 @@ "@backstage/dev-utils": "workspace:^", "@testing-library/dom": "^10.0.0", "@testing-library/jest-dom": "^6.0.0", - "@testing-library/react": "^16.0.0" + "@testing-library/react": "^16.0.0", + "@types/react": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/plugins/devtools/package.json b/plugins/devtools/package.json index 3bcb6d5c64..ee42a2943c 100644 --- a/plugins/devtools/package.json +++ b/plugins/devtools/package.json @@ -64,15 +64,21 @@ "react-json-view": "^1.21.3", "react-use": "^17.2.4" }, - "devDependencies": { - "@backstage/cli": "workspace:^", - "@backstage/dev-utils": "workspace:^", - "@testing-library/jest-dom": "^6.0.0" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.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": { + "@backstage/cli": "workspace:^", + "@backstage/dev-utils": "workspace:^", + "@testing-library/jest-dom": "^6.0.0", + "@types/react": "^18.0.0" } } diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json index bcf4ee435e..f24678ad0b 100644 --- a/plugins/example-todo-list/package.json +++ b/plugins/example-todo-list/package.json @@ -50,9 +50,15 @@ "@testing-library/dom": "^10.0.0", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", - "@types/react": "^16.13.1 || ^17.0.0" + "@types/react": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/plugins/home-react/package.json b/plugins/home-react/package.json index db5a59467c..16b806e172 100644 --- a/plugins/home-react/package.json +++ b/plugins/home-react/package.json @@ -46,14 +46,20 @@ "@backstage/core-plugin-api": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@rjsf/utils": "5.21.1", - "@types/react": "^16.13.1 || ^17.0.0" + "@rjsf/utils": "5.21.1" }, "devDependencies": { "@backstage/cli": "workspace:^", + "@types/react": "^18.0.0", "@types/react-grid-layout": "^1.3.2" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/plugins/home/package.json b/plugins/home/package.json index e135e53892..f850720745 100644 --- a/plugins/home/package.json +++ b/plugins/home/package.json @@ -74,7 +74,6 @@ "@rjsf/material-ui": "5.21.1", "@rjsf/utils": "5.21.1", "@rjsf/validator-ajv8": "5.21.1", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "lodash": "^4.17.21", "luxon": "^3.4.3", "react-grid-layout": "1.3.4", @@ -90,9 +89,16 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", + "@types/react": "^18.0.0", "@types/react-grid-layout": "^1.3.2" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/plugins/kubernetes-cluster/package.json b/plugins/kubernetes-cluster/package.json index 9134d428af..405231899b 100644 --- a/plugins/kubernetes-cluster/package.json +++ b/plugins/kubernetes-cluster/package.json @@ -51,7 +51,6 @@ "@kubernetes-models/base": "^4.0.1", "@material-ui/core": "^4.12.2", "@material-ui/lab": "4.0.0-alpha.61", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "cronstrue": "^2.2.0", "js-yaml": "^4.0.0", "kubernetes-models": "^4.1.0", @@ -65,9 +64,16 @@ "@testing-library/dom": "^10.0.0", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", - "@types/node": "^16.11.26" + "@types/node": "^16.11.26", + "@types/react": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/plugins/kubernetes-react/package.json b/plugins/kubernetes-react/package.json index 68ccce1b88..7c5217424d 100644 --- a/plugins/kubernetes-react/package.json +++ b/plugins/kubernetes-react/package.json @@ -53,7 +53,6 @@ "@material-ui/core": "^4.9.13", "@material-ui/icons": "^4.11.3", "@material-ui/lab": "^4.0.0-alpha.61", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "cronstrue": "^2.32.0", "js-yaml": "^4.1.0", "kubernetes-models": "^4.3.1", @@ -64,17 +63,24 @@ "xterm-addon-attach": "^0.9.0", "xterm-addon-fit": "^0.8.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, + "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "react": "^16.13.1 || ^17.0.0 || ^18.0.0" + }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/test-utils": "workspace:^", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", + "@types/react": "^18.0.0", "jest-websocket-mock": "^2.5.0", "msw": "^1.3.1" }, - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0 || ^18.0.0" - }, "configSchema": "config.d.ts" } diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index 775a8dd82e..f24b695964 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -70,7 +70,6 @@ "@kubernetes-models/base": "^4.0.1", "@kubernetes/client-node": "0.20.0", "@material-ui/core": "^4.12.2", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "cronstrue": "^2.2.0", "js-yaml": "^4.0.0", "kubernetes-models": "^4.1.0", @@ -80,6 +79,11 @@ "xterm-addon-attach": "^0.9.0", "xterm-addon-fit": "^0.8.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/dev-utils": "workspace:^", @@ -91,6 +95,8 @@ "peerDependencies": { "react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0", - "react-router-dom": "6.0.0-beta.0 || ^6.3.0" + "react-router-dom": "6.0.0-beta.0 || ^6.3.0", + "@testing-library/react": "^16.0.0", + "@types/react": "^18.0.0" } } diff --git a/plugins/notifications/package.json b/plugins/notifications/package.json index 4307e48756..b96f06c3a1 100644 --- a/plugins/notifications/package.json +++ b/plugins/notifications/package.json @@ -48,7 +48,6 @@ "@material-ui/core": "^4.9.13", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "^4.0.0-alpha.61", - "@types/react": "^16.13.1 || ^17.0.0", "lodash": "^4.17.21", "material-ui-confirm": "^3.0.12", "notistack": "^3.0.1", @@ -64,9 +63,16 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", + "@types/react": "^18.0.0", "msw": "^1.0.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" } diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json index f6d700cce3..376b3b9784 100644 --- a/plugins/org-react/package.json +++ b/plugins/org-react/package.json @@ -48,7 +48,6 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-use": "^17.2.4" }, "devDependencies": { @@ -58,9 +57,16 @@ "@testing-library/dom": "^10.0.0", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", - "@testing-library/user-event": "^14.0.0" + "@testing-library/user-event": "^14.0.0", + "@types/react": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/plugins/org/package.json b/plugins/org/package.json index e35d4bdfa2..22e1dca1a2 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -61,7 +61,6 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "lodash": "^4.17.21", "p-limit": "^3.1.0", "pluralize": "^8.0.0", @@ -81,9 +80,16 @@ "@testing-library/dom": "^10.0.0", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", - "@testing-library/user-event": "^14.0.0" + "@testing-library/user-event": "^14.0.0", + "@types/react": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/plugins/permission-react/package.json b/plugins/permission-react/package.json index fc60a9fc1f..29ebe15125 100644 --- a/plugins/permission-react/package.json +++ b/plugins/permission-react/package.json @@ -45,16 +45,22 @@ "@backstage/config": "workspace:^", "@backstage/core-plugin-api": "workspace:^", "@backstage/plugin-permission-common": "workspace:^", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "swr": "^2.0.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/test-utils": "workspace:^", "@testing-library/jest-dom": "^6.0.0", - "@testing-library/react": "^16.0.0" + "@testing-library/react": "^16.0.0", + "@types/react": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/plugins/scaffolder-node-test-utils/package.json b/plugins/scaffolder-node-test-utils/package.json index 0fc95260a7..dc71447bd9 100644 --- a/plugins/scaffolder-node-test-utils/package.json +++ b/plugins/scaffolder-node-test-utils/package.json @@ -46,7 +46,6 @@ "@backstage/types": "workspace:^" }, "devDependencies": { - "@backstage/cli": "workspace:^", - "@types/react": "*" + "@backstage/cli": "workspace:^" } } diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index 99dd7cf949..50e37f36a2 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -78,7 +78,6 @@ "@rjsf/utils": "5.21.1", "@rjsf/validator-ajv8": "5.21.1", "@types/json-schema": "^7.0.9", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "ajv-errors": "^3.0.0", "classnames": "^2.2.6", "flatted": "3.3.1", @@ -107,9 +106,16 @@ "@testing-library/user-event": "^14.0.0", "@types/humanize-duration": "^3.18.1", "@types/luxon": "^3.0.0", + "@types/react": "^18.0.0", "swr": "^2.0.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index f73082cd22..cd7616ea43 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -85,7 +85,6 @@ "@rjsf/material-ui": "5.21.1", "@rjsf/utils": "5.21.1", "@rjsf/validator-ajv8": "5.21.1", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "@uiw/react-codemirror": "^4.9.3", "classnames": "^2.2.6", "git-url-parse": "^14.0.0", @@ -120,10 +119,17 @@ "@types/json-schema": "^7.0.9", "@types/react-resizable": "^3.0.8", "@types/react-window": "^1.8.8", + "@types/react": "^18.0.0", "msw": "^1.0.0", "swr": "^2.0.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json index 2b4f5de145..5b8d478320 100644 --- a/plugins/search-react/package.json +++ b/plugins/search-react/package.json @@ -66,7 +66,6 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "lodash": "^4.17.21", "qs": "^6.9.4", "react-use": "^17.3.2" @@ -80,9 +79,16 @@ "@testing-library/dom": "^10.0.0", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", - "@testing-library/user-event": "^14.0.0" + "@testing-library/user-event": "^14.0.0", + "@types/react": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/plugins/search/package.json b/plugins/search/package.json index cc9e8df9b7..ce733d7a8b 100644 --- a/plugins/search/package.json +++ b/plugins/search/package.json @@ -70,7 +70,6 @@ "@backstage/version-bridge": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "qs": "^6.9.4", "react-use": "^17.2.4" }, @@ -83,9 +82,16 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", + "@types/react": "^18.0.0", "history": "^5.0.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index ea61f6d6d4..986cbf0d55 100644 --- a/plugins/techdocs-addons-test-utils/package.json +++ b/plugins/techdocs-addons-test-utils/package.json @@ -49,16 +49,22 @@ "@backstage/plugin-techdocs": "workspace:^", "@backstage/plugin-techdocs-react": "workspace:^", "@backstage/test-utils": "workspace:^", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "testing-library__dom": "^7.29.4-beta.1" }, "devDependencies": { "@backstage/cli": "workspace:^", "@testing-library/dom": "^10.0.0", - "@testing-library/jest-dom": "^6.0.0" + "@testing-library/jest-dom": "^6.0.0", + "@types/react": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "peerDependencies": { "@testing-library/react": "^16.0.0", + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index a4a58184d5..4551e95c2b 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -57,9 +57,15 @@ "@testing-library/dom": "^10.0.0", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", - "@types/react": "^16.13.1 || ^17.0.0" + "@types/react": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json index 0c196707f0..af5e0c7377 100644 --- a/plugins/techdocs-react/package.json +++ b/plugins/techdocs-react/package.json @@ -52,7 +52,6 @@ "@backstage/version-bridge": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/styles": "^4.11.0", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "jss": "~10.10.0", "lodash": "^4.17.21", "react-helmet": "6.1.0", @@ -63,9 +62,16 @@ "@backstage/test-utils": "workspace:^", "@backstage/theme": "workspace:^", "@testing-library/jest-dom": "^6.0.0", - "@testing-library/react": "^16.0.0" + "@testing-library/react": "^16.0.0", + "@types/react": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index a6e6179c87..bde33b3c1e 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -80,7 +80,6 @@ "@material-ui/lab": "4.0.0-alpha.61", "@material-ui/styles": "^4.10.0", "@microsoft/fetch-event-source": "^2.0.1", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "dompurify": "^3.0.0", "git-url-parse": "^14.0.0", "jss": "~10.10.0", @@ -99,9 +98,17 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/dompurify": "^3.0.0", + "@types/event-source-polyfill": "^1.0.0", + "@types/react": "^18.0.0", "canvas": "^2.10.2" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index 4c20c2f0f3..beab130693 100644 --- a/plugins/user-settings/package.json +++ b/plugins/user-settings/package.json @@ -69,7 +69,6 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-use": "^17.2.4", "zen-observable": "^0.10.0" }, @@ -82,9 +81,16 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", + "@types/react": "^18.0.0", "msw": "^1.0.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" From e969dc7dc8f3d654b941fad27899b4551f3608f4 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Tue, 18 Jun 2024 22:27:15 -0400 Subject: [PATCH 025/217] add changeset Signed-off-by: aramissennyeydd --- .changeset/early-sloths-cross.md | 180 +++++++++++++++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100644 .changeset/early-sloths-cross.md diff --git a/.changeset/early-sloths-cross.md b/.changeset/early-sloths-cross.md new file mode 100644 index 0000000000..4683bbaf8d --- /dev/null +++ b/.changeset/early-sloths-cross.md @@ -0,0 +1,180 @@ +--- +'@backstage/plugin-scaffolder-backend-module-confluence-to-markdown': patch +'@backstage/plugin-auth-backend-module-cloudflare-access-provider': patch +'@backstage/plugin-catalog-backend-module-scaffolder-entity-model': patch +'@backstage/plugin-search-backend-module-stack-overflow-collator': patch +'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch +'@backstage/plugin-auth-backend-module-azure-easyauth-provider': patch +'@backstage/plugin-permission-backend-module-allow-all-policy': patch +'@backstage/plugin-scaffolder-backend-module-bitbucket-server': patch +'@backstage/plugin-auth-backend-module-oauth2-proxy-provider': patch +'@backstage/plugin-auth-backend-module-vmware-cloud-provider': patch +'@backstage/plugin-scaffolder-backend-module-bitbucket-cloud': patch +'@backstage/plugin-catalog-backend-module-backstage-openapi': patch +'@backstage/plugin-catalog-backend-module-bitbucket-server': patch +'@backstage/plugin-scaffolder-backend-module-notifications': patch +'@backstage/plugin-auth-backend-module-atlassian-provider': patch +'@backstage/plugin-auth-backend-module-bitbucket-provider': patch +'@backstage/plugin-auth-backend-module-microsoft-provider': patch +'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch +'@backstage/plugin-scaffolder-backend-module-cookiecutter': patch +'@backstage/plugin-auth-backend-module-onelogin-provider': patch +'@backstage/plugin-auth-backend-module-pinniped-provider': patch +'@backstage/plugin-events-backend-module-bitbucket-cloud': patch +'@backstage/plugin-auth-backend-module-aws-alb-provider': 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-auth-backend-module-oauth2-provider': patch +'@backstage/plugin-catalog-unprocessed-entities-common': patch +'@backstage/plugin-scaffolder-backend-module-bitbucket': patch +'@backstage/plugin-search-backend-module-elasticsearch': patch +'@backstage/plugin-auth-backend-module-guest-provider': patch +'@backstage/plugin-catalog-backend-module-unprocessed': patch +'@backstage/plugin-notifications-backend-module-email': patch +'@backstage/plugin-auth-backend-module-oidc-provider': patch +'@backstage/plugin-auth-backend-module-okta-provider': patch +'@backstage/plugin-catalog-backend-module-github-org': patch +'@backstage/plugin-catalog-backend-module-gitlab-org': patch +'@backstage/backend-dynamic-feature-service': patch +'@backstage/plugin-scaffolder-backend-module-gerrit': patch +'@backstage/plugin-scaffolder-backend-module-github': patch +'@backstage/plugin-scaffolder-backend-module-gitlab': patch +'@backstage/plugin-scaffolder-backend-module-sentry': patch +'@backstage/plugin-scaffolder-backend-module-yeoman': patch +'@backstage/plugin-catalog-backend-module-puppetdb': patch +'@backstage/plugin-scaffolder-backend-module-azure': patch +'@backstage/plugin-scaffolder-backend-module-gitea': patch +'@backstage/plugin-scaffolder-backend-module-rails': patch +'@backstage/plugin-api-docs-module-protoc-gen-doc': patch +'@backstage/plugin-catalog-backend-module-msgraph': patch +'@backstage/plugin-catalog-backend-module-openapi': patch +'@backstage/plugin-search-backend-module-techdocs': patch +'@backstage/plugin-techdocs-module-addons-contrib': patch +'@backstage/plugin-catalog-backend-module-gerrit': patch +'@backstage/plugin-catalog-backend-module-github': patch +'@backstage/plugin-catalog-backend-module-gitlab': patch +'@backstage/plugin-events-backend-module-aws-sqs': patch +'@backstage/plugin-search-backend-module-catalog': patch +'@backstage/plugin-search-backend-module-explore': patch +'@backstage/plugin-catalog-backend-module-azure': patch +'@backstage/plugin-catalog-unprocessed-entities': patch +'@backstage/plugin-events-backend-module-gerrit': patch +'@backstage/plugin-events-backend-module-github': patch +'@backstage/plugin-events-backend-module-gitlab': patch +'@backstage/plugin-catalog-backend-module-ldap': patch +'@backstage/plugin-events-backend-module-azure': patch +'techdocs-cli-embedded-app': patch +'@backstage/plugin-catalog-backend-module-aws': patch +'@backstage/plugin-catalog-backend-module-gcp': patch +'@backstage/plugin-scaffolder-node-test-utils': patch +'@backstage/plugin-techdocs-addons-test-utils': patch +'@backstage/plugin-events-backend-test-utils': patch +'@internal/plugin-todo-list-backend': patch +'app-next-example-plugin': patch +'@internal/plugin-todo-list-common': patch +'@backstage/plugin-search-backend-module-pg': patch +'@backstage/backend-openapi-utils': patch +'@backstage/plugin-bitbucket-cloud-common': patch +'@backstage/plugin-notifications-backend': patch +'@backstage/plugin-user-settings-backend': patch +'@backstage/frontend-plugin-api': patch +'@backstage/frontend-test-utils': patch +'@backstage/plugin-notifications-common': patch +'@backstage/plugin-user-settings-common': patch +'@backstage/backend-plugin-api': patch +'@backstage/backend-test-utils': patch +'@backstage/plugin-search-backend-node': patch +'@backstage/integration-react': patch +'@backstage/plugin-kubernetes-backend': patch +'@backstage/plugin-kubernetes-cluster': patch +'@backstage/plugin-notifications-node': patch +'@backstage/plugin-permission-backend': patch +'@backstage/plugin-scaffolder-backend': patch +'@backstage/backend-defaults': patch +'@backstage/frontend-app-api': patch +'@internal/plugin-todo-list': patch +'@backstage/plugin-kubernetes-common': patch +'@backstage/plugin-permission-common': patch +'@backstage/plugin-scaffolder-common': patch +'@backstage/backend-app-api': patch +'@backstage/core-compat-api': patch +'@backstage/core-components': patch +'@backstage/core-plugin-api': patch +'@backstage/plugin-devtools-backend': patch +'@backstage/plugin-kubernetes-react': patch +'@backstage/plugin-permission-react': patch +'@backstage/plugin-scaffolder-react': patch +'@backstage/plugin-techdocs-backend': patch +'@backstage/backend-common': patch +'example-backend-legacy': patch +'@backstage/catalog-client': patch +'@backstage/version-bridge': patch +'@backstage/plugin-catalog-backend': patch +'@backstage/plugin-devtools-common': patch +'@backstage/plugin-kubernetes-node': patch +'@backstage/plugin-permission-node': patch +'@backstage/plugin-scaffolder-node': patch +'@backstage/plugin-signals-backend': patch +'@backstage/backend-tasks': patch +'@backstage/catalog-model': patch +'@backstage/config-loader': patch +'@backstage/eslint-plugin': patch +'@backstage/plugin-app-visualizer': patch +'@backstage/plugin-catalog-common': patch +'@backstage/plugin-catalog-import': patch +'@backstage/plugin-events-backend': patch +'@backstage/plugin-search-backend': patch +'@backstage/plugin-techdocs-react': patch +'@backstage/app-defaults': patch +'@backstage/core-app-api': patch +'@techdocs/cli': patch +'@backstage/plugin-catalog-graph': patch +'@backstage/plugin-catalog-react': patch +'@backstage/plugin-config-schema': patch +'@backstage/plugin-notifications': patch +'@backstage/plugin-proxy-backend': patch +'@backstage/plugin-search-common': patch +'@backstage/plugin-signals-react': patch +'@backstage/plugin-techdocs-node': patch +'@backstage/plugin-user-settings': patch +'@backstage/integration': patch +'yarn-plugin-backstage': patch +'@backstage/plugin-auth-backend': patch +'@backstage/plugin-catalog-node': patch +'@backstage/plugin-search-react': patch +'@backstage/plugin-signals-node': patch +'@backstage/cli-common': patch +'@backstage/create-app': patch +'@backstage/repo-tools': patch +'@backstage/test-utils': patch +'@backstage/plugin-app-backend': patch +'@backstage/plugin-events-node': patch +'@backstage/dev-utils': patch +'@backstage/plugin-auth-react': patch +'@backstage/plugin-home-react': patch +'@backstage/plugin-kubernetes': patch +'@backstage/plugin-scaffolder': patch +'example-app-next': patch +'@backstage/cli-node': patch +'@backstage/codemods': patch +'e2e-test': patch +'@backstage/plugin-auth-node': patch +'@backstage/plugin-org-react': patch +'example-backend': patch +'@backstage/plugin-api-docs': patch +'@backstage/plugin-app-node': patch +'@backstage/plugin-devtools': patch +'@backstage/plugin-techdocs': patch +'@backstage/plugin-catalog': patch +'@backstage/plugin-signals': patch +'@backstage/theme': patch +'@backstage/plugin-search': patch +'example-app': patch +'@backstage/cli': patch +'@backstage/plugin-home': patch +'@backstage/plugin-org': patch +--- + +Move `@types/react` to a peer dependency. From d54e7b6fdbb7b23902daa4f441629bc13302df8f Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Tue, 18 Jun 2024 22:35:31 -0400 Subject: [PATCH 026/217] adjust changeset Signed-off-by: aramissennyeydd --- .changeset/early-sloths-cross.md | 84 -------------------------------- 1 file changed, 84 deletions(-) diff --git a/.changeset/early-sloths-cross.md b/.changeset/early-sloths-cross.md index 4683bbaf8d..0fbf528a9c 100644 --- a/.changeset/early-sloths-cross.md +++ b/.changeset/early-sloths-cross.md @@ -1,97 +1,24 @@ --- -'@backstage/plugin-scaffolder-backend-module-confluence-to-markdown': patch -'@backstage/plugin-auth-backend-module-cloudflare-access-provider': patch -'@backstage/plugin-catalog-backend-module-scaffolder-entity-model': patch -'@backstage/plugin-search-backend-module-stack-overflow-collator': patch -'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch -'@backstage/plugin-auth-backend-module-azure-easyauth-provider': patch -'@backstage/plugin-permission-backend-module-allow-all-policy': patch -'@backstage/plugin-scaffolder-backend-module-bitbucket-server': patch -'@backstage/plugin-auth-backend-module-oauth2-proxy-provider': patch -'@backstage/plugin-auth-backend-module-vmware-cloud-provider': patch -'@backstage/plugin-scaffolder-backend-module-bitbucket-cloud': patch -'@backstage/plugin-catalog-backend-module-backstage-openapi': patch -'@backstage/plugin-catalog-backend-module-bitbucket-server': patch -'@backstage/plugin-scaffolder-backend-module-notifications': patch -'@backstage/plugin-auth-backend-module-atlassian-provider': patch -'@backstage/plugin-auth-backend-module-bitbucket-provider': patch -'@backstage/plugin-auth-backend-module-microsoft-provider': patch -'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch -'@backstage/plugin-scaffolder-backend-module-cookiecutter': patch -'@backstage/plugin-auth-backend-module-onelogin-provider': patch -'@backstage/plugin-auth-backend-module-pinniped-provider': patch -'@backstage/plugin-events-backend-module-bitbucket-cloud': patch -'@backstage/plugin-auth-backend-module-aws-alb-provider': 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-auth-backend-module-oauth2-provider': patch '@backstage/plugin-catalog-unprocessed-entities-common': patch -'@backstage/plugin-scaffolder-backend-module-bitbucket': patch -'@backstage/plugin-search-backend-module-elasticsearch': patch -'@backstage/plugin-auth-backend-module-guest-provider': patch -'@backstage/plugin-catalog-backend-module-unprocessed': patch -'@backstage/plugin-notifications-backend-module-email': patch -'@backstage/plugin-auth-backend-module-oidc-provider': patch -'@backstage/plugin-auth-backend-module-okta-provider': patch -'@backstage/plugin-catalog-backend-module-github-org': patch -'@backstage/plugin-catalog-backend-module-gitlab-org': patch '@backstage/backend-dynamic-feature-service': patch -'@backstage/plugin-scaffolder-backend-module-gerrit': patch -'@backstage/plugin-scaffolder-backend-module-github': patch -'@backstage/plugin-scaffolder-backend-module-gitlab': patch -'@backstage/plugin-scaffolder-backend-module-sentry': patch -'@backstage/plugin-scaffolder-backend-module-yeoman': patch -'@backstage/plugin-catalog-backend-module-puppetdb': patch -'@backstage/plugin-scaffolder-backend-module-azure': patch -'@backstage/plugin-scaffolder-backend-module-gitea': patch -'@backstage/plugin-scaffolder-backend-module-rails': patch -'@backstage/plugin-api-docs-module-protoc-gen-doc': patch -'@backstage/plugin-catalog-backend-module-msgraph': patch -'@backstage/plugin-catalog-backend-module-openapi': patch -'@backstage/plugin-search-backend-module-techdocs': patch '@backstage/plugin-techdocs-module-addons-contrib': patch -'@backstage/plugin-catalog-backend-module-gerrit': patch -'@backstage/plugin-catalog-backend-module-github': patch -'@backstage/plugin-catalog-backend-module-gitlab': patch -'@backstage/plugin-events-backend-module-aws-sqs': patch -'@backstage/plugin-search-backend-module-catalog': patch -'@backstage/plugin-search-backend-module-explore': patch -'@backstage/plugin-catalog-backend-module-azure': patch '@backstage/plugin-catalog-unprocessed-entities': patch -'@backstage/plugin-events-backend-module-gerrit': patch -'@backstage/plugin-events-backend-module-github': patch -'@backstage/plugin-events-backend-module-gitlab': patch -'@backstage/plugin-catalog-backend-module-ldap': patch -'@backstage/plugin-events-backend-module-azure': patch 'techdocs-cli-embedded-app': patch -'@backstage/plugin-catalog-backend-module-aws': patch -'@backstage/plugin-catalog-backend-module-gcp': patch '@backstage/plugin-scaffolder-node-test-utils': patch '@backstage/plugin-techdocs-addons-test-utils': patch -'@backstage/plugin-events-backend-test-utils': patch -'@internal/plugin-todo-list-backend': patch 'app-next-example-plugin': patch '@internal/plugin-todo-list-common': patch -'@backstage/plugin-search-backend-module-pg': patch '@backstage/backend-openapi-utils': patch '@backstage/plugin-bitbucket-cloud-common': patch -'@backstage/plugin-notifications-backend': patch -'@backstage/plugin-user-settings-backend': patch '@backstage/frontend-plugin-api': patch '@backstage/frontend-test-utils': patch '@backstage/plugin-notifications-common': patch '@backstage/plugin-user-settings-common': patch '@backstage/backend-plugin-api': patch '@backstage/backend-test-utils': patch -'@backstage/plugin-search-backend-node': patch '@backstage/integration-react': patch -'@backstage/plugin-kubernetes-backend': patch '@backstage/plugin-kubernetes-cluster': patch '@backstage/plugin-notifications-node': patch -'@backstage/plugin-permission-backend': patch -'@backstage/plugin-scaffolder-backend': patch '@backstage/backend-defaults': patch '@backstage/frontend-app-api': patch '@internal/plugin-todo-list': patch @@ -102,21 +29,16 @@ '@backstage/core-compat-api': patch '@backstage/core-components': patch '@backstage/core-plugin-api': patch -'@backstage/plugin-devtools-backend': patch '@backstage/plugin-kubernetes-react': patch '@backstage/plugin-permission-react': patch '@backstage/plugin-scaffolder-react': patch -'@backstage/plugin-techdocs-backend': patch '@backstage/backend-common': patch -'example-backend-legacy': patch '@backstage/catalog-client': patch '@backstage/version-bridge': patch -'@backstage/plugin-catalog-backend': patch '@backstage/plugin-devtools-common': patch '@backstage/plugin-kubernetes-node': patch '@backstage/plugin-permission-node': patch '@backstage/plugin-scaffolder-node': patch -'@backstage/plugin-signals-backend': patch '@backstage/backend-tasks': patch '@backstage/catalog-model': patch '@backstage/config-loader': patch @@ -124,8 +46,6 @@ '@backstage/plugin-app-visualizer': patch '@backstage/plugin-catalog-common': patch '@backstage/plugin-catalog-import': patch -'@backstage/plugin-events-backend': patch -'@backstage/plugin-search-backend': patch '@backstage/plugin-techdocs-react': patch '@backstage/app-defaults': patch '@backstage/core-app-api': patch @@ -134,14 +54,12 @@ '@backstage/plugin-catalog-react': patch '@backstage/plugin-config-schema': patch '@backstage/plugin-notifications': patch -'@backstage/plugin-proxy-backend': patch '@backstage/plugin-search-common': patch '@backstage/plugin-signals-react': patch '@backstage/plugin-techdocs-node': patch '@backstage/plugin-user-settings': patch '@backstage/integration': patch 'yarn-plugin-backstage': patch -'@backstage/plugin-auth-backend': patch '@backstage/plugin-catalog-node': patch '@backstage/plugin-search-react': patch '@backstage/plugin-signals-node': patch @@ -149,7 +67,6 @@ '@backstage/create-app': patch '@backstage/repo-tools': patch '@backstage/test-utils': patch -'@backstage/plugin-app-backend': patch '@backstage/plugin-events-node': patch '@backstage/dev-utils': patch '@backstage/plugin-auth-react': patch @@ -162,7 +79,6 @@ 'e2e-test': patch '@backstage/plugin-auth-node': patch '@backstage/plugin-org-react': patch -'example-backend': patch '@backstage/plugin-api-docs': patch '@backstage/plugin-app-node': patch '@backstage/plugin-devtools': patch From 2c8532c322f8f2f630922f1f8fad8400ceeb389c Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Tue, 18 Jun 2024 22:36:08 -0400 Subject: [PATCH 027/217] more adjustments Signed-off-by: aramissennyeydd --- .changeset/early-sloths-cross.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/.changeset/early-sloths-cross.md b/.changeset/early-sloths-cross.md index 0fbf528a9c..60b5dc8e91 100644 --- a/.changeset/early-sloths-cross.md +++ b/.changeset/early-sloths-cross.md @@ -3,7 +3,6 @@ '@backstage/backend-dynamic-feature-service': patch '@backstage/plugin-techdocs-module-addons-contrib': patch '@backstage/plugin-catalog-unprocessed-entities': patch -'techdocs-cli-embedded-app': patch '@backstage/plugin-scaffolder-node-test-utils': patch '@backstage/plugin-techdocs-addons-test-utils': patch 'app-next-example-plugin': patch @@ -76,7 +75,6 @@ 'example-app-next': patch '@backstage/cli-node': patch '@backstage/codemods': patch -'e2e-test': patch '@backstage/plugin-auth-node': patch '@backstage/plugin-org-react': patch '@backstage/plugin-api-docs': patch From 9d8b440a81eae27c2502c8e3ef2cb202061c411a Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Tue, 18 Jun 2024 22:39:06 -0400 Subject: [PATCH 028/217] more fixes Signed-off-by: aramissennyeydd --- .changeset/early-sloths-cross.md | 47 -------------------------------- 1 file changed, 47 deletions(-) diff --git a/.changeset/early-sloths-cross.md b/.changeset/early-sloths-cross.md index 60b5dc8e91..e1d5a5180c 100644 --- a/.changeset/early-sloths-cross.md +++ b/.changeset/early-sloths-cross.md @@ -1,92 +1,45 @@ --- -'@backstage/plugin-catalog-unprocessed-entities-common': patch -'@backstage/backend-dynamic-feature-service': patch '@backstage/plugin-techdocs-module-addons-contrib': patch '@backstage/plugin-catalog-unprocessed-entities': patch '@backstage/plugin-scaffolder-node-test-utils': patch '@backstage/plugin-techdocs-addons-test-utils': patch -'app-next-example-plugin': patch -'@internal/plugin-todo-list-common': patch -'@backstage/backend-openapi-utils': patch -'@backstage/plugin-bitbucket-cloud-common': patch '@backstage/frontend-plugin-api': patch '@backstage/frontend-test-utils': patch -'@backstage/plugin-notifications-common': patch -'@backstage/plugin-user-settings-common': patch -'@backstage/backend-plugin-api': patch -'@backstage/backend-test-utils': patch '@backstage/integration-react': patch '@backstage/plugin-kubernetes-cluster': patch -'@backstage/plugin-notifications-node': patch -'@backstage/backend-defaults': patch '@backstage/frontend-app-api': patch '@internal/plugin-todo-list': patch -'@backstage/plugin-kubernetes-common': patch -'@backstage/plugin-permission-common': patch -'@backstage/plugin-scaffolder-common': patch -'@backstage/backend-app-api': patch '@backstage/core-compat-api': patch '@backstage/core-components': patch '@backstage/core-plugin-api': patch '@backstage/plugin-kubernetes-react': patch '@backstage/plugin-permission-react': patch '@backstage/plugin-scaffolder-react': patch -'@backstage/backend-common': patch -'@backstage/catalog-client': patch '@backstage/version-bridge': patch -'@backstage/plugin-devtools-common': patch -'@backstage/plugin-kubernetes-node': patch -'@backstage/plugin-permission-node': patch -'@backstage/plugin-scaffolder-node': patch -'@backstage/backend-tasks': patch -'@backstage/catalog-model': patch -'@backstage/config-loader': patch -'@backstage/eslint-plugin': patch '@backstage/plugin-app-visualizer': patch -'@backstage/plugin-catalog-common': patch '@backstage/plugin-catalog-import': patch '@backstage/plugin-techdocs-react': patch '@backstage/app-defaults': patch '@backstage/core-app-api': patch -'@techdocs/cli': patch '@backstage/plugin-catalog-graph': patch '@backstage/plugin-catalog-react': patch '@backstage/plugin-config-schema': patch '@backstage/plugin-notifications': patch -'@backstage/plugin-search-common': patch -'@backstage/plugin-signals-react': patch -'@backstage/plugin-techdocs-node': patch '@backstage/plugin-user-settings': patch -'@backstage/integration': patch -'yarn-plugin-backstage': patch -'@backstage/plugin-catalog-node': patch '@backstage/plugin-search-react': patch -'@backstage/plugin-signals-node': patch -'@backstage/cli-common': patch -'@backstage/create-app': patch -'@backstage/repo-tools': patch '@backstage/test-utils': patch -'@backstage/plugin-events-node': patch '@backstage/dev-utils': patch '@backstage/plugin-auth-react': patch '@backstage/plugin-home-react': patch '@backstage/plugin-kubernetes': patch '@backstage/plugin-scaffolder': patch -'example-app-next': patch -'@backstage/cli-node': patch -'@backstage/codemods': patch -'@backstage/plugin-auth-node': patch '@backstage/plugin-org-react': patch '@backstage/plugin-api-docs': patch -'@backstage/plugin-app-node': patch '@backstage/plugin-devtools': patch '@backstage/plugin-techdocs': patch '@backstage/plugin-catalog': patch -'@backstage/plugin-signals': patch '@backstage/theme': patch '@backstage/plugin-search': patch -'example-app': patch -'@backstage/cli': patch '@backstage/plugin-home': patch '@backstage/plugin-org': patch --- From df40a6792b28898fec2113c8e0ed426eec1ccbca Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Tue, 18 Jun 2024 22:39:26 -0400 Subject: [PATCH 029/217] and more Signed-off-by: aramissennyeydd --- .changeset/early-sloths-cross.md | 1 - 1 file changed, 1 deletion(-) diff --git a/.changeset/early-sloths-cross.md b/.changeset/early-sloths-cross.md index e1d5a5180c..9267b4012d 100644 --- a/.changeset/early-sloths-cross.md +++ b/.changeset/early-sloths-cross.md @@ -8,7 +8,6 @@ '@backstage/integration-react': patch '@backstage/plugin-kubernetes-cluster': patch '@backstage/frontend-app-api': patch -'@internal/plugin-todo-list': patch '@backstage/core-compat-api': patch '@backstage/core-components': patch '@backstage/core-plugin-api': patch From 7dfdeda9bf4b293cebe640cc9c113259e606d77e Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Tue, 18 Jun 2024 22:41:21 -0400 Subject: [PATCH 030/217] add missing package :) Signed-off-by: aramissennyeydd --- .changeset/early-sloths-cross.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.changeset/early-sloths-cross.md b/.changeset/early-sloths-cross.md index 9267b4012d..3e96057b8d 100644 --- a/.changeset/early-sloths-cross.md +++ b/.changeset/early-sloths-cross.md @@ -1,4 +1,5 @@ --- +'@backstage/plugin-api-docs-module-protoc-gen-doc': patch '@backstage/plugin-techdocs-module-addons-contrib': patch '@backstage/plugin-catalog-unprocessed-entities': patch '@backstage/plugin-scaffolder-node-test-utils': patch From e1c89ddd085d18eb11db2ff666bcb9ccbec653f3 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Tue, 18 Jun 2024 23:07:55 -0400 Subject: [PATCH 031/217] add react and react-router as dev dependencies Signed-off-by: aramissennyeydd --- packages/app-defaults/package.json | 14 ++++---- packages/core-app-api/package.json | 24 +++++++------- packages/core-compat-api/package.json | 14 ++++---- packages/core-components/package.json | 14 ++++---- packages/core-plugin-api/package.json | 15 ++++++++- packages/dev-utils/package.json | 15 +++++---- packages/frontend-app-api/package.json | 32 +++++++++++-------- packages/frontend-plugin-api/package.json | 14 ++++---- packages/frontend-test-utils/package.json | 14 ++++---- packages/integration-react/package.json | 14 ++++---- packages/test-utils/package.json | 14 ++++---- packages/theme/package.json | 14 ++++---- packages/version-bridge/package.json | 14 ++++---- .../package.json | 14 ++++---- plugins/api-docs/package.json | 14 ++++---- plugins/app-visualizer/package.json | 14 ++++---- plugins/auth-react/package.json | 12 ++++--- plugins/catalog-graph/package.json | 14 ++++---- plugins/catalog-import/package.json | 14 ++++---- plugins/catalog-react/package.json | 24 +++++++------- .../catalog-unprocessed-entities/package.json | 14 ++++---- plugins/catalog/package.json | 12 ++++--- plugins/config-schema/package.json | 14 ++++---- plugins/devtools/package.json | 20 ++++++------ plugins/example-todo-list/package.json | 14 ++++---- plugins/home-react/package.json | 14 ++++---- plugins/home/package.json | 14 ++++---- plugins/kubernetes-cluster/package.json | 14 ++++---- plugins/kubernetes-react/package.json | 22 +++++++------ plugins/kubernetes/package.json | 17 ++++++---- plugins/notifications/package.json | 14 ++++---- plugins/org-react/package.json | 14 ++++---- plugins/org/package.json | 14 ++++---- plugins/permission-react/package.json | 14 ++++---- plugins/scaffolder-react/package.json | 12 ++++--- plugins/scaffolder/package.json | 12 ++++--- plugins/search-react/package.json | 14 ++++---- plugins/search/package.json | 14 ++++---- .../techdocs-addons-test-utils/package.json | 14 ++++---- .../package.json | 14 ++++---- plugins/techdocs-react/package.json | 14 ++++---- plugins/techdocs/package.json | 14 ++++---- plugins/user-settings/package.json | 14 ++++---- 43 files changed, 377 insertions(+), 274 deletions(-) diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json index 0641cd7096..0dabc3d3e9 100644 --- a/packages/app-defaults/package.json +++ b/packages/app-defaults/package.json @@ -49,17 +49,19 @@ "@backstage/test-utils": "workspace:^", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", - "@types/react": "^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json index b5a173ce0d..c1adf50cd9 100644 --- a/packages/core-app-api/package.json +++ b/packages/core-app-api/package.json @@ -56,21 +56,12 @@ "i18next": "^22.4.15", "lodash": "^4.17.21", "prop-types": "^15.7.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-use": "^17.2.4", "zen-observable": "^0.10.0", "zod": "^3.22.4" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - }, - "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0 || ^18.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": { "@backstage/cli": "workspace:^", "@backstage/test-utils": "workspace:^", @@ -86,5 +77,16 @@ "react-router-dom-stable": "npm:react-router-dom@^6.3.0", "react-router-stable": "npm:react-router@^6.3.0" }, + "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "configSchema": "config.d.ts" } diff --git a/packages/core-compat-api/package.json b/packages/core-compat-api/package.json index 76e925bd34..d782afcc5d 100644 --- a/packages/core-compat-api/package.json +++ b/packages/core-compat-api/package.json @@ -49,16 +49,18 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "zod": "^3.22.4", - "@types/react": "^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/packages/core-components/package.json b/packages/core-components/package.json index 69ac146f1a..407e7e791a 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -115,12 +115,9 @@ "@types/zen-observable": "^0.8.0", "cross-fetch": "^4.0.0", "history": "^5.0.0", - "msw": "^1.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "msw": "^1.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", @@ -128,5 +125,10 @@ "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "configSchema": "config.d.ts" } diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json index 5f91bae603..4c51f60555 100644 --- a/packages/core-plugin-api/package.json +++ b/packages/core-plugin-api/package.json @@ -63,6 +63,19 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", - "@types/react": "^18.0.0" + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index 7a087657e8..5ca2e55a36 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -46,7 +46,6 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-use": "^17.2.4" }, "devDependencies": { @@ -56,16 +55,20 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", "zen-observable": "^0.10.0" }, + "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, "peerDependenciesMeta": { "@types/react": { "optional": true } - }, - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0", - "react-router-dom": "6.0.0-beta.0 || ^6.3.0" } } diff --git a/packages/frontend-app-api/package.json b/packages/frontend-app-api/package.json index e14867fecb..23639e0af7 100644 --- a/packages/frontend-app-api/package.json +++ b/packages/frontend-app-api/package.json @@ -41,24 +41,30 @@ "@backstage/types": "workspace:^", "@backstage/version-bridge": "workspace:^", "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", - "lodash": "^4.17.21", - "zod": "^3.22.4" + "zod": "^3.22.4", + "@material-ui/core": "^4.12.4", + "@material-ui/icons": "^4.11.3", + "lodash": "^4.17.21" + }, + "devDependencies": { + "@backstage/cli": "workspace:^", + "@backstage/test-utils": "workspace:^", + "@testing-library/jest-dom": "^6.0.0", + "@testing-library/react": "^15.0.0", + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" }, "peerDependenciesMeta": { "@types/react": { "optional": true } }, - "devDependencies": { - "@backstage/cli": "workspace:^", - "@backstage/plugin-app": "workspace:^", - "@backstage/test-utils": "workspace:^", - "@testing-library/jest-dom": "^6.0.0", - "@testing-library/react": "^16.0.0" - }, - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0 || ^18.0.0", - "react-router-dom": "6.0.0-beta.0 || ^6.3.0" - }, "configSchema": "config.d.ts" } diff --git a/packages/frontend-plugin-api/package.json b/packages/frontend-plugin-api/package.json index 0a64f9222c..3bcad42a9d 100644 --- a/packages/frontend-plugin-api/package.json +++ b/packages/frontend-plugin-api/package.json @@ -48,16 +48,18 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "history": "^5.3.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "history": "^5.3.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/packages/frontend-test-utils/package.json b/packages/frontend-test-utils/package.json index 0661c0df95..ab98e8d4e1 100644 --- a/packages/frontend-test-utils/package.json +++ b/packages/frontend-test-utils/package.json @@ -43,17 +43,19 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@testing-library/jest-dom": "^6.0.0", - "@types/react": "^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@testing-library/react": "^16.0.0", "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index c4e920cc91..98cf89bd24 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -47,17 +47,19 @@ "@testing-library/dom": "^10.0.0", "@testing-library/jest-dom": "^6.0.0", "@types/react": "^18.0.0", - "msw": "^1.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "msw": "^1.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 857652cb62..a99028fdf7 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -66,12 +66,9 @@ "@backstage/cli": "workspace:^", "@testing-library/jest-dom": "^6.0.0", "@types/react": "^18.0.0", - "msw": "^1.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "msw": "^1.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@testing-library/react": "^16.0.0", @@ -79,5 +76,10 @@ "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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/packages/theme/package.json b/packages/theme/package.json index 6d46e96ec0..e875ad7963 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -45,17 +45,19 @@ "@mui/styles": "^5.14.18", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", - "@types/react": "^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@material-ui/core": "^4.12.2", "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/packages/version-bridge/package.json b/packages/version-bridge/package.json index ce68394e6d..524b5545a0 100644 --- a/packages/version-bridge/package.json +++ b/packages/version-bridge/package.json @@ -39,17 +39,19 @@ "@backstage/cli": "workspace:^", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", - "@types/react": "^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/plugins/api-docs-module-protoc-gen-doc/package.json b/plugins/api-docs-module-protoc-gen-doc/package.json index 260491d620..e5877f468c 100644 --- a/plugins/api-docs-module-protoc-gen-doc/package.json +++ b/plugins/api-docs-module-protoc-gen-doc/package.json @@ -42,17 +42,19 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@testing-library/jest-dom": "^6.0.0", - "@types/react": "^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index 5da52d0bb2..3597f9468e 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -85,17 +85,19 @@ "@testing-library/user-event": "^14.0.0", "@types/highlightjs": "^10.1.0", "@types/react": "^18.0.0", - "@types/swagger-ui-react": "^4.18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@types/swagger-ui-react": "^4.18.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/plugins/app-visualizer/package.json b/plugins/app-visualizer/package.json index 945b6e3e76..6d4fd47661 100644 --- a/plugins/app-visualizer/package.json +++ b/plugins/app-visualizer/package.json @@ -42,17 +42,19 @@ }, "devDependencies": { "@backstage/cli": "workspace:^", - "@types/react": "^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/plugins/auth-react/package.json b/plugins/auth-react/package.json index 17923097dc..58c3f58e5b 100644 --- a/plugins/auth-react/package.json +++ b/plugins/auth-react/package.json @@ -51,15 +51,17 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", - "msw": "^1.0.0" + "msw": "^1.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "react": "^16.13.1 || ^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { "@types/react": { "optional": true } - }, - "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", - "react": "^16.13.1 || ^17.0.0 || ^18.0.0" } } diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index 2d26a57ab6..4f2161141f 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -76,17 +76,19 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", - "@types/react": "^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index bf0630b989..ca3175a46b 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -88,12 +88,9 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", - "msw": "^1.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "msw": "^1.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", @@ -101,5 +98,10 @@ "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "configSchema": "config.d.ts" } diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index 330c3ad191..eed14b2589 100644 --- a/plugins/catalog-react/package.json +++ b/plugins/catalog-react/package.json @@ -82,17 +82,6 @@ "yaml": "^2.0.0", "zen-observable": "^0.10.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - }, - "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0 || ^18.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": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", @@ -106,6 +95,19 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "@types/zen-observable": "^0.8.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-test-renderer": "^16.13.1" + }, + "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/plugins/catalog-unprocessed-entities/package.json b/plugins/catalog-unprocessed-entities/package.json index c019eee3fa..64f4441cb9 100644 --- a/plugins/catalog-unprocessed-entities/package.json +++ b/plugins/catalog-unprocessed-entities/package.json @@ -52,17 +52,19 @@ "@backstage/dev-utils": "workspace:^", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", - "@types/react": "^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index ffd0480f29..1247d14ca3 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -98,18 +98,20 @@ "@testing-library/user-event": "^14.0.0", "@types/pluralize": "^0.0.33", "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", "swr": "^2.2.5" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "configSchema": "config.d.ts" } diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json index 28e294ab3d..a7ddec3885 100644 --- a/plugins/config-schema/package.json +++ b/plugins/config-schema/package.json @@ -54,17 +54,19 @@ "@testing-library/dom": "^10.0.0", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", - "@types/react": "^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/plugins/devtools/package.json b/plugins/devtools/package.json index ee42a2943c..e20cda27eb 100644 --- a/plugins/devtools/package.json +++ b/plugins/devtools/package.json @@ -64,10 +64,13 @@ "react-json-view": "^1.21.3", "react-use": "^17.2.4" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "devDependencies": { + "@backstage/cli": "workspace:^", + "@backstage/dev-utils": "workspace:^", + "@testing-library/jest-dom": "^6.0.0", + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", @@ -75,10 +78,9 @@ "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, - "devDependencies": { - "@backstage/cli": "workspace:^", - "@backstage/dev-utils": "workspace:^", - "@testing-library/jest-dom": "^6.0.0", - "@types/react": "^18.0.0" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json index f24678ad0b..1190b29363 100644 --- a/plugins/example-todo-list/package.json +++ b/plugins/example-todo-list/package.json @@ -50,17 +50,19 @@ "@testing-library/dom": "^10.0.0", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", - "@types/react": "^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/plugins/home-react/package.json b/plugins/home-react/package.json index 16b806e172..1389386075 100644 --- a/plugins/home-react/package.json +++ b/plugins/home-react/package.json @@ -51,17 +51,19 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@types/react": "^18.0.0", - "@types/react-grid-layout": "^1.3.2" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@types/react-grid-layout": "^1.3.2", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/plugins/home/package.json b/plugins/home/package.json index f850720745..8a57f31bbe 100644 --- a/plugins/home/package.json +++ b/plugins/home/package.json @@ -90,12 +90,9 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", - "@types/react-grid-layout": "^1.3.2" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@types/react-grid-layout": "^1.3.2", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", @@ -103,5 +100,10 @@ "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "configSchema": "config.d.ts" } diff --git a/plugins/kubernetes-cluster/package.json b/plugins/kubernetes-cluster/package.json index 405231899b..d7054f33a7 100644 --- a/plugins/kubernetes-cluster/package.json +++ b/plugins/kubernetes-cluster/package.json @@ -65,17 +65,19 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/node": "^16.11.26", - "@types/react": "^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/plugins/kubernetes-react/package.json b/plugins/kubernetes-react/package.json index 7c5217424d..6231807ceb 100644 --- a/plugins/kubernetes-react/package.json +++ b/plugins/kubernetes-react/package.json @@ -63,15 +63,6 @@ "xterm-addon-attach": "^0.9.0", "xterm-addon-fit": "^0.8.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - }, - "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", - "react": "^16.13.1 || ^17.0.0 || ^18.0.0" - }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", @@ -80,7 +71,18 @@ "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", "jest-websocket-mock": "^2.5.0", - "msw": "^1.3.1" + "msw": "^1.3.1", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "react": "^16.13.1 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "configSchema": "config.d.ts" } diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index f24b695964..fb653cbc62 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -79,24 +79,27 @@ "xterm-addon-attach": "^0.9.0", "xterm-addon-fit": "^0.8.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", "@testing-library/dom": "^10.0.0", "@testing-library/jest-dom": "^6.0.0", - "@testing-library/react": "^16.0.0" + "@testing-library/react": "^16.0.0", + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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", "@testing-library/react": "^16.0.0", - "@types/react": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/plugins/notifications/package.json b/plugins/notifications/package.json index b96f06c3a1..e3acc0d667 100644 --- a/plugins/notifications/package.json +++ b/plugins/notifications/package.json @@ -64,16 +64,18 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", - "msw": "^1.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "msw": "^1.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json index 376b3b9784..3685e78ff8 100644 --- a/plugins/org-react/package.json +++ b/plugins/org-react/package.json @@ -58,17 +58,19 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", - "@types/react": "^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/plugins/org/package.json b/plugins/org/package.json index 22e1dca1a2..a02533a455 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -81,17 +81,19 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", - "@types/react": "^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/plugins/permission-react/package.json b/plugins/permission-react/package.json index 29ebe15125..3dbed0beaa 100644 --- a/plugins/permission-react/package.json +++ b/plugins/permission-react/package.json @@ -52,17 +52,19 @@ "@backstage/test-utils": "workspace:^", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", - "@types/react": "^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index 50e37f36a2..ed1a587100 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -107,17 +107,19 @@ "@types/humanize-duration": "^3.18.1", "@types/luxon": "^3.0.0", "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", "swr": "^2.0.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index cd7616ea43..e708cd6f89 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -121,17 +121,19 @@ "@types/react-window": "^1.8.8", "@types/react": "^18.0.0", "msw": "^1.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", "swr": "^2.0.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json index 5b8d478320..b5bd4f2b27 100644 --- a/plugins/search-react/package.json +++ b/plugins/search-react/package.json @@ -80,17 +80,19 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", - "@types/react": "^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/plugins/search/package.json b/plugins/search/package.json index ce733d7a8b..f7516ccee0 100644 --- a/plugins/search/package.json +++ b/plugins/search/package.json @@ -83,12 +83,9 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", - "history": "^5.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "history": "^5.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", @@ -96,5 +93,10 @@ "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "configSchema": "config.d.ts" } diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index 986cbf0d55..14693e104e 100644 --- a/plugins/techdocs-addons-test-utils/package.json +++ b/plugins/techdocs-addons-test-utils/package.json @@ -55,12 +55,9 @@ "@backstage/cli": "workspace:^", "@testing-library/dom": "^10.0.0", "@testing-library/jest-dom": "^6.0.0", - "@types/react": "^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@testing-library/react": "^16.0.0", @@ -68,5 +65,10 @@ "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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index 4551e95c2b..b2fb21e930 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -57,17 +57,19 @@ "@testing-library/dom": "^10.0.0", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", - "@types/react": "^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json index af5e0c7377..7e28a64e9d 100644 --- a/plugins/techdocs-react/package.json +++ b/plugins/techdocs-react/package.json @@ -63,17 +63,19 @@ "@backstage/theme": "workspace:^", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", - "@types/react": "^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index bde33b3c1e..365cae46ad 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -100,12 +100,9 @@ "@types/dompurify": "^3.0.0", "@types/event-source-polyfill": "^1.0.0", "@types/react": "^18.0.0", - "canvas": "^2.10.2" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "canvas": "^2.10.2", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", @@ -113,5 +110,10 @@ "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "configSchema": "config.d.ts" } diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index beab130693..1b7797c03c 100644 --- a/plugins/user-settings/package.json +++ b/plugins/user-settings/package.json @@ -82,12 +82,9 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", - "msw": "^1.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "msw": "^1.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", @@ -95,6 +92,11 @@ "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "configSchema": { "$schema": "https://backstage.io/schema/config-v1", "title": "@backstage/user-settings", From 6bc061b0ff5507a0053c2e7e1a14a592e4b81b4b Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Tue, 18 Jun 2024 23:22:11 -0400 Subject: [PATCH 032/217] skip react in type dep check Signed-off-by: aramissennyeydd --- packages/repo-tools/src/commands/type-deps/type-deps.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/repo-tools/src/commands/type-deps/type-deps.ts b/packages/repo-tools/src/commands/type-deps/type-deps.ts index 7b75ac37ee..877228a238 100644 --- a/packages/repo-tools/src/commands/type-deps/type-deps.ts +++ b/packages/repo-tools/src/commands/type-deps/type-deps.ts @@ -202,6 +202,14 @@ function findTypeDepErrors(typeDeps: string[], pkg: Package) { } for (const dep of deps) { + // Allow implicit declarations of these dependencies. For some packages, they may + // not be declared as a `reference types="..."` or `import ... from '@types/...' + // in the declaration file. + // Example being app-visualizer, it exports a plugin which comes from `@backstage/frontend-plugin-api`, + // the react types come from that package, but are not explicitly declared in the declaration file. + if (['@types/react'].includes(dep)) { + continue; + } errors.push( mkErr('WrongDepError', `Should be dev dep ${dep}`, { dep, From 264f5379776c36570f2a1485d532d11b38bd2406 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Wed, 19 Jun 2024 00:11:02 -0400 Subject: [PATCH 033/217] add linting for peer deps Signed-off-by: aramissennyeydd --- .github/workflows/ci.yml | 3 + package.json | 1 + packages/app-defaults/package.json | 3 +- packages/app-next-example-plugin/package.json | 12 +- packages/core-app-api/package.json | 7 +- packages/core-compat-api/package.json | 6 +- packages/core-components/package.json | 3 +- packages/core-plugin-api/package.json | 3 +- packages/dev-utils/package.json | 1 + packages/frontend-app-api/package.json | 9 +- packages/frontend-plugin-api/package.json | 4 +- packages/frontend-test-utils/package.json | 4 +- packages/integration-react/package.json | 3 +- packages/repo-tools/src/commands/index.ts | 8 + .../src/commands/peer-deps/peer-deps.ts | 203 ++++++++ packages/test-utils/package.json | 3 +- packages/theme/package.json | 6 +- packages/version-bridge/package.json | 3 +- .../package.json | 3 +- plugins/api-docs/package.json | 3 +- plugins/app-visualizer/package.json | 3 +- plugins/auth-react/package.json | 7 +- plugins/catalog-graph/package.json | 3 +- plugins/catalog-import/package.json | 3 +- plugins/catalog-react/package.json | 1 + .../catalog-unprocessed-entities/package.json | 3 +- plugins/catalog/package.json | 1 + plugins/config-schema/package.json | 3 +- plugins/devtools/package.json | 3 +- plugins/example-todo-list/package.json | 3 +- plugins/home-react/package.json | 3 +- plugins/home/package.json | 3 +- plugins/kubernetes-cluster/package.json | 3 +- plugins/kubernetes-react/package.json | 7 +- plugins/kubernetes/package.json | 7 +- plugins/notifications/package.json | 6 +- plugins/org-react/package.json | 3 +- plugins/org/package.json | 3 +- plugins/permission-react/package.json | 3 +- plugins/scaffolder-react/package.json | 1 + plugins/scaffolder/package.json | 3 +- plugins/search-react/package.json | 3 +- plugins/search/package.json | 3 +- plugins/signals-react/package.json | 16 +- plugins/signals/package.json | 16 +- .../techdocs-addons-test-utils/package.json | 3 +- .../package.json | 3 +- plugins/techdocs-react/package.json | 3 +- plugins/techdocs/package.json | 3 +- plugins/user-settings/package.json | 3 +- yarn.lock | 470 ++++++++++++++++-- 51 files changed, 774 insertions(+), 109 deletions(-) create mode 100644 packages/repo-tools/src/commands/peer-deps/peer-deps.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 18a401d479..2a94c6f857 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -90,6 +90,9 @@ jobs: - name: verify local dependency ranges run: node scripts/verify-local-dependencies.js + - name: verify peer dependency ranges + run: yarn lint:peer-deps + - name: check for missing repo fixes run: yarn fix --check diff --git a/package.json b/package.json index 72f7113331..a00c7fd721 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "lint": "backstage-cli repo lint --since origin/master", "lint:all": "backstage-cli repo lint", "lint:docs": "node ./scripts/check-docs-quality", + "lint:peer-deps": "backstage-repo-tools peer-deps", "lint:type-deps": "backstage-repo-tools type-deps", "new": "backstage-cli new --scope backstage --baseVersion 0.0.0 --no-private", "prepare": "husky", diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json index 0dabc3d3e9..5865cb3f43 100644 --- a/packages/app-defaults/package.json +++ b/packages/app-defaults/package.json @@ -51,7 +51,8 @@ "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/packages/app-next-example-plugin/package.json b/packages/app-next-example-plugin/package.json index 4f3342c100..dc477e31ec 100644 --- a/packages/app-next-example-plugin/package.json +++ b/packages/app-next-example-plugin/package.json @@ -47,12 +47,22 @@ }, "devDependencies": { "@backstage/cli": "workspace:^", + "@types/react": "^18.0.0", "cross-fetch": "^4.0.0", - "msw": "^1.0.0" + "msw": "^1.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json index c1adf50cd9..d1c9f0a053 100644 --- a/packages/core-app-api/package.json +++ b/packages/core-app-api/package.json @@ -51,13 +51,10 @@ "@backstage/types": "workspace:^", "@backstage/version-bridge": "workspace:^", "@types/prop-types": "^15.7.3", - "@types/react": "^18.0.0", "history": "^5.0.0", "i18next": "^22.4.15", "lodash": "^4.17.21", "prop-types": "^15.7.2", - "react": "^18.0.0", - "react-dom": "^18.0.0", "react-use": "^17.2.4", "zen-observable": "^0.10.0", "zod": "^3.22.4" @@ -70,9 +67,13 @@ "@testing-library/react": "^16.0.0", "@testing-library/react-hooks": "^8.0.0", "@testing-library/user-event": "^14.0.0", + "@types/react": "^18.0.0", "@types/zen-observable": "^0.8.0", "msw": "^1.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-beta": "npm:react-router@6.0.0-beta.0", + "react-router-dom": "^6.3.0", "react-router-dom-beta": "npm:react-router-dom@6.0.0-beta.0", "react-router-dom-stable": "npm:react-router-dom@^6.3.0", "react-router-stable": "npm:react-router@^6.3.0" diff --git a/packages/core-compat-api/package.json b/packages/core-compat-api/package.json index d782afcc5d..d7f4848c4a 100644 --- a/packages/core-compat-api/package.json +++ b/packages/core-compat-api/package.json @@ -48,14 +48,16 @@ "@oriflame/backstage-plugin-score-card": "^0.8.0", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", - "zod": "^3.22.4", "@types/react": "^18.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0", + "zod": "^3.22.4" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" }, "peerDependenciesMeta": { diff --git a/packages/core-components/package.json b/packages/core-components/package.json index 407e7e791a..fc9ebc30e5 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -117,7 +117,8 @@ "history": "^5.0.0", "msw": "^1.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json index 4c51f60555..e9e46a8064 100644 --- a/packages/core-plugin-api/package.json +++ b/packages/core-plugin-api/package.json @@ -65,7 +65,8 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index 5ca2e55a36..d8fa50b1ee 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -58,6 +58,7 @@ "@types/react": "^18.0.0", "react": "^18.0.0", "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0", "zen-observable": "^0.10.0" }, "peerDependencies": { diff --git a/packages/frontend-app-api/package.json b/packages/frontend-app-api/package.json index 23639e0af7..26473d0dea 100644 --- a/packages/frontend-app-api/package.json +++ b/packages/frontend-app-api/package.json @@ -40,11 +40,11 @@ "@backstage/frontend-plugin-api": "workspace:^", "@backstage/types": "workspace:^", "@backstage/version-bridge": "workspace:^", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", - "zod": "^3.22.4", "@material-ui/core": "^4.12.4", "@material-ui/icons": "^4.11.3", - "lodash": "^4.17.21" + "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "lodash": "^4.17.21", + "zod": "^3.22.4" }, "devDependencies": { "@backstage/cli": "workspace:^", @@ -53,7 +53,8 @@ "@testing-library/react": "^15.0.0", "@types/react": "^18.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/packages/frontend-plugin-api/package.json b/packages/frontend-plugin-api/package.json index 3bcad42a9d..43509a6132 100644 --- a/packages/frontend-plugin-api/package.json +++ b/packages/frontend-plugin-api/package.json @@ -50,11 +50,13 @@ "@types/react": "^18.0.0", "history": "^5.3.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" }, "peerDependenciesMeta": { diff --git a/packages/frontend-test-utils/package.json b/packages/frontend-test-utils/package.json index ab98e8d4e1..7ebf1eb4f0 100644 --- a/packages/frontend-test-utils/package.json +++ b/packages/frontend-test-utils/package.json @@ -45,12 +45,14 @@ "@testing-library/jest-dom": "^6.0.0", "@types/react": "^18.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@testing-library/react": "^16.0.0", "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" }, "peerDependenciesMeta": { diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index 98cf89bd24..f426ec4a01 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -49,7 +49,8 @@ "@types/react": "^18.0.0", "msw": "^1.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/packages/repo-tools/src/commands/index.ts b/packages/repo-tools/src/commands/index.ts index 5116326eea..5a69a74ff3 100644 --- a/packages/repo-tools/src/commands/index.ts +++ b/packages/repo-tools/src/commands/index.ts @@ -224,6 +224,14 @@ export function registerCommands(program: Command) { .description('Find inconsistencies in types of all packages and plugins') .action(lazy(() => import('./type-deps/type-deps').then(m => m.default))); + program + .command('peer-deps') + .description( + 'Ensure your packages are using the correct peer dependency format.', + ) + .option('--fix', 'Fix the issues found') + .action(lazy(() => import('./peer-deps/peer-deps').then(m => m.default))); + program .command('generate-catalog-info') .option( diff --git a/packages/repo-tools/src/commands/peer-deps/peer-deps.ts b/packages/repo-tools/src/commands/peer-deps/peer-deps.ts new file mode 100644 index 0000000000..9544b3b457 --- /dev/null +++ b/packages/repo-tools/src/commands/peer-deps/peer-deps.ts @@ -0,0 +1,203 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { resolve as resolvePath } from 'path'; +import { getPackages, Package } from '@manypkg/get-packages'; +import { writeFileSync } from 'fs'; + +type ExtendedPackageJSON = Package['packageJson'] & { + peerDependenciesMeta?: Record; + backstage?: { + role: string; + }; +}; + +const desiredLocalVersionsOfDependencies = { + '@types/react': '^18.0.0', + react: '^18.0.0', + 'react-dom': '^18.0.0', + 'react-router-dom': '^6.3.0', +}; + +const peerDependencies = { + '@types/react': '^16.13.1 || ^17.0.0 || ^18.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', +}; + +const groupsOfPeerDependencies = [['@types/react', 'react', 'react-dom']]; + +const optionalPeerDependencies = new Set(['@types/react']); + +const isOptional = (dep: string) => { + return optionalPeerDependencies.has(dep); +}; + +const isMarkedAsOptional = (dep: string, packageJson: ExtendedPackageJSON) => { + return packageJson.peerDependenciesMeta?.[dep]?.optional; +}; + +const isDevDependency = (dep: string, packageJson: ExtendedPackageJSON) => { + return !!packageJson.devDependencies?.[dep]; +}; + +const isPeerDependency = (dep: string, packageJson: ExtendedPackageJSON) => { + return !!packageJson.peerDependencies?.[dep]; +}; + +const isStandaloneApplication = (packageJson: ExtendedPackageJSON) => { + return ['cli', 'frontend', 'backend'].includes( + packageJson.backstage?.role || '', + ); +}; + +const matchesPeerDependency = ( + dep: string, + packageJson: ExtendedPackageJSON, +) => { + return ( + packageJson.peerDependencies && + packageJson.peerDependencies[dep] === + peerDependencies[dep as keyof typeof peerDependencies] + ); +}; + +export default async ({ fix }: { fix: boolean }) => { + let failed = false; + const attemptToApplyFix = (fn: () => void) => { + if (fix) { + fn(); + } else { + failed = true; + } + }; + const { packages } = await getPackages(resolvePath('.')); + + const packagesWithRelevantDependencies = []; + + for (const pkg of packages) { + if (isStandaloneApplication(pkg.packageJson as ExtendedPackageJSON)) { + // Standalone applications are not expected to have peer dependencies. + continue; + } + + const dependencies = { + ...pkg.packageJson.dependencies, + ...pkg.packageJson.devDependencies, + ...pkg.packageJson.peerDependencies, + }; + for (const dep in peerDependencies) { + // Check against all packages that use dependencies that are in the peerDependencies list. + if (dependencies?.[dep]) { + packagesWithRelevantDependencies.push(pkg); + break; + } + } + } + + for (const pkg of packagesWithRelevantDependencies) { + const packageJson = pkg.packageJson as ExtendedPackageJSON; + for (const dep of Object.keys(peerDependencies)) { + // Validate that the peer dependencies are present. + if (isPeerDependency(dep, packageJson)) { + if (isOptional(dep) && !isMarkedAsOptional(dep, packageJson)) { + console.error( + `Optional peer dependency ${dep} in ${pkg.packageJson.name} is not marked as optional`, + ); + attemptToApplyFix(() => { + packageJson.peerDependenciesMeta = + packageJson.peerDependenciesMeta || {}; + packageJson.peerDependenciesMeta[dep] = { optional: true }; + }); + } else if (!isOptional(dep) && isMarkedAsOptional(dep, packageJson)) { + console.error( + `Peer dependency ${dep} in ${pkg.packageJson.name} is marked as optional but should not be`, + ); + attemptToApplyFix(() => { + packageJson.peerDependenciesMeta = + packageJson.peerDependenciesMeta || {}; + delete packageJson.peerDependenciesMeta[dep]; + }); + } + if (!isDevDependency(dep, packageJson)) { + console.error( + `Peer dependency ${dep} in ${pkg.packageJson.name} is not listed as a devDependency`, + ); + attemptToApplyFix(() => { + packageJson.devDependencies = packageJson.devDependencies || {}; + packageJson.devDependencies[dep] = + desiredLocalVersionsOfDependencies[ + dep as keyof typeof desiredLocalVersionsOfDependencies + ]; + }); + } + + const groups = groupsOfPeerDependencies.filter(group => + group.includes(dep), + ); + if (groups.length) { + for (const group of groups) { + for (const groupDep of group) { + if (!isPeerDependency(groupDep, packageJson)) { + console.error( + `Peer dependency ${groupDep} in ${pkg.packageJson.name} is missing`, + ); + attemptToApplyFix(() => { + packageJson.peerDependencies = + packageJson.peerDependencies || {}; + packageJson.peerDependencies[groupDep] = + peerDependencies[groupDep as keyof typeof peerDependencies]; + }); + } + } + } + } + + if (!matchesPeerDependency(dep, packageJson)) { + console.error( + `Incorrect peer dependency ${dep} in ${pkg.packageJson.name}`, + ); + attemptToApplyFix(() => { + packageJson.peerDependencies = packageJson.peerDependencies || {}; + packageJson.peerDependencies[dep] = + peerDependencies[dep as keyof typeof peerDependencies]; + }); + } + } else { + console.error( + `Missing peer dependency ${dep} in ${pkg.packageJson.name}`, + ); + attemptToApplyFix(() => { + packageJson.peerDependencies = packageJson.peerDependencies || {}; + packageJson.peerDependencies[dep] = + peerDependencies[dep as keyof typeof peerDependencies]; + }); + } + } + if (fix) { + writeFileSync( + resolvePath(pkg.dir, 'package.json'), + JSON.stringify(packageJson, null, 4), + ); + } + } + + if (failed) { + console.error('Some packages have incorrect peer dependencies'); + process.exit(1); + } +}; diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index a99028fdf7..dc2713ff09 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -68,7 +68,8 @@ "@types/react": "^18.0.0", "msw": "^1.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@testing-library/react": "^16.0.0", diff --git a/packages/theme/package.json b/packages/theme/package.json index e875ad7963..435f517326 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -47,13 +47,15 @@ "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@material-ui/core": "^4.12.2", "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react": "^16.13.1 || ^17.0.0 || ^18.0.0", - "react-dom": "^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" }, "peerDependenciesMeta": { "@types/react": { diff --git a/packages/version-bridge/package.json b/packages/version-bridge/package.json index 524b5545a0..50a5883b15 100644 --- a/packages/version-bridge/package.json +++ b/packages/version-bridge/package.json @@ -41,7 +41,8 @@ "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/plugins/api-docs-module-protoc-gen-doc/package.json b/plugins/api-docs-module-protoc-gen-doc/package.json index e5877f468c..f41fe2f9fb 100644 --- a/plugins/api-docs-module-protoc-gen-doc/package.json +++ b/plugins/api-docs-module-protoc-gen-doc/package.json @@ -44,7 +44,8 @@ "@testing-library/jest-dom": "^6.0.0", "@types/react": "^18.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index 3597f9468e..f9888ed99c 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -87,7 +87,8 @@ "@types/react": "^18.0.0", "@types/swagger-ui-react": "^4.18.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/plugins/app-visualizer/package.json b/plugins/app-visualizer/package.json index 6d4fd47661..53720d560a 100644 --- a/plugins/app-visualizer/package.json +++ b/plugins/app-visualizer/package.json @@ -44,7 +44,8 @@ "@backstage/cli": "workspace:^", "@types/react": "^18.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/plugins/auth-react/package.json b/plugins/auth-react/package.json index 58c3f58e5b..995d9adecf 100644 --- a/plugins/auth-react/package.json +++ b/plugins/auth-react/package.json @@ -53,11 +53,14 @@ "@types/react": "^18.0.0", "msw": "^1.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", - "react": "^16.13.1 || ^17.0.0 || ^18.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" }, "peerDependenciesMeta": { "@types/react": { diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index 4f2161141f..e6e4b5651d 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -78,7 +78,8 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index ca3175a46b..1dbfac3179 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -90,7 +90,8 @@ "@types/react": "^18.0.0", "msw": "^1.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index eed14b2589..5d8d0e7da6 100644 --- a/plugins/catalog-react/package.json +++ b/plugins/catalog-react/package.json @@ -97,6 +97,7 @@ "@types/zen-observable": "^0.8.0", "react": "^18.0.0", "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0", "react-test-renderer": "^16.13.1" }, "peerDependencies": { diff --git a/plugins/catalog-unprocessed-entities/package.json b/plugins/catalog-unprocessed-entities/package.json index 64f4441cb9..a0e652bc03 100644 --- a/plugins/catalog-unprocessed-entities/package.json +++ b/plugins/catalog-unprocessed-entities/package.json @@ -54,7 +54,8 @@ "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index 1247d14ca3..2b8e0484b7 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -100,6 +100,7 @@ "@types/react": "^18.0.0", "react": "^18.0.0", "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0", "swr": "^2.2.5" }, "peerDependencies": { diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json index a7ddec3885..643f7ac765 100644 --- a/plugins/config-schema/package.json +++ b/plugins/config-schema/package.json @@ -56,7 +56,8 @@ "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/plugins/devtools/package.json b/plugins/devtools/package.json index e20cda27eb..62a838f8fa 100644 --- a/plugins/devtools/package.json +++ b/plugins/devtools/package.json @@ -70,7 +70,8 @@ "@testing-library/jest-dom": "^6.0.0", "@types/react": "^18.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json index 1190b29363..4776fc2553 100644 --- a/plugins/example-todo-list/package.json +++ b/plugins/example-todo-list/package.json @@ -52,7 +52,8 @@ "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/plugins/home-react/package.json b/plugins/home-react/package.json index 1389386075..0a3edf65d4 100644 --- a/plugins/home-react/package.json +++ b/plugins/home-react/package.json @@ -53,7 +53,8 @@ "@types/react": "^18.0.0", "@types/react-grid-layout": "^1.3.2", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/plugins/home/package.json b/plugins/home/package.json index 8a57f31bbe..8dc5bc3b68 100644 --- a/plugins/home/package.json +++ b/plugins/home/package.json @@ -92,7 +92,8 @@ "@types/react": "^18.0.0", "@types/react-grid-layout": "^1.3.2", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/plugins/kubernetes-cluster/package.json b/plugins/kubernetes-cluster/package.json index d7054f33a7..21087fd0b7 100644 --- a/plugins/kubernetes-cluster/package.json +++ b/plugins/kubernetes-cluster/package.json @@ -67,7 +67,8 @@ "@types/node": "^16.11.26", "@types/react": "^18.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/plugins/kubernetes-react/package.json b/plugins/kubernetes-react/package.json index 6231807ceb..879507fbe4 100644 --- a/plugins/kubernetes-react/package.json +++ b/plugins/kubernetes-react/package.json @@ -73,11 +73,14 @@ "jest-websocket-mock": "^2.5.0", "msw": "^1.3.1", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", - "react": "^16.13.1 || ^17.0.0 || ^18.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" }, "peerDependenciesMeta": { "@types/react": { diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index fb653cbc62..940054aa65 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -88,14 +88,15 @@ "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { + "@testing-library/react": "^16.0.0", "@types/react": "^16.13.1 || ^17.0.0 || ^18.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", - "@testing-library/react": "^16.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "peerDependenciesMeta": { "@types/react": { diff --git a/plugins/notifications/package.json b/plugins/notifications/package.json index e3acc0d667..aafdf2476e 100644 --- a/plugins/notifications/package.json +++ b/plugins/notifications/package.json @@ -66,11 +66,13 @@ "@types/react": "^18.0.0", "msw": "^1.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", - "react": "^16.13.1 || ^17.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" }, "peerDependenciesMeta": { diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json index 3685e78ff8..e31864e158 100644 --- a/plugins/org-react/package.json +++ b/plugins/org-react/package.json @@ -60,7 +60,8 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/plugins/org/package.json b/plugins/org/package.json index a02533a455..cae8a2d11a 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -83,7 +83,8 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/plugins/permission-react/package.json b/plugins/permission-react/package.json index 3dbed0beaa..65732d8c89 100644 --- a/plugins/permission-react/package.json +++ b/plugins/permission-react/package.json @@ -54,7 +54,8 @@ "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index ed1a587100..f3e8eccdbb 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -109,6 +109,7 @@ "@types/react": "^18.0.0", "react": "^18.0.0", "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0", "swr": "^2.0.0" }, "peerDependencies": { diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index e708cd6f89..e69cf0e223 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -117,12 +117,13 @@ "@testing-library/user-event": "^14.0.0", "@types/humanize-duration": "^3.18.1", "@types/json-schema": "^7.0.9", + "@types/react": "^18.0.0", "@types/react-resizable": "^3.0.8", "@types/react-window": "^1.8.8", - "@types/react": "^18.0.0", "msw": "^1.0.0", "react": "^18.0.0", "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0", "swr": "^2.0.0" }, "peerDependencies": { diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json index b5bd4f2b27..6df72cee7d 100644 --- a/plugins/search-react/package.json +++ b/plugins/search-react/package.json @@ -82,7 +82,8 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/plugins/search/package.json b/plugins/search/package.json index f7516ccee0..dba2742ca2 100644 --- a/plugins/search/package.json +++ b/plugins/search/package.json @@ -85,7 +85,8 @@ "@types/react": "^18.0.0", "history": "^5.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/plugins/signals-react/package.json b/plugins/signals-react/package.json index 96a54b3fed..dad70cff02 100644 --- a/plugins/signals-react/package.json +++ b/plugins/signals-react/package.json @@ -47,9 +47,21 @@ "@backstage/cli": "workspace:^", "@backstage/test-utils": "workspace:^", "@testing-library/jest-dom": "^6.0.0", - "@testing-library/react": "^16.0.0" + "@testing-library/react": "^16.0.0", + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/plugins/signals/package.json b/plugins/signals/package.json index 471aecc4eb..f87647d356 100644 --- a/plugins/signals/package.json +++ b/plugins/signals/package.json @@ -57,10 +57,22 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", + "@types/react": "^18.0.0", "jest-websocket-mock": "^2.5.0", - "msw": "^1.0.0" + "msw": "^1.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index 14693e104e..4984bbdced 100644 --- a/plugins/techdocs-addons-test-utils/package.json +++ b/plugins/techdocs-addons-test-utils/package.json @@ -57,7 +57,8 @@ "@testing-library/jest-dom": "^6.0.0", "@types/react": "^18.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@testing-library/react": "^16.0.0", diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index b2fb21e930..59976dde8c 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -59,7 +59,8 @@ "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json index 7e28a64e9d..73cab1645e 100644 --- a/plugins/techdocs-react/package.json +++ b/plugins/techdocs-react/package.json @@ -65,7 +65,8 @@ "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index 365cae46ad..dec637779c 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -102,7 +102,8 @@ "@types/react": "^18.0.0", "canvas": "^2.10.2", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index 1b7797c03c..ee79710815 100644 --- a/plugins/user-settings/package.json +++ b/plugins/user-settings/package.json @@ -84,7 +84,8 @@ "@types/react": "^18.0.0", "msw": "^1.0.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/yarn.lock b/yarn.lock index 57d2d1539c..f449544643 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3451,11 +3451,18 @@ __metadata: "@material-ui/icons": ^4.9.1 "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 - "@types/react": ^16.13.1 || ^17.0.0 + "@types/react": ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4121,14 +4128,17 @@ __metadata: "@testing-library/react-hooks": ^8.0.0 "@testing-library/user-event": ^14.0.0 "@types/prop-types": ^15.7.3 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 "@types/zen-observable": ^0.8.0 history: ^5.0.0 i18next: ^22.4.15 lodash: ^4.17.21 msw: ^1.0.0 prop-types: ^15.7.2 + react: ^18.0.0 + react-dom: ^18.0.0 react-router-beta: "npm:react-router@6.0.0-beta.0" + react-router-dom: ^6.3.0 react-router-dom-beta: "npm:react-router-dom@6.0.0-beta.0" react-router-dom-stable: "npm:react-router-dom@^6.3.0" react-router-stable: "npm:react-router@^6.3.0" @@ -4136,9 +4146,13 @@ __metadata: zen-observable: ^0.10.0 zod: ^3.22.4 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4177,12 +4191,19 @@ __metadata: "@oriflame/backstage-plugin-score-card": ^0.8.0 "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 - "@types/react": ^16.13.1 || ^17.0.0 - lodash: ^4.17.21 + "@types/react": ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 zod: ^3.22.4 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4365,7 +4386,7 @@ __metadata: "@types/d3-zoom": ^3.0.1 "@types/dagre": ^0.7.44 "@types/google-protobuf": ^3.7.2 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 "@types/react-helmet": ^6.1.0 "@types/react-sparklines": ^1.7.0 "@types/react-syntax-highlighter": ^15.0.0 @@ -4387,10 +4408,13 @@ __metadata: pluralize: ^8.0.0 qs: ^6.9.4 rc-progress: 3.5.1 + react: ^18.0.0 + react-dom: ^18.0.0 react-helmet: 6.1.0 react-hook-form: ^7.12.2 react-idle-timer: 5.7.2 react-markdown: ^8.0.0 + react-router-dom: ^6.3.0 react-sparklines: ^1.7.0 react-syntax-highlighter: ^15.4.5 react-use: ^17.3.2 @@ -4400,9 +4424,13 @@ __metadata: zen-observable: ^0.10.0 zod: ^3.22.4 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4439,12 +4467,19 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@testing-library/user-event": ^14.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 history: ^5.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4495,13 +4530,20 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@testing-library/user-event": ^14.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 react-use: ^17.2.4 zen-observable: ^0.10.0 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4555,18 +4597,27 @@ __metadata: "@backstage/errors": "workspace:^" "@backstage/frontend-defaults": "workspace:^" "@backstage/frontend-plugin-api": "workspace:^" - "@backstage/plugin-app": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/types": "workspace:^" "@backstage/version-bridge": "workspace:^" + "@material-ui/core": ^4.12.4 + "@material-ui/icons": ^4.11.3 "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^16.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@testing-library/react": ^15.0.0 + "@types/react": ^18.0.0 lodash: ^4.17.21 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 zod: ^3.22.4 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4626,14 +4677,22 @@ __metadata: "@material-ui/core": ^4.12.4 "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 history: ^5.3.0 lodash: ^4.17.21 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 zod: ^3.22.4 zod-to-json-schema: ^3.21.4 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4650,12 +4709,20 @@ __metadata: "@backstage/types": "workspace:^" "@backstage/version-bridge": "workspace:^" "@testing-library/jest-dom": ^6.0.0 - "@types/react": "*" + "@types/react": ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 zod: ^3.22.4 peerDependencies: "@testing-library/react": ^16.0.0 + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4711,12 +4778,19 @@ __metadata: "@material-ui/icons": ^4.9.1 "@testing-library/dom": ^10.0.0 "@testing-library/jest-dom": ^6.0.0 - "@types/react": ^16.13.1 || ^17.0.0 + "@types/react": ^18.0.0 msw: ^1.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4746,12 +4820,19 @@ __metadata: dependencies: "@backstage/cli": "workspace:^" "@testing-library/jest-dom": ^6.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 grpc-docs: ^1.1.2 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4782,18 +4863,25 @@ __metadata: "@testing-library/react": ^16.0.0 "@testing-library/user-event": ^14.0.0 "@types/highlightjs": ^10.1.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 "@types/swagger-ui-react": ^4.18.0 graphiql: 3.1.1 graphql: ^16.0.0 graphql-config: ^5.0.2 graphql-ws: ^5.4.1 isomorphic-form-data: ^2.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 swagger-ui-react: ^5.0.0 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4852,11 +4940,18 @@ __metadata: "@backstage/frontend-plugin-api": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@types/react": ^16.13.1 || ^17.0.0 + "@types/react": ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5401,10 +5496,19 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@testing-library/user-event": ^14.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 msw: ^1.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5907,16 +6011,23 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@testing-library/user-event": ^14.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 classnames: ^2.3.1 lodash: ^4.17.15 p-limit: ^3.1.0 qs: ^6.9.4 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 react-use: ^17.2.4 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5949,18 +6060,25 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@testing-library/user-event": ^14.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 git-url-parse: ^14.0.0 js-base64: ^3.6.0 lodash: ^4.17.21 msw: ^1.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 react-hook-form: ^7.12.2 + react-router-dom: ^6.3.0 react-use: ^17.2.4 yaml: ^2.0.0 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -6048,20 +6166,27 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@testing-library/user-event": ^14.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 "@types/zen-observable": ^0.8.0 classnames: ^2.2.6 lodash: ^4.17.21 material-ui-popup-state: ^1.9.3 qs: ^6.9.4 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 react-test-renderer: ^16.13.1 react-use: ^17.2.4 yaml: ^2.0.0 zen-observable: ^0.10.0 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -6089,13 +6214,20 @@ __metadata: "@material-ui/lab": ^4.0.0-alpha.60 "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 luxon: ^3.5.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 react-use: ^17.2.4 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -6133,19 +6265,26 @@ __metadata: "@testing-library/react": ^16.0.0 "@testing-library/user-event": ^14.0.0 "@types/pluralize": ^0.0.33 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 dataloader: ^2.0.0 expiry-map: ^2.0.0 history: ^5.0.0 lodash: ^4.17.21 pluralize: ^8.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 react-use: ^17.2.4 swr: ^2.2.5 zen-observable: ^0.10.0 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -6165,14 +6304,21 @@ __metadata: "@testing-library/dom": ^10.0.0 "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 jsonschema: ^1.2.6 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 react-use: ^17.2.4 zen-observable: ^0.10.0 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -6239,13 +6385,20 @@ __metadata: "@material-ui/icons": ^4.9.1 "@material-ui/lab": ^4.0.0-alpha.57 "@testing-library/jest-dom": ^6.0.0 + "@types/react": ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 react-json-view: ^1.21.3 + react-router-dom: ^6.3.0 react-use: ^17.2.4 peerDependencies: "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -6390,12 +6543,19 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@rjsf/utils": 5.21.1 - "@types/react": ^16.13.1 || ^17.0.0 + "@types/react": ^18.0.0 "@types/react-grid-layout": ^1.3.2 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -6428,18 +6588,25 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@testing-library/user-event": ^14.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 "@types/react-grid-layout": ^1.3.2 lodash: ^4.17.21 luxon: ^3.4.3 + react: ^18.0.0 + react-dom: ^18.0.0 react-grid-layout: 1.3.4 react-resizable: ^3.0.4 + react-router-dom: ^6.3.0 react-use: ^17.2.4 zod: ^3.22.4 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -6518,17 +6685,24 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@types/node": ^16.11.26 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 cronstrue: ^2.2.0 js-yaml: ^4.0.0 kubernetes-models: ^4.1.0 lodash: ^4.17.21 luxon: ^3.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 react-use: ^17.2.4 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -6590,7 +6764,7 @@ __metadata: "@material-ui/lab": ^4.0.0-alpha.61 "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 cronstrue: ^2.32.0 jest-websocket-mock: ^2.5.0 js-yaml: ^4.1.0 @@ -6598,12 +6772,21 @@ __metadata: lodash: ^4.17.21 luxon: ^3.0.0 msw: ^1.3.1 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 react-use: ^17.4.0 xterm: ^5.3.0 xterm-addon-attach: ^0.9.0 xterm-addon-fit: ^0.8.0 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -6629,19 +6812,27 @@ __metadata: "@testing-library/dom": ^10.0.0 "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 cronstrue: ^2.2.0 js-yaml: ^4.0.0 kubernetes-models: ^4.1.0 lodash: ^4.17.21 luxon: ^3.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 xterm: ^5.2.1 xterm-addon-attach: ^0.9.0 xterm-addon-fit: ^0.8.0 peerDependencies: + "@testing-library/react": ^16.0.0 + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -6759,16 +6950,24 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@testing-library/user-event": ^14.0.0 - "@types/react": ^16.13.1 || ^17.0.0 + "@types/react": ^18.0.0 lodash: ^4.17.21 material-ui-confirm: ^3.0.12 msw: ^1.0.0 notistack: ^3.0.1 + react: ^18.0.0 + react-dom: ^18.0.0 react-relative-time: ^0.0.9 + react-router-dom: ^6.3.0 react-use: ^17.2.4 peerDependencies: - react: ^16.13.1 || ^17.0.0 + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -6791,12 +6990,19 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@testing-library/user-event": ^14.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 react-use: ^17.2.4 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -6827,16 +7033,23 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@testing-library/user-event": ^14.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 lodash: ^4.17.21 p-limit: ^3.1.0 pluralize: ^8.0.0 qs: ^6.10.1 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 react-use: ^17.2.4 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -6948,12 +7161,19 @@ __metadata: "@backstage/test-utils": "workspace:^" "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 swr: ^2.0.0 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -7378,7 +7598,6 @@ __metadata: "@backstage/cli": "workspace:^" "@backstage/plugin-scaffolder-node": "workspace:^" "@backstage/types": "workspace:^" - "@types/react": "*" languageName: unknown linkType: soft @@ -7445,7 +7664,7 @@ __metadata: "@types/humanize-duration": ^3.18.1 "@types/json-schema": ^7.0.9 "@types/luxon": ^3.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 ajv-errors: ^3.0.0 classnames: ^2.2.6 flatted: 3.3.1 @@ -7455,6 +7674,9 @@ __metadata: lodash: ^4.17.21 luxon: ^3.0.0 qs: ^6.9.4 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 react-use: ^17.2.4 swr: ^2.0.0 use-immer: ^0.10.0 @@ -7462,9 +7684,13 @@ __metadata: zod: ^3.22.4 zod-to-json-schema: ^3.20.4 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -7511,7 +7737,7 @@ __metadata: "@testing-library/user-event": ^14.0.0 "@types/humanize-duration": ^3.18.1 "@types/json-schema": ^7.0.9 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 "@types/react-resizable": ^3.0.8 "@types/react-window": ^1.8.8 "@uiw/react-codemirror": ^4.9.3 @@ -7526,7 +7752,10 @@ __metadata: luxon: ^3.0.0 msw: ^1.0.0 qs: ^6.9.4 + react: ^18.0.0 + react-dom: ^18.0.0 react-resizable: ^3.0.5 + react-router-dom: ^6.3.0 react-use: ^17.2.4 react-window: ^1.8.10 swr: ^2.0.0 @@ -7535,9 +7764,13 @@ __metadata: zod: ^3.22.4 zod-to-json-schema: ^3.20.4 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -7744,14 +7977,21 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@testing-library/user-event": ^14.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 lodash: ^4.17.21 qs: ^6.9.4 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 react-use: ^17.3.2 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -7779,14 +8019,21 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@testing-library/user-event": ^14.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 history: ^5.0.0 qs: ^6.9.4 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 react-use: ^17.2.4 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -7852,8 +8099,18 @@ __metadata: "@material-ui/core": ^4.12.4 "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 + "@types/react": ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 peerDependencies: - react: ^16.13.1 || ^17.0.0 + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -7876,12 +8133,22 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@testing-library/user-event": ^14.0.0 + "@types/react": ^18.0.0 jest-websocket-mock: ^2.5.0 msw: ^1.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 react-use: ^17.2.4 uuid: ^9.0.0 peerDependencies: - react: ^16.13.1 || ^17.0.0 + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -7901,13 +8168,20 @@ __metadata: "@backstage/test-utils": "workspace:^" "@testing-library/dom": ^10.0.0 "@testing-library/jest-dom": ^6.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 testing-library__dom: ^7.29.4-beta.1 peerDependencies: "@testing-library/react": ^16.0.0 + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -7971,13 +8245,20 @@ __metadata: "@testing-library/dom": ^10.0.0 "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 - "@types/react": ^16.13.1 || ^17.0.0 + "@types/react": ^18.0.0 git-url-parse: ^14.0.0 photoswipe: ^5.3.7 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -8042,15 +8323,22 @@ __metadata: "@material-ui/styles": ^4.11.0 "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 jss: ~10.10.0 lodash: ^4.17.21 + react: ^18.0.0 + react-dom: ^18.0.0 react-helmet: 6.1.0 + react-router-dom: ^6.3.0 react-use: ^17.2.4 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -8089,18 +8377,26 @@ __metadata: "@testing-library/react": ^16.0.0 "@testing-library/user-event": ^14.0.0 "@types/dompurify": ^3.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/event-source-polyfill": ^1.0.0 + "@types/react": ^18.0.0 canvas: ^2.10.2 dompurify: ^3.0.0 git-url-parse: ^14.0.0 jss: ~10.10.0 lodash: ^4.17.21 + react: ^18.0.0 + react-dom: ^18.0.0 react-helmet: 6.1.0 + react-router-dom: ^6.3.0 react-use: ^17.2.4 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -8162,14 +8458,21 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@testing-library/user-event": ^14.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 msw: ^1.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 react-use: ^17.2.4 zen-observable: ^0.10.0 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -8258,16 +8561,23 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@testing-library/jest-dom": ^6.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 cross-fetch: ^4.0.0 i18next: ^22.4.15 msw: ^1.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 zen-observable: ^0.10.0 peerDependencies: "@testing-library/react": ^16.0.0 + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -8282,12 +8592,19 @@ __metadata: "@mui/styles": ^5.14.18 "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 - "@types/react": ^16.13.1 || ^17.0.0 + "@types/react": ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 peerDependencies: "@material-ui/core": ^4.12.2 "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -8309,11 +8626,18 @@ __metadata: "@backstage/cli": "workspace:^" "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 - "@types/react": ^16.13.1 || ^17.0.0 + "@types/react": ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -10158,12 +10482,19 @@ __metadata: "@testing-library/dom": ^10.0.0 "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 - "@types/react": ^16.13.1 || ^17.0.0 + "@types/react": ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 react-use: ^17.2.4 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -16875,6 +17206,24 @@ __metadata: languageName: node linkType: hard +"@testing-library/react@npm:^15.0.0": + version: 15.0.7 + resolution: "@testing-library/react@npm:15.0.7" + dependencies: + "@babel/runtime": ^7.12.5 + "@testing-library/dom": ^10.0.0 + "@types/react-dom": ^18.0.0 + peerDependencies: + "@types/react": ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: eb33fd82eb811bb8612aa154e430a2c1c251d5ed45a477ef57fe20095db494ea7dcfa6b1e1e2bffb0c7ee10c86e408745d95a879be8ca8fbe301bb91e5f2e5db + languageName: node + linkType: hard + "@testing-library/react@npm:^16.0.0": version: 16.0.1 resolution: "@testing-library/react@npm:16.0.1" @@ -17448,6 +17797,13 @@ __metadata: languageName: node linkType: hard +"@types/event-source-polyfill@npm:^1.0.0": + version: 1.0.5 + resolution: "@types/event-source-polyfill@npm:1.0.5" + checksum: f506b68710162f2ade1bccbc5691b8c67e5a703e565df2bc0b7b5be2637ba838ef81ec6c10b03248fe4d054386d95a6e827c7aace6e924986c2b9985f77b55de + languageName: node + linkType: hard + "@types/expect@npm:^1.20.4": version: 1.20.4 resolution: "@types/expect@npm:1.20.4" @@ -20654,12 +21010,20 @@ __metadata: "@backstage/core-components": "workspace:^" "@backstage/frontend-plugin-api": "workspace:^" "@material-ui/icons": ^4.9.1 + "@types/react": ^18.0.0 cross-fetch: ^4.0.0 msw: ^1.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.3.0 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -38138,7 +38502,7 @@ __metadata: languageName: node linkType: hard -"react-dom@npm:^18.0.2": +"react-dom@npm:^18.0.0, react-dom@npm:^18.0.2": version: 18.3.1 resolution: "react-dom@npm:18.3.1" dependencies: @@ -38722,7 +39086,7 @@ __metadata: languageName: node linkType: hard -"react@npm:^16.13.1 || ^17.0.0 || ^18.0.0, react@npm:^18.0.2": +"react@npm:^16.13.1 || ^17.0.0 || ^18.0.0, react@npm:^18.0.0, react@npm:^18.0.2": version: 18.3.1 resolution: "react@npm:18.3.1" dependencies: @@ -41954,8 +42318,8 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@testing-library/user-event": ^14.0.0 - "@types/react": "*" - "@types/react-dom": "*" + "@types/react": ^18.0.0 + "@types/react-dom": ^18.0.0 cross-env: ^7.0.0 history: ^5.0.0 react: ^18.0.2 From 3c81a1ce3e7d585de8face1901564b4075a1b750 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Wed, 19 Jun 2024 00:16:44 -0400 Subject: [PATCH 034/217] adjust changeset Signed-off-by: aramissennyeydd --- .changeset/early-sloths-cross.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.changeset/early-sloths-cross.md b/.changeset/early-sloths-cross.md index 3e96057b8d..7f4a563918 100644 --- a/.changeset/early-sloths-cross.md +++ b/.changeset/early-sloths-cross.md @@ -1,4 +1,6 @@ --- +'@backstage/plugin-signals-react': patch +'@backstage/plugin-signals': patch '@backstage/plugin-api-docs-module-protoc-gen-doc': patch '@backstage/plugin-techdocs-module-addons-contrib': patch '@backstage/plugin-catalog-unprocessed-entities': patch From 8eb3033f7063836deb7cdce88fbb83d514038799 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Wed, 19 Jun 2024 00:17:57 -0400 Subject: [PATCH 035/217] add changeset for cli Signed-off-by: aramissennyeydd --- .changeset/nice-badgers-travel.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/nice-badgers-travel.md diff --git a/.changeset/nice-badgers-travel.md b/.changeset/nice-badgers-travel.md new file mode 100644 index 0000000000..7ec79b56d8 --- /dev/null +++ b/.changeset/nice-badgers-travel.md @@ -0,0 +1,5 @@ +--- +'@backstage/repo-tools': minor +--- + +Adds a new command `backstage-repo-tools peer-deps` for validating your usage of peer dependencies in your plugins. It currently supports react related peer dependencies. It also has a `--fix` mode for quickly fixing any issues that it finds. From afc413d5c0a44523f8f4239aaf35d48c5294b5ff Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Wed, 19 Jun 2024 09:53:35 -0400 Subject: [PATCH 036/217] fix test case failing with react error and update api reports Signed-off-by: aramissennyeydd --- .../src/layout/ErrorBoundary/ErrorBoundary.test.tsx | 5 ++++- packages/repo-tools/cli-report.md | 11 +++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/core-components/src/layout/ErrorBoundary/ErrorBoundary.test.tsx b/packages/core-components/src/layout/ErrorBoundary/ErrorBoundary.test.tsx index c96ab67782..72b8e4dc95 100644 --- a/packages/core-components/src/layout/ErrorBoundary/ErrorBoundary.test.tsx +++ b/packages/core-components/src/layout/ErrorBoundary/ErrorBoundary.test.tsx @@ -77,7 +77,10 @@ describe('', () => { /^The above error occurred in the component:/, ), expect.stringMatching(/^ErrorBoundary/), - expect.stringMatching(/Warning: findDOMNode/), // React warning, unfortunate but currently true + // React 18.3.0 added error messages for findDOMNode deprecation, https://github.com/facebook/react/commit/c3b283964108b0e8dbcf1f9eb2e7e67815e39dfb. + expect.stringContaining( + 'Warning: findDOMNode is deprecated and will be removed in the next major release. Instead, add a ref directly to the element you want to reference. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-find-node%s', + ), ]); expect(error.length).toEqual(5); }); diff --git a/packages/repo-tools/cli-report.md b/packages/repo-tools/cli-report.md index 6e0e4c9b85..9266957886 100644 --- a/packages/repo-tools/cli-report.md +++ b/packages/repo-tools/cli-report.md @@ -14,6 +14,7 @@ Options: Commands: api-reports [options] [paths...] type-deps + peer-deps [options] generate-catalog-info [options] knip-reports [options] [paths...] package [command] @@ -156,6 +157,16 @@ Options: -h, --help ``` +### `backstage-repo-tools peer-deps` + +``` +Usage: backstage-repo-tools peer-deps [options] + +Options: + --fix + -h, --help +``` + ### `backstage-repo-tools repo` ``` From a99bf141a00d9d541c06089129f6e517138c865d Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Wed, 19 Jun 2024 11:40:42 -0400 Subject: [PATCH 037/217] use common react version Signed-off-by: aramissennyeydd --- microsite/package.json | 4 +- packages/app-defaults/package.json | 4 +- packages/app-next-example-plugin/package.json | 4 +- packages/core-app-api/package.json | 4 +- packages/core-components/package.json | 4 +- packages/core-plugin-api/package.json | 4 +- packages/dev-utils/package.json | 4 +- packages/frontend-app-api/package.json | 4 +- packages/frontend-plugin-api/package.json | 4 +- packages/frontend-test-utils/package.json | 4 +- packages/integration-react/package.json | 4 +- packages/test-utils/package.json | 4 +- packages/theme/package.json | 4 +- packages/version-bridge/package.json | 4 +- .../package.json | 4 +- plugins/api-docs/package.json | 4 +- plugins/app-visualizer/package.json | 4 +- plugins/auth-react/package.json | 4 +- plugins/catalog-graph/package.json | 4 +- plugins/catalog-import/package.json | 4 +- plugins/catalog-react/package.json | 4 +- .../catalog-unprocessed-entities/package.json | 4 +- plugins/catalog/package.json | 4 +- plugins/config-schema/package.json | 4 +- plugins/devtools/package.json | 4 +- plugins/example-todo-list/package.json | 4 +- plugins/home-react/package.json | 4 +- plugins/home/package.json | 4 +- plugins/kubernetes-cluster/package.json | 4 +- plugins/kubernetes-react/package.json | 4 +- plugins/kubernetes/package.json | 4 +- plugins/notifications/package.json | 4 +- plugins/org-react/package.json | 4 +- plugins/org/package.json | 4 +- plugins/permission-react/package.json | 4 +- plugins/scaffolder-react/package.json | 4 +- plugins/scaffolder/package.json | 4 +- plugins/search-react/package.json | 4 +- plugins/search/package.json | 4 +- plugins/signals-react/package.json | 4 +- plugins/signals/package.json | 4 +- .../techdocs-addons-test-utils/package.json | 4 +- .../package.json | 4 +- plugins/techdocs-react/package.json | 4 +- plugins/techdocs/package.json | 4 +- plugins/user-settings/package.json | 4 +- yarn.lock | 180 +++++++++--------- 47 files changed, 182 insertions(+), 182 deletions(-) diff --git a/microsite/package.json b/microsite/package.json index fc3405c744..728cef0d96 100644 --- a/microsite/package.json +++ b/microsite/package.json @@ -30,8 +30,8 @@ "docusaurus-pushfeedback": "^1.0.0", "luxon": "^3.0.0", "prism-react-renderer": "^2.1.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "sass": "^1.57.1", "swc-loader": "^0.2.3" }, diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json index 5865cb3f43..1865c856b7 100644 --- a/packages/app-defaults/package.json +++ b/packages/app-defaults/package.json @@ -50,8 +50,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/app-next-example-plugin/package.json b/packages/app-next-example-plugin/package.json index dc477e31ec..56374b384c 100644 --- a/packages/app-next-example-plugin/package.json +++ b/packages/app-next-example-plugin/package.json @@ -50,8 +50,8 @@ "@types/react": "^18.0.0", "cross-fetch": "^4.0.0", "msw": "^1.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json index d1c9f0a053..6d443606b0 100644 --- a/packages/core-app-api/package.json +++ b/packages/core-app-api/package.json @@ -70,8 +70,8 @@ "@types/react": "^18.0.0", "@types/zen-observable": "^0.8.0", "msw": "^1.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-beta": "npm:react-router@6.0.0-beta.0", "react-router-dom": "^6.3.0", "react-router-dom-beta": "npm:react-router-dom@6.0.0-beta.0", diff --git a/packages/core-components/package.json b/packages/core-components/package.json index fc9ebc30e5..30699ad7a1 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -116,8 +116,8 @@ "cross-fetch": "^4.0.0", "history": "^5.0.0", "msw": "^1.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json index e9e46a8064..876457b939 100644 --- a/packages/core-plugin-api/package.json +++ b/packages/core-plugin-api/package.json @@ -64,8 +64,8 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index d8fa50b1ee..a45f63324e 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -56,8 +56,8 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0", "zen-observable": "^0.10.0" }, diff --git a/packages/frontend-app-api/package.json b/packages/frontend-app-api/package.json index 26473d0dea..ec5463642b 100644 --- a/packages/frontend-app-api/package.json +++ b/packages/frontend-app-api/package.json @@ -52,8 +52,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^15.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/frontend-plugin-api/package.json b/packages/frontend-plugin-api/package.json index 43509a6132..309ebacc04 100644 --- a/packages/frontend-plugin-api/package.json +++ b/packages/frontend-plugin-api/package.json @@ -49,8 +49,8 @@ "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", "history": "^5.3.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/frontend-test-utils/package.json b/packages/frontend-test-utils/package.json index 7ebf1eb4f0..b8973bc5bd 100644 --- a/packages/frontend-test-utils/package.json +++ b/packages/frontend-test-utils/package.json @@ -44,8 +44,8 @@ "@backstage/cli": "workspace:^", "@testing-library/jest-dom": "^6.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index f426ec4a01..5911006c7e 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -48,8 +48,8 @@ "@testing-library/jest-dom": "^6.0.0", "@types/react": "^18.0.0", "msw": "^1.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index dc2713ff09..f31595084c 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -67,8 +67,8 @@ "@testing-library/jest-dom": "^6.0.0", "@types/react": "^18.0.0", "msw": "^1.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/theme/package.json b/packages/theme/package.json index 435f517326..17b655ca52 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -46,8 +46,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/version-bridge/package.json b/packages/version-bridge/package.json index 50a5883b15..aea9d122bf 100644 --- a/packages/version-bridge/package.json +++ b/packages/version-bridge/package.json @@ -40,8 +40,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/api-docs-module-protoc-gen-doc/package.json b/plugins/api-docs-module-protoc-gen-doc/package.json index f41fe2f9fb..1c533b7885 100644 --- a/plugins/api-docs-module-protoc-gen-doc/package.json +++ b/plugins/api-docs-module-protoc-gen-doc/package.json @@ -43,8 +43,8 @@ "@backstage/cli": "workspace:^", "@testing-library/jest-dom": "^6.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index f9888ed99c..79c2320563 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -86,8 +86,8 @@ "@types/highlightjs": "^10.1.0", "@types/react": "^18.0.0", "@types/swagger-ui-react": "^4.18.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/app-visualizer/package.json b/plugins/app-visualizer/package.json index 53720d560a..e9e6568210 100644 --- a/plugins/app-visualizer/package.json +++ b/plugins/app-visualizer/package.json @@ -43,8 +43,8 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/auth-react/package.json b/plugins/auth-react/package.json index 995d9adecf..5bb99f0c8d 100644 --- a/plugins/auth-react/package.json +++ b/plugins/auth-react/package.json @@ -52,8 +52,8 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "msw": "^1.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index e6e4b5651d..c444cd755f 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -77,8 +77,8 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index 1dbfac3179..277e259458 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -89,8 +89,8 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "msw": "^1.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index 5d8d0e7da6..34728f38a0 100644 --- a/plugins/catalog-react/package.json +++ b/plugins/catalog-react/package.json @@ -95,8 +95,8 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "@types/zen-observable": "^0.8.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0", "react-test-renderer": "^16.13.1" }, diff --git a/plugins/catalog-unprocessed-entities/package.json b/plugins/catalog-unprocessed-entities/package.json index a0e652bc03..fe7857091a 100644 --- a/plugins/catalog-unprocessed-entities/package.json +++ b/plugins/catalog-unprocessed-entities/package.json @@ -53,8 +53,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index 2b8e0484b7..1c159af6ce 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -98,8 +98,8 @@ "@testing-library/user-event": "^14.0.0", "@types/pluralize": "^0.0.33", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0", "swr": "^2.2.5" }, diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json index 643f7ac765..bd29c74543 100644 --- a/plugins/config-schema/package.json +++ b/plugins/config-schema/package.json @@ -55,8 +55,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/devtools/package.json b/plugins/devtools/package.json index 62a838f8fa..66679a712d 100644 --- a/plugins/devtools/package.json +++ b/plugins/devtools/package.json @@ -69,8 +69,8 @@ "@backstage/dev-utils": "workspace:^", "@testing-library/jest-dom": "^6.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json index 4776fc2553..feda571385 100644 --- a/plugins/example-todo-list/package.json +++ b/plugins/example-todo-list/package.json @@ -51,8 +51,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/home-react/package.json b/plugins/home-react/package.json index 0a3edf65d4..e68f20c51e 100644 --- a/plugins/home-react/package.json +++ b/plugins/home-react/package.json @@ -52,8 +52,8 @@ "@backstage/cli": "workspace:^", "@types/react": "^18.0.0", "@types/react-grid-layout": "^1.3.2", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/home/package.json b/plugins/home/package.json index 8dc5bc3b68..38a12f7fcc 100644 --- a/plugins/home/package.json +++ b/plugins/home/package.json @@ -91,8 +91,8 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "@types/react-grid-layout": "^1.3.2", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/kubernetes-cluster/package.json b/plugins/kubernetes-cluster/package.json index 21087fd0b7..4f4796007d 100644 --- a/plugins/kubernetes-cluster/package.json +++ b/plugins/kubernetes-cluster/package.json @@ -66,8 +66,8 @@ "@testing-library/react": "^16.0.0", "@types/node": "^16.11.26", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/kubernetes-react/package.json b/plugins/kubernetes-react/package.json index 879507fbe4..b18794f564 100644 --- a/plugins/kubernetes-react/package.json +++ b/plugins/kubernetes-react/package.json @@ -72,8 +72,8 @@ "@types/react": "^18.0.0", "jest-websocket-mock": "^2.5.0", "msw": "^1.3.1", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index 940054aa65..f28b4d248a 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -87,8 +87,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/notifications/package.json b/plugins/notifications/package.json index aafdf2476e..cb16e1cb96 100644 --- a/plugins/notifications/package.json +++ b/plugins/notifications/package.json @@ -65,8 +65,8 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "msw": "^1.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json index e31864e158..b96a6f8e27 100644 --- a/plugins/org-react/package.json +++ b/plugins/org-react/package.json @@ -59,8 +59,8 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/org/package.json b/plugins/org/package.json index cae8a2d11a..f44b6900da 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -82,8 +82,8 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/permission-react/package.json b/plugins/permission-react/package.json index 65732d8c89..cf012d1ead 100644 --- a/plugins/permission-react/package.json +++ b/plugins/permission-react/package.json @@ -53,8 +53,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index f3e8eccdbb..96c3907c46 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -107,8 +107,8 @@ "@types/humanize-duration": "^3.18.1", "@types/luxon": "^3.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0", "swr": "^2.0.0" }, diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index e69cf0e223..01c7dacf66 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -121,8 +121,8 @@ "@types/react-resizable": "^3.0.8", "@types/react-window": "^1.8.8", "msw": "^1.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0", "swr": "^2.0.0" }, diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json index 6df72cee7d..6e942e1dbb 100644 --- a/plugins/search-react/package.json +++ b/plugins/search-react/package.json @@ -81,8 +81,8 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/search/package.json b/plugins/search/package.json index dba2742ca2..657ea72def 100644 --- a/plugins/search/package.json +++ b/plugins/search/package.json @@ -84,8 +84,8 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "history": "^5.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/signals-react/package.json b/plugins/signals-react/package.json index dad70cff02..bd9d862fd4 100644 --- a/plugins/signals-react/package.json +++ b/plugins/signals-react/package.json @@ -49,8 +49,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/signals/package.json b/plugins/signals/package.json index f87647d356..51913117a2 100644 --- a/plugins/signals/package.json +++ b/plugins/signals/package.json @@ -60,8 +60,8 @@ "@types/react": "^18.0.0", "jest-websocket-mock": "^2.5.0", "msw": "^1.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index 4984bbdced..949c9addf3 100644 --- a/plugins/techdocs-addons-test-utils/package.json +++ b/plugins/techdocs-addons-test-utils/package.json @@ -56,8 +56,8 @@ "@testing-library/dom": "^10.0.0", "@testing-library/jest-dom": "^6.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index 59976dde8c..951bd8f432 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -58,8 +58,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json index 73cab1645e..370c1ff110 100644 --- a/plugins/techdocs-react/package.json +++ b/plugins/techdocs-react/package.json @@ -64,8 +64,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index dec637779c..86a491ab24 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -101,8 +101,8 @@ "@types/event-source-polyfill": "^1.0.0", "@types/react": "^18.0.0", "canvas": "^2.10.2", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index ee79710815..5322e813fa 100644 --- a/plugins/user-settings/package.json +++ b/plugins/user-settings/package.json @@ -83,8 +83,8 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "msw": "^1.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/yarn.lock b/yarn.lock index f449544643..f7eb3d310b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3452,8 +3452,8 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@types/react": ^18.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 peerDependencies: "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 @@ -4135,8 +4135,8 @@ __metadata: lodash: ^4.17.21 msw: ^1.0.0 prop-types: ^15.7.2 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-beta: "npm:react-router@6.0.0-beta.0" react-router-dom: ^6.3.0 react-router-dom-beta: "npm:react-router-dom@6.0.0-beta.0" @@ -4408,8 +4408,8 @@ __metadata: pluralize: ^8.0.0 qs: ^6.9.4 rc-progress: 3.5.1 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-helmet: 6.1.0 react-hook-form: ^7.12.2 react-idle-timer: 5.7.2 @@ -4469,8 +4469,8 @@ __metadata: "@testing-library/user-event": ^14.0.0 "@types/react": ^18.0.0 history: ^5.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 peerDependencies: "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 @@ -4531,8 +4531,8 @@ __metadata: "@testing-library/react": ^16.0.0 "@testing-library/user-event": ^14.0.0 "@types/react": ^18.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 react-use: ^17.2.4 zen-observable: ^0.10.0 @@ -4606,8 +4606,8 @@ __metadata: "@testing-library/react": ^15.0.0 "@types/react": ^18.0.0 lodash: ^4.17.21 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 zod: ^3.22.4 peerDependencies: @@ -4680,8 +4680,8 @@ __metadata: "@types/react": ^18.0.0 history: ^5.3.0 lodash: ^4.17.21 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 zod: ^3.22.4 zod-to-json-schema: ^3.21.4 @@ -4710,8 +4710,8 @@ __metadata: "@backstage/version-bridge": "workspace:^" "@testing-library/jest-dom": ^6.0.0 "@types/react": ^18.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 zod: ^3.22.4 peerDependencies: @@ -4780,8 +4780,8 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@types/react": ^18.0.0 msw: ^1.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 peerDependencies: "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 @@ -4822,8 +4822,8 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@types/react": ^18.0.0 grpc-docs: ^1.1.2 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 peerDependencies: "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 @@ -4870,8 +4870,8 @@ __metadata: graphql-config: ^5.0.2 graphql-ws: ^5.4.1 isomorphic-form-data: ^2.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 swagger-ui-react: ^5.0.0 peerDependencies: @@ -4941,8 +4941,8 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@types/react": ^18.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 peerDependencies: "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 @@ -5498,8 +5498,8 @@ __metadata: "@testing-library/user-event": ^14.0.0 "@types/react": ^18.0.0 msw: ^1.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 peerDependencies: "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 @@ -6016,8 +6016,8 @@ __metadata: lodash: ^4.17.15 p-limit: ^3.1.0 qs: ^6.9.4 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 react-use: ^17.2.4 peerDependencies: @@ -6065,8 +6065,8 @@ __metadata: js-base64: ^3.6.0 lodash: ^4.17.21 msw: ^1.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-hook-form: ^7.12.2 react-router-dom: ^6.3.0 react-use: ^17.2.4 @@ -6172,8 +6172,8 @@ __metadata: lodash: ^4.17.21 material-ui-popup-state: ^1.9.3 qs: ^6.9.4 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 react-test-renderer: ^16.13.1 react-use: ^17.2.4 @@ -6216,8 +6216,8 @@ __metadata: "@testing-library/react": ^16.0.0 "@types/react": ^18.0.0 luxon: ^3.5.0 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 react-use: ^17.2.4 peerDependencies: @@ -6271,8 +6271,8 @@ __metadata: history: ^5.0.0 lodash: ^4.17.21 pluralize: ^8.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 react-use: ^17.2.4 swr: ^2.2.5 @@ -6306,8 +6306,8 @@ __metadata: "@testing-library/react": ^16.0.0 "@types/react": ^18.0.0 jsonschema: ^1.2.6 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 react-use: ^17.2.4 zen-observable: ^0.10.0 @@ -6386,8 +6386,8 @@ __metadata: "@material-ui/lab": ^4.0.0-alpha.57 "@testing-library/jest-dom": ^6.0.0 "@types/react": ^18.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-json-view: ^1.21.3 react-router-dom: ^6.3.0 react-use: ^17.2.4 @@ -6545,8 +6545,8 @@ __metadata: "@rjsf/utils": 5.21.1 "@types/react": ^18.0.0 "@types/react-grid-layout": ^1.3.2 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 peerDependencies: "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 @@ -6592,8 +6592,8 @@ __metadata: "@types/react-grid-layout": ^1.3.2 lodash: ^4.17.21 luxon: ^3.4.3 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-grid-layout: 1.3.4 react-resizable: ^3.0.4 react-router-dom: ^6.3.0 @@ -6691,8 +6691,8 @@ __metadata: kubernetes-models: ^4.1.0 lodash: ^4.17.21 luxon: ^3.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 react-use: ^17.2.4 peerDependencies: @@ -6772,8 +6772,8 @@ __metadata: lodash: ^4.17.21 luxon: ^3.0.0 msw: ^1.3.1 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 react-use: ^17.4.0 xterm: ^5.3.0 @@ -6818,8 +6818,8 @@ __metadata: kubernetes-models: ^4.1.0 lodash: ^4.17.21 luxon: ^3.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 xterm: ^5.2.1 xterm-addon-attach: ^0.9.0 @@ -6955,8 +6955,8 @@ __metadata: material-ui-confirm: ^3.0.12 msw: ^1.0.0 notistack: ^3.0.1 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-relative-time: ^0.0.9 react-router-dom: ^6.3.0 react-use: ^17.2.4 @@ -6991,8 +6991,8 @@ __metadata: "@testing-library/react": ^16.0.0 "@testing-library/user-event": ^14.0.0 "@types/react": ^18.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 react-use: ^17.2.4 peerDependencies: @@ -7038,8 +7038,8 @@ __metadata: p-limit: ^3.1.0 pluralize: ^8.0.0 qs: ^6.10.1 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 react-use: ^17.2.4 peerDependencies: @@ -7162,8 +7162,8 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@types/react": ^18.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 swr: ^2.0.0 peerDependencies: @@ -7674,8 +7674,8 @@ __metadata: lodash: ^4.17.21 luxon: ^3.0.0 qs: ^6.9.4 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 react-use: ^17.2.4 swr: ^2.0.0 @@ -7752,8 +7752,8 @@ __metadata: luxon: ^3.0.0 msw: ^1.0.0 qs: ^6.9.4 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-resizable: ^3.0.5 react-router-dom: ^6.3.0 react-use: ^17.2.4 @@ -7980,8 +7980,8 @@ __metadata: "@types/react": ^18.0.0 lodash: ^4.17.21 qs: ^6.9.4 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 react-use: ^17.3.2 peerDependencies: @@ -8022,8 +8022,8 @@ __metadata: "@types/react": ^18.0.0 history: ^5.0.0 qs: ^6.9.4 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 react-use: ^17.2.4 peerDependencies: @@ -8100,8 +8100,8 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@types/react": ^18.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 peerDependencies: "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 @@ -8136,8 +8136,8 @@ __metadata: "@types/react": ^18.0.0 jest-websocket-mock: ^2.5.0 msw: ^1.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 react-use: ^17.2.4 uuid: ^9.0.0 @@ -8169,8 +8169,8 @@ __metadata: "@testing-library/dom": ^10.0.0 "@testing-library/jest-dom": ^6.0.0 "@types/react": ^18.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 testing-library__dom: ^7.29.4-beta.1 peerDependencies: @@ -8248,8 +8248,8 @@ __metadata: "@types/react": ^18.0.0 git-url-parse: ^14.0.0 photoswipe: ^5.3.7 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 peerDependencies: "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 @@ -8326,8 +8326,8 @@ __metadata: "@types/react": ^18.0.0 jss: ~10.10.0 lodash: ^4.17.21 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-helmet: 6.1.0 react-router-dom: ^6.3.0 react-use: ^17.2.4 @@ -8384,8 +8384,8 @@ __metadata: git-url-parse: ^14.0.0 jss: ~10.10.0 lodash: ^4.17.21 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-helmet: 6.1.0 react-router-dom: ^6.3.0 react-use: ^17.2.4 @@ -8460,8 +8460,8 @@ __metadata: "@testing-library/user-event": ^14.0.0 "@types/react": ^18.0.0 msw: ^1.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 react-use: ^17.2.4 zen-observable: ^0.10.0 @@ -8565,8 +8565,8 @@ __metadata: cross-fetch: ^4.0.0 i18next: ^22.4.15 msw: ^1.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 zen-observable: ^0.10.0 peerDependencies: @@ -8593,8 +8593,8 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@types/react": ^18.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 peerDependencies: "@material-ui/core": ^4.12.2 @@ -8627,8 +8627,8 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@types/react": ^18.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 peerDependencies: "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 @@ -10483,8 +10483,8 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@types/react": ^18.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 react-use: ^17.2.4 peerDependencies: @@ -21013,8 +21013,8 @@ __metadata: "@types/react": ^18.0.0 cross-fetch: ^4.0.0 msw: ^1.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 peerDependencies: "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 From c781772b0a6b3b3bb1a7a8575d03eefcf4fff2e2 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Wed, 19 Jun 2024 11:50:54 -0400 Subject: [PATCH 038/217] revert react version upgrade Signed-off-by: aramissennyeydd --- .../src/layout/ErrorBoundary/ErrorBoundary.test.tsx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/core-components/src/layout/ErrorBoundary/ErrorBoundary.test.tsx b/packages/core-components/src/layout/ErrorBoundary/ErrorBoundary.test.tsx index 72b8e4dc95..99419a9109 100644 --- a/packages/core-components/src/layout/ErrorBoundary/ErrorBoundary.test.tsx +++ b/packages/core-components/src/layout/ErrorBoundary/ErrorBoundary.test.tsx @@ -77,10 +77,6 @@ describe('', () => { /^The above error occurred in the component:/, ), expect.stringMatching(/^ErrorBoundary/), - // React 18.3.0 added error messages for findDOMNode deprecation, https://github.com/facebook/react/commit/c3b283964108b0e8dbcf1f9eb2e7e67815e39dfb. - expect.stringContaining( - 'Warning: findDOMNode is deprecated and will be removed in the next major release. Instead, add a ref directly to the element you want to reference. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-find-node%s', - ), ]); expect(error.length).toEqual(5); }); From 1376af866853f75ca88b47df07f4906124f16442 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Wed, 19 Jun 2024 12:03:48 -0400 Subject: [PATCH 039/217] revert microsite react bump Signed-off-by: aramissennyeydd --- microsite/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/microsite/package.json b/microsite/package.json index 728cef0d96..fc3405c744 100644 --- a/microsite/package.json +++ b/microsite/package.json @@ -30,8 +30,8 @@ "docusaurus-pushfeedback": "^1.0.0", "luxon": "^3.0.0", "prism-react-renderer": "^2.1.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "sass": "^1.57.1", "swc-loader": "^0.2.3" }, From 7d9580643a0cd37f5bb01930393d48957b8f9dd5 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Wed, 19 Jun 2024 13:28:35 -0400 Subject: [PATCH 040/217] revert length check Signed-off-by: aramissennyeydd --- .../src/layout/ErrorBoundary/ErrorBoundary.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core-components/src/layout/ErrorBoundary/ErrorBoundary.test.tsx b/packages/core-components/src/layout/ErrorBoundary/ErrorBoundary.test.tsx index 99419a9109..8bfb228f53 100644 --- a/packages/core-components/src/layout/ErrorBoundary/ErrorBoundary.test.tsx +++ b/packages/core-components/src/layout/ErrorBoundary/ErrorBoundary.test.tsx @@ -78,6 +78,6 @@ describe('', () => { ), expect.stringMatching(/^ErrorBoundary/), ]); - expect(error.length).toEqual(5); + expect(error.length).toEqual(4); }); }); From 4958c01d14cf511ebf586b98aecb45e26b95de36 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Tue, 24 Sep 2024 21:08:37 -0400 Subject: [PATCH 041/217] revert version of react and fix merge conflicts Signed-off-by: aramissennyeydd --- packages/app-defaults/package.json | 4 ++-- packages/app-next-example-plugin/package.json | 4 ++-- packages/app-next/package.json | 4 ++-- packages/app/package.json | 4 ++-- packages/core-app-api/package.json | 4 ++-- packages/core-components/package.json | 4 ++-- packages/core-plugin-api/package.json | 4 ++-- .../default-app/packages/app/package.json.hbs | 4 ++-- packages/dev-utils/package.json | 4 ++-- packages/frontend-app-api/package.json | 4 ++-- packages/frontend-defaults/package.json | 16 ++++++++++++++-- packages/frontend-plugin-api/package.json | 4 ++-- packages/frontend-test-utils/package.json | 4 ++-- packages/integration-react/package.json | 4 ++-- .../src/commands/peer-deps/peer-deps.ts | 2 +- packages/techdocs-cli-embedded-app/package.json | 4 ++-- packages/test-utils/package.json | 4 ++-- packages/theme/package.json | 4 ++-- packages/version-bridge/package.json | 4 ++-- .../api-docs-module-protoc-gen-doc/package.json | 4 ++-- plugins/api-docs/package.json | 4 ++-- plugins/app-visualizer/package.json | 4 ++-- plugins/app/package.json | 12 +++++++++++- plugins/auth-react/package.json | 4 ++-- plugins/catalog-graph/package.json | 4 ++-- plugins/catalog-import/package.json | 4 ++-- plugins/catalog-react/package.json | 4 ++-- .../catalog-unprocessed-entities/package.json | 4 ++-- plugins/catalog/package.json | 4 ++-- plugins/config-schema/package.json | 4 ++-- plugins/devtools/package.json | 4 ++-- plugins/example-todo-list/package.json | 4 ++-- plugins/home-react/package.json | 4 ++-- plugins/home/package.json | 4 ++-- plugins/kubernetes-cluster/package.json | 4 ++-- plugins/kubernetes-react/package.json | 4 ++-- plugins/kubernetes/package.json | 4 ++-- plugins/notifications/package.json | 4 ++-- plugins/org-react/package.json | 4 ++-- plugins/org/package.json | 4 ++-- plugins/permission-react/package.json | 4 ++-- plugins/scaffolder-react/package.json | 4 ++-- plugins/scaffolder/package.json | 4 ++-- plugins/search-react/package.json | 4 ++-- plugins/search/package.json | 4 ++-- plugins/signals-react/package.json | 4 ++-- plugins/signals/package.json | 4 ++-- plugins/techdocs-addons-test-utils/package.json | 4 ++-- .../techdocs-module-addons-contrib/package.json | 4 ++-- plugins/techdocs-react/package.json | 4 ++-- plugins/techdocs/package.json | 4 ++-- plugins/user-settings/package.json | 4 ++-- storybook/package.json | 4 ++-- 53 files changed, 126 insertions(+), 104 deletions(-) diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json index 1865c856b7..5865cb3f43 100644 --- a/packages/app-defaults/package.json +++ b/packages/app-defaults/package.json @@ -50,8 +50,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/app-next-example-plugin/package.json b/packages/app-next-example-plugin/package.json index 56374b384c..dc477e31ec 100644 --- a/packages/app-next-example-plugin/package.json +++ b/packages/app-next-example-plugin/package.json @@ -50,8 +50,8 @@ "@types/react": "^18.0.0", "cross-fetch": "^4.0.0", "msw": "^1.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/app-next/package.json b/packages/app-next/package.json index 29f9105031..da3ab3d184 100644 --- a/packages/app-next/package.json +++ b/packages/app-next/package.json @@ -78,8 +78,8 @@ "@material-ui/lab": "4.0.0-alpha.61", "@octokit/rest": "^19.0.3", "history": "^5.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router": "^6.3.0", "react-router-dom": "^6.3.0", "react-use": "^17.2.4", diff --git a/packages/app/package.json b/packages/app/package.json index 15cdd85d32..02e6a8673b 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -76,8 +76,8 @@ "@octokit/rest": "^19.0.3", "@vitejs/plugin-react": "^4.3.1", "history": "^5.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router": "^6.3.0", "react-router-dom": "^6.3.0", "react-use": "^17.2.4", diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json index 6d443606b0..d1c9f0a053 100644 --- a/packages/core-app-api/package.json +++ b/packages/core-app-api/package.json @@ -70,8 +70,8 @@ "@types/react": "^18.0.0", "@types/zen-observable": "^0.8.0", "msw": "^1.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-beta": "npm:react-router@6.0.0-beta.0", "react-router-dom": "^6.3.0", "react-router-dom-beta": "npm:react-router-dom@6.0.0-beta.0", diff --git a/packages/core-components/package.json b/packages/core-components/package.json index 30699ad7a1..fc9ebc30e5 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -116,8 +116,8 @@ "cross-fetch": "^4.0.0", "history": "^5.0.0", "msw": "^1.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json index 876457b939..e9e46a8064 100644 --- a/packages/core-plugin-api/package.json +++ b/packages/core-plugin-api/package.json @@ -64,8 +64,8 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/create-app/templates/default-app/packages/app/package.json.hbs b/packages/create-app/templates/default-app/packages/app/package.json.hbs index 0601a3a4e3..6415b25771 100644 --- a/packages/create-app/templates/default-app/packages/app/package.json.hbs +++ b/packages/create-app/templates/default-app/packages/app/package.json.hbs @@ -41,8 +41,8 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "history": "^5.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router": "^6.3.0", "react-router-dom": "^6.3.0", "react-use": "^17.2.4" diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index a45f63324e..d8fa50b1ee 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -56,8 +56,8 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0", "zen-observable": "^0.10.0" }, diff --git a/packages/frontend-app-api/package.json b/packages/frontend-app-api/package.json index ec5463642b..26473d0dea 100644 --- a/packages/frontend-app-api/package.json +++ b/packages/frontend-app-api/package.json @@ -52,8 +52,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^15.0.0", "@types/react": "^18.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/frontend-defaults/package.json b/packages/frontend-defaults/package.json index 7d78dc5410..9443f63f66 100644 --- a/packages/frontend-defaults/package.json +++ b/packages/frontend-defaults/package.json @@ -44,9 +44,21 @@ "@backstage/core-plugin-api": "workspace:^", "@backstage/test-utils": "workspace:^", "@testing-library/jest-dom": "^6.0.0", - "@testing-library/react": "^16.0.0" + "@testing-library/react": "^16.0.0", + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0 || ^18.0.0" + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/packages/frontend-plugin-api/package.json b/packages/frontend-plugin-api/package.json index 309ebacc04..43509a6132 100644 --- a/packages/frontend-plugin-api/package.json +++ b/packages/frontend-plugin-api/package.json @@ -49,8 +49,8 @@ "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", "history": "^5.3.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/frontend-test-utils/package.json b/packages/frontend-test-utils/package.json index b8973bc5bd..7ebf1eb4f0 100644 --- a/packages/frontend-test-utils/package.json +++ b/packages/frontend-test-utils/package.json @@ -44,8 +44,8 @@ "@backstage/cli": "workspace:^", "@testing-library/jest-dom": "^6.0.0", "@types/react": "^18.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index 5911006c7e..f426ec4a01 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -48,8 +48,8 @@ "@testing-library/jest-dom": "^6.0.0", "@types/react": "^18.0.0", "msw": "^1.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/repo-tools/src/commands/peer-deps/peer-deps.ts b/packages/repo-tools/src/commands/peer-deps/peer-deps.ts index 9544b3b457..c433dd8581 100644 --- a/packages/repo-tools/src/commands/peer-deps/peer-deps.ts +++ b/packages/repo-tools/src/commands/peer-deps/peer-deps.ts @@ -191,7 +191,7 @@ export default async ({ fix }: { fix: boolean }) => { if (fix) { writeFileSync( resolvePath(pkg.dir, 'package.json'), - JSON.stringify(packageJson, null, 4), + `${JSON.stringify(packageJson, null, 2)}\n`, ); } } diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index 00baa817d6..5a6d51bad3 100644 --- a/packages/techdocs-cli-embedded-app/package.json +++ b/packages/techdocs-cli-embedded-app/package.json @@ -48,8 +48,8 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "history": "^5.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0", "react-use": "^17.2.4" }, diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index f31595084c..dc2713ff09 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -67,8 +67,8 @@ "@testing-library/jest-dom": "^6.0.0", "@types/react": "^18.0.0", "msw": "^1.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/theme/package.json b/packages/theme/package.json index 17b655ca52..435f517326 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -46,8 +46,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/version-bridge/package.json b/packages/version-bridge/package.json index aea9d122bf..50a5883b15 100644 --- a/packages/version-bridge/package.json +++ b/packages/version-bridge/package.json @@ -40,8 +40,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/api-docs-module-protoc-gen-doc/package.json b/plugins/api-docs-module-protoc-gen-doc/package.json index 1c533b7885..f41fe2f9fb 100644 --- a/plugins/api-docs-module-protoc-gen-doc/package.json +++ b/plugins/api-docs-module-protoc-gen-doc/package.json @@ -43,8 +43,8 @@ "@backstage/cli": "workspace:^", "@testing-library/jest-dom": "^6.0.0", "@types/react": "^18.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index 79c2320563..f9888ed99c 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -86,8 +86,8 @@ "@types/highlightjs": "^10.1.0", "@types/react": "^18.0.0", "@types/swagger-ui-react": "^4.18.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/app-visualizer/package.json b/plugins/app-visualizer/package.json index e9e6568210..53720d560a 100644 --- a/plugins/app-visualizer/package.json +++ b/plugins/app-visualizer/package.json @@ -43,8 +43,8 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@types/react": "^18.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/app/package.json b/plugins/app/package.json index 39459854d0..14854539b0 100644 --- a/plugins/app/package.json +++ b/plugins/app/package.json @@ -55,11 +55,21 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", + "@types/react": "^18.0.0", "msw": "^1.0.0", - "react": "^16.13.1 || ^17.0.0 || ^18.0.0" + "react": "^^18.0.0", + "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/plugins/auth-react/package.json b/plugins/auth-react/package.json index 5bb99f0c8d..995d9adecf 100644 --- a/plugins/auth-react/package.json +++ b/plugins/auth-react/package.json @@ -52,8 +52,8 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "msw": "^1.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index c444cd755f..e6e4b5651d 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -77,8 +77,8 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index 277e259458..1dbfac3179 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -89,8 +89,8 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "msw": "^1.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index 34728f38a0..5d8d0e7da6 100644 --- a/plugins/catalog-react/package.json +++ b/plugins/catalog-react/package.json @@ -95,8 +95,8 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "@types/zen-observable": "^0.8.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0", "react-test-renderer": "^16.13.1" }, diff --git a/plugins/catalog-unprocessed-entities/package.json b/plugins/catalog-unprocessed-entities/package.json index fe7857091a..a0e652bc03 100644 --- a/plugins/catalog-unprocessed-entities/package.json +++ b/plugins/catalog-unprocessed-entities/package.json @@ -53,8 +53,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index 1c159af6ce..2b8e0484b7 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -98,8 +98,8 @@ "@testing-library/user-event": "^14.0.0", "@types/pluralize": "^0.0.33", "@types/react": "^18.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0", "swr": "^2.2.5" }, diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json index bd29c74543..643f7ac765 100644 --- a/plugins/config-schema/package.json +++ b/plugins/config-schema/package.json @@ -55,8 +55,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/devtools/package.json b/plugins/devtools/package.json index 66679a712d..62a838f8fa 100644 --- a/plugins/devtools/package.json +++ b/plugins/devtools/package.json @@ -69,8 +69,8 @@ "@backstage/dev-utils": "workspace:^", "@testing-library/jest-dom": "^6.0.0", "@types/react": "^18.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json index feda571385..4776fc2553 100644 --- a/plugins/example-todo-list/package.json +++ b/plugins/example-todo-list/package.json @@ -51,8 +51,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/home-react/package.json b/plugins/home-react/package.json index e68f20c51e..0a3edf65d4 100644 --- a/plugins/home-react/package.json +++ b/plugins/home-react/package.json @@ -52,8 +52,8 @@ "@backstage/cli": "workspace:^", "@types/react": "^18.0.0", "@types/react-grid-layout": "^1.3.2", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/home/package.json b/plugins/home/package.json index 38a12f7fcc..8dc5bc3b68 100644 --- a/plugins/home/package.json +++ b/plugins/home/package.json @@ -91,8 +91,8 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "@types/react-grid-layout": "^1.3.2", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/kubernetes-cluster/package.json b/plugins/kubernetes-cluster/package.json index 4f4796007d..21087fd0b7 100644 --- a/plugins/kubernetes-cluster/package.json +++ b/plugins/kubernetes-cluster/package.json @@ -66,8 +66,8 @@ "@testing-library/react": "^16.0.0", "@types/node": "^16.11.26", "@types/react": "^18.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/kubernetes-react/package.json b/plugins/kubernetes-react/package.json index b18794f564..879507fbe4 100644 --- a/plugins/kubernetes-react/package.json +++ b/plugins/kubernetes-react/package.json @@ -72,8 +72,8 @@ "@types/react": "^18.0.0", "jest-websocket-mock": "^2.5.0", "msw": "^1.3.1", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index f28b4d248a..940054aa65 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -87,8 +87,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/notifications/package.json b/plugins/notifications/package.json index cb16e1cb96..aafdf2476e 100644 --- a/plugins/notifications/package.json +++ b/plugins/notifications/package.json @@ -65,8 +65,8 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "msw": "^1.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json index b96a6f8e27..e31864e158 100644 --- a/plugins/org-react/package.json +++ b/plugins/org-react/package.json @@ -59,8 +59,8 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/org/package.json b/plugins/org/package.json index f44b6900da..cae8a2d11a 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -82,8 +82,8 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/permission-react/package.json b/plugins/permission-react/package.json index cf012d1ead..65732d8c89 100644 --- a/plugins/permission-react/package.json +++ b/plugins/permission-react/package.json @@ -53,8 +53,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index 96c3907c46..f3e8eccdbb 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -107,8 +107,8 @@ "@types/humanize-duration": "^3.18.1", "@types/luxon": "^3.0.0", "@types/react": "^18.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0", "swr": "^2.0.0" }, diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index 01c7dacf66..e69cf0e223 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -121,8 +121,8 @@ "@types/react-resizable": "^3.0.8", "@types/react-window": "^1.8.8", "msw": "^1.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0", "swr": "^2.0.0" }, diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json index 6e942e1dbb..6df72cee7d 100644 --- a/plugins/search-react/package.json +++ b/plugins/search-react/package.json @@ -81,8 +81,8 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/search/package.json b/plugins/search/package.json index 657ea72def..dba2742ca2 100644 --- a/plugins/search/package.json +++ b/plugins/search/package.json @@ -84,8 +84,8 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "history": "^5.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/signals-react/package.json b/plugins/signals-react/package.json index bd9d862fd4..dad70cff02 100644 --- a/plugins/signals-react/package.json +++ b/plugins/signals-react/package.json @@ -49,8 +49,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/signals/package.json b/plugins/signals/package.json index 51913117a2..f87647d356 100644 --- a/plugins/signals/package.json +++ b/plugins/signals/package.json @@ -60,8 +60,8 @@ "@types/react": "^18.0.0", "jest-websocket-mock": "^2.5.0", "msw": "^1.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index 949c9addf3..4984bbdced 100644 --- a/plugins/techdocs-addons-test-utils/package.json +++ b/plugins/techdocs-addons-test-utils/package.json @@ -56,8 +56,8 @@ "@testing-library/dom": "^10.0.0", "@testing-library/jest-dom": "^6.0.0", "@types/react": "^18.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index 951bd8f432..59976dde8c 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -58,8 +58,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json index 370c1ff110..73cab1645e 100644 --- a/plugins/techdocs-react/package.json +++ b/plugins/techdocs-react/package.json @@ -64,8 +64,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index 86a491ab24..dec637779c 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -101,8 +101,8 @@ "@types/event-source-polyfill": "^1.0.0", "@types/react": "^18.0.0", "canvas": "^2.10.2", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index 5322e813fa..ee79710815 100644 --- a/plugins/user-settings/package.json +++ b/plugins/user-settings/package.json @@ -83,8 +83,8 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "msw": "^1.0.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/storybook/package.json b/storybook/package.json index 60ccd0d4ea..43c7b60130 100644 --- a/storybook/package.json +++ b/storybook/package.json @@ -12,8 +12,8 @@ }, "dependencies": { "@swc/core": "^1.3.46", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-hot-loader": "^4.13.0", "react-router-dom": "^6.25.1", "swc-loader": "^0.2.3" From 5129ad066936e954191cf90fcd880be9dd115cd0 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Tue, 24 Sep 2024 21:12:19 -0400 Subject: [PATCH 042/217] standard react version Signed-off-by: aramissennyeydd --- microsite/package.json | 4 ++-- packages/app-defaults/package.json | 4 ++-- packages/app-next-example-plugin/package.json | 4 ++-- packages/app-next/package.json | 4 ++-- packages/app/package.json | 4 ++-- packages/core-app-api/package.json | 4 ++-- packages/core-compat-api/package.json | 4 ++-- packages/core-components/package.json | 4 ++-- packages/core-plugin-api/package.json | 4 ++-- .../templates/default-app/packages/app/package.json.hbs | 4 ++-- packages/dev-utils/package.json | 4 ++-- packages/frontend-app-api/package.json | 4 ++-- packages/frontend-defaults/package.json | 4 ++-- packages/frontend-plugin-api/package.json | 4 ++-- packages/frontend-test-utils/package.json | 4 ++-- packages/integration-react/package.json | 4 ++-- packages/techdocs-cli-embedded-app/package.json | 4 ++-- packages/test-utils/package.json | 4 ++-- packages/theme/package.json | 4 ++-- packages/version-bridge/package.json | 4 ++-- plugins/api-docs-module-protoc-gen-doc/package.json | 4 ++-- plugins/api-docs/package.json | 4 ++-- plugins/app-visualizer/package.json | 4 ++-- plugins/auth-react/package.json | 4 ++-- plugins/catalog-graph/package.json | 4 ++-- plugins/catalog-import/package.json | 4 ++-- plugins/catalog-react/package.json | 4 ++-- plugins/catalog-unprocessed-entities/package.json | 4 ++-- plugins/catalog/package.json | 4 ++-- plugins/config-schema/package.json | 4 ++-- plugins/devtools/package.json | 4 ++-- plugins/example-todo-list/package.json | 4 ++-- plugins/home-react/package.json | 4 ++-- plugins/home/package.json | 4 ++-- plugins/kubernetes-cluster/package.json | 4 ++-- plugins/kubernetes-react/package.json | 4 ++-- plugins/kubernetes/package.json | 4 ++-- plugins/notifications/package.json | 4 ++-- plugins/org-react/package.json | 4 ++-- plugins/org/package.json | 4 ++-- plugins/permission-react/package.json | 4 ++-- plugins/scaffolder-react/package.json | 4 ++-- plugins/scaffolder/package.json | 4 ++-- plugins/search-react/package.json | 4 ++-- plugins/search/package.json | 4 ++-- plugins/signals-react/package.json | 4 ++-- plugins/signals/package.json | 4 ++-- plugins/techdocs-addons-test-utils/package.json | 4 ++-- plugins/techdocs-module-addons-contrib/package.json | 4 ++-- plugins/techdocs-react/package.json | 4 ++-- plugins/techdocs/package.json | 4 ++-- plugins/user-settings/package.json | 4 ++-- storybook/package.json | 4 ++-- 53 files changed, 106 insertions(+), 106 deletions(-) diff --git a/microsite/package.json b/microsite/package.json index fc3405c744..728cef0d96 100644 --- a/microsite/package.json +++ b/microsite/package.json @@ -30,8 +30,8 @@ "docusaurus-pushfeedback": "^1.0.0", "luxon": "^3.0.0", "prism-react-renderer": "^2.1.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "sass": "^1.57.1", "swc-loader": "^0.2.3" }, diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json index 5865cb3f43..1865c856b7 100644 --- a/packages/app-defaults/package.json +++ b/packages/app-defaults/package.json @@ -50,8 +50,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/app-next-example-plugin/package.json b/packages/app-next-example-plugin/package.json index dc477e31ec..56374b384c 100644 --- a/packages/app-next-example-plugin/package.json +++ b/packages/app-next-example-plugin/package.json @@ -50,8 +50,8 @@ "@types/react": "^18.0.0", "cross-fetch": "^4.0.0", "msw": "^1.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/app-next/package.json b/packages/app-next/package.json index da3ab3d184..29f9105031 100644 --- a/packages/app-next/package.json +++ b/packages/app-next/package.json @@ -78,8 +78,8 @@ "@material-ui/lab": "4.0.0-alpha.61", "@octokit/rest": "^19.0.3", "history": "^5.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router": "^6.3.0", "react-router-dom": "^6.3.0", "react-use": "^17.2.4", diff --git a/packages/app/package.json b/packages/app/package.json index 02e6a8673b..15cdd85d32 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -76,8 +76,8 @@ "@octokit/rest": "^19.0.3", "@vitejs/plugin-react": "^4.3.1", "history": "^5.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router": "^6.3.0", "react-router-dom": "^6.3.0", "react-use": "^17.2.4", diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json index d1c9f0a053..6d443606b0 100644 --- a/packages/core-app-api/package.json +++ b/packages/core-app-api/package.json @@ -70,8 +70,8 @@ "@types/react": "^18.0.0", "@types/zen-observable": "^0.8.0", "msw": "^1.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-beta": "npm:react-router@6.0.0-beta.0", "react-router-dom": "^6.3.0", "react-router-dom-beta": "npm:react-router-dom@6.0.0-beta.0", diff --git a/packages/core-compat-api/package.json b/packages/core-compat-api/package.json index d7f4848c4a..cbb8fc3592 100644 --- a/packages/core-compat-api/package.json +++ b/packages/core-compat-api/package.json @@ -49,8 +49,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0", "zod": "^3.22.4" }, diff --git a/packages/core-components/package.json b/packages/core-components/package.json index fc9ebc30e5..30699ad7a1 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -116,8 +116,8 @@ "cross-fetch": "^4.0.0", "history": "^5.0.0", "msw": "^1.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json index e9e46a8064..876457b939 100644 --- a/packages/core-plugin-api/package.json +++ b/packages/core-plugin-api/package.json @@ -64,8 +64,8 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/create-app/templates/default-app/packages/app/package.json.hbs b/packages/create-app/templates/default-app/packages/app/package.json.hbs index 6415b25771..0601a3a4e3 100644 --- a/packages/create-app/templates/default-app/packages/app/package.json.hbs +++ b/packages/create-app/templates/default-app/packages/app/package.json.hbs @@ -41,8 +41,8 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "history": "^5.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router": "^6.3.0", "react-router-dom": "^6.3.0", "react-use": "^17.2.4" diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index d8fa50b1ee..a45f63324e 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -56,8 +56,8 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0", "zen-observable": "^0.10.0" }, diff --git a/packages/frontend-app-api/package.json b/packages/frontend-app-api/package.json index 26473d0dea..ec5463642b 100644 --- a/packages/frontend-app-api/package.json +++ b/packages/frontend-app-api/package.json @@ -52,8 +52,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^15.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/frontend-defaults/package.json b/packages/frontend-defaults/package.json index 9443f63f66..651b04258d 100644 --- a/packages/frontend-defaults/package.json +++ b/packages/frontend-defaults/package.json @@ -46,8 +46,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/frontend-plugin-api/package.json b/packages/frontend-plugin-api/package.json index 43509a6132..309ebacc04 100644 --- a/packages/frontend-plugin-api/package.json +++ b/packages/frontend-plugin-api/package.json @@ -49,8 +49,8 @@ "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", "history": "^5.3.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/frontend-test-utils/package.json b/packages/frontend-test-utils/package.json index 7ebf1eb4f0..b8973bc5bd 100644 --- a/packages/frontend-test-utils/package.json +++ b/packages/frontend-test-utils/package.json @@ -44,8 +44,8 @@ "@backstage/cli": "workspace:^", "@testing-library/jest-dom": "^6.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index f426ec4a01..5911006c7e 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -48,8 +48,8 @@ "@testing-library/jest-dom": "^6.0.0", "@types/react": "^18.0.0", "msw": "^1.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index 5a6d51bad3..00baa817d6 100644 --- a/packages/techdocs-cli-embedded-app/package.json +++ b/packages/techdocs-cli-embedded-app/package.json @@ -48,8 +48,8 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "history": "^5.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0", "react-use": "^17.2.4" }, diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index dc2713ff09..f31595084c 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -67,8 +67,8 @@ "@testing-library/jest-dom": "^6.0.0", "@types/react": "^18.0.0", "msw": "^1.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/theme/package.json b/packages/theme/package.json index 435f517326..17b655ca52 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -46,8 +46,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/packages/version-bridge/package.json b/packages/version-bridge/package.json index 50a5883b15..aea9d122bf 100644 --- a/packages/version-bridge/package.json +++ b/packages/version-bridge/package.json @@ -40,8 +40,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/api-docs-module-protoc-gen-doc/package.json b/plugins/api-docs-module-protoc-gen-doc/package.json index f41fe2f9fb..1c533b7885 100644 --- a/plugins/api-docs-module-protoc-gen-doc/package.json +++ b/plugins/api-docs-module-protoc-gen-doc/package.json @@ -43,8 +43,8 @@ "@backstage/cli": "workspace:^", "@testing-library/jest-dom": "^6.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index f9888ed99c..79c2320563 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -86,8 +86,8 @@ "@types/highlightjs": "^10.1.0", "@types/react": "^18.0.0", "@types/swagger-ui-react": "^4.18.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/app-visualizer/package.json b/plugins/app-visualizer/package.json index 53720d560a..e9e6568210 100644 --- a/plugins/app-visualizer/package.json +++ b/plugins/app-visualizer/package.json @@ -43,8 +43,8 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/auth-react/package.json b/plugins/auth-react/package.json index 995d9adecf..5bb99f0c8d 100644 --- a/plugins/auth-react/package.json +++ b/plugins/auth-react/package.json @@ -52,8 +52,8 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "msw": "^1.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index e6e4b5651d..c444cd755f 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -77,8 +77,8 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index 1dbfac3179..277e259458 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -89,8 +89,8 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "msw": "^1.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index 5d8d0e7da6..34728f38a0 100644 --- a/plugins/catalog-react/package.json +++ b/plugins/catalog-react/package.json @@ -95,8 +95,8 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "@types/zen-observable": "^0.8.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0", "react-test-renderer": "^16.13.1" }, diff --git a/plugins/catalog-unprocessed-entities/package.json b/plugins/catalog-unprocessed-entities/package.json index a0e652bc03..fe7857091a 100644 --- a/plugins/catalog-unprocessed-entities/package.json +++ b/plugins/catalog-unprocessed-entities/package.json @@ -53,8 +53,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index 2b8e0484b7..1c159af6ce 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -98,8 +98,8 @@ "@testing-library/user-event": "^14.0.0", "@types/pluralize": "^0.0.33", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0", "swr": "^2.2.5" }, diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json index 643f7ac765..bd29c74543 100644 --- a/plugins/config-schema/package.json +++ b/plugins/config-schema/package.json @@ -55,8 +55,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/devtools/package.json b/plugins/devtools/package.json index 62a838f8fa..66679a712d 100644 --- a/plugins/devtools/package.json +++ b/plugins/devtools/package.json @@ -69,8 +69,8 @@ "@backstage/dev-utils": "workspace:^", "@testing-library/jest-dom": "^6.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json index 4776fc2553..feda571385 100644 --- a/plugins/example-todo-list/package.json +++ b/plugins/example-todo-list/package.json @@ -51,8 +51,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/home-react/package.json b/plugins/home-react/package.json index 0a3edf65d4..e68f20c51e 100644 --- a/plugins/home-react/package.json +++ b/plugins/home-react/package.json @@ -52,8 +52,8 @@ "@backstage/cli": "workspace:^", "@types/react": "^18.0.0", "@types/react-grid-layout": "^1.3.2", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/home/package.json b/plugins/home/package.json index 8dc5bc3b68..38a12f7fcc 100644 --- a/plugins/home/package.json +++ b/plugins/home/package.json @@ -91,8 +91,8 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "@types/react-grid-layout": "^1.3.2", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/kubernetes-cluster/package.json b/plugins/kubernetes-cluster/package.json index 21087fd0b7..4f4796007d 100644 --- a/plugins/kubernetes-cluster/package.json +++ b/plugins/kubernetes-cluster/package.json @@ -66,8 +66,8 @@ "@testing-library/react": "^16.0.0", "@types/node": "^16.11.26", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/kubernetes-react/package.json b/plugins/kubernetes-react/package.json index 879507fbe4..b18794f564 100644 --- a/plugins/kubernetes-react/package.json +++ b/plugins/kubernetes-react/package.json @@ -72,8 +72,8 @@ "@types/react": "^18.0.0", "jest-websocket-mock": "^2.5.0", "msw": "^1.3.1", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index 940054aa65..f28b4d248a 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -87,8 +87,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/notifications/package.json b/plugins/notifications/package.json index aafdf2476e..cb16e1cb96 100644 --- a/plugins/notifications/package.json +++ b/plugins/notifications/package.json @@ -65,8 +65,8 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "msw": "^1.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json index e31864e158..b96a6f8e27 100644 --- a/plugins/org-react/package.json +++ b/plugins/org-react/package.json @@ -59,8 +59,8 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/org/package.json b/plugins/org/package.json index cae8a2d11a..f44b6900da 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -82,8 +82,8 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/permission-react/package.json b/plugins/permission-react/package.json index 65732d8c89..cf012d1ead 100644 --- a/plugins/permission-react/package.json +++ b/plugins/permission-react/package.json @@ -53,8 +53,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index f3e8eccdbb..96c3907c46 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -107,8 +107,8 @@ "@types/humanize-duration": "^3.18.1", "@types/luxon": "^3.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0", "swr": "^2.0.0" }, diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index e69cf0e223..01c7dacf66 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -121,8 +121,8 @@ "@types/react-resizable": "^3.0.8", "@types/react-window": "^1.8.8", "msw": "^1.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0", "swr": "^2.0.0" }, diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json index 6df72cee7d..6e942e1dbb 100644 --- a/plugins/search-react/package.json +++ b/plugins/search-react/package.json @@ -81,8 +81,8 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/search/package.json b/plugins/search/package.json index dba2742ca2..657ea72def 100644 --- a/plugins/search/package.json +++ b/plugins/search/package.json @@ -84,8 +84,8 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "history": "^5.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/signals-react/package.json b/plugins/signals-react/package.json index dad70cff02..bd9d862fd4 100644 --- a/plugins/signals-react/package.json +++ b/plugins/signals-react/package.json @@ -49,8 +49,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/signals/package.json b/plugins/signals/package.json index f87647d356..51913117a2 100644 --- a/plugins/signals/package.json +++ b/plugins/signals/package.json @@ -60,8 +60,8 @@ "@types/react": "^18.0.0", "jest-websocket-mock": "^2.5.0", "msw": "^1.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index 4984bbdced..949c9addf3 100644 --- a/plugins/techdocs-addons-test-utils/package.json +++ b/plugins/techdocs-addons-test-utils/package.json @@ -56,8 +56,8 @@ "@testing-library/dom": "^10.0.0", "@testing-library/jest-dom": "^6.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index 59976dde8c..951bd8f432 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -58,8 +58,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json index 73cab1645e..370c1ff110 100644 --- a/plugins/techdocs-react/package.json +++ b/plugins/techdocs-react/package.json @@ -64,8 +64,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index dec637779c..86a491ab24 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -101,8 +101,8 @@ "@types/event-source-polyfill": "^1.0.0", "@types/react": "^18.0.0", "canvas": "^2.10.2", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index ee79710815..5322e813fa 100644 --- a/plugins/user-settings/package.json +++ b/plugins/user-settings/package.json @@ -83,8 +83,8 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "msw": "^1.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/storybook/package.json b/storybook/package.json index 43c7b60130..60ccd0d4ea 100644 --- a/storybook/package.json +++ b/storybook/package.json @@ -12,8 +12,8 @@ }, "dependencies": { "@swc/core": "^1.3.46", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-hot-loader": "^4.13.0", "react-router-dom": "^6.25.1", "swc-loader": "^0.2.3" From 727c717f92d49998e77f8a35372b0598dca85217 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Tue, 24 Sep 2024 21:32:06 -0400 Subject: [PATCH 043/217] ensure changes work with latest master Signed-off-by: aramissennyeydd --- microsite/package.json | 4 +- packages/core-compat-api/package.json | 3 +- .../ErrorBoundary/ErrorBoundary.test.tsx | 3 +- packages/frontend-app-api/package.json | 6 +-- packages/frontend-defaults/package.json | 3 +- .../src/commands/peer-deps/peer-deps.ts | 39 ++++++++++++++++++- .../techdocs-cli-embedded-app/package.json | 4 +- packages/version-bridge/package.json | 1 + plugins/app/package.json | 5 +-- plugins/kubernetes/package.json | 1 - .../scaffolder-node-test-utils/package.json | 17 +++++++- plugins/techdocs/package.json | 1 - 12 files changed, 67 insertions(+), 20 deletions(-) diff --git a/microsite/package.json b/microsite/package.json index 728cef0d96..fc3405c744 100644 --- a/microsite/package.json +++ b/microsite/package.json @@ -30,8 +30,8 @@ "docusaurus-pushfeedback": "^1.0.0", "luxon": "^3.0.0", "prism-react-renderer": "^2.1.0", - "react": "^18.0.2", - "react-dom": "^18.0.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", "sass": "^1.57.1", "swc-loader": "^0.2.3" }, diff --git a/packages/core-compat-api/package.json b/packages/core-compat-api/package.json index cbb8fc3592..6863f65a0c 100644 --- a/packages/core-compat-api/package.json +++ b/packages/core-compat-api/package.json @@ -33,7 +33,8 @@ "dependencies": { "@backstage/core-plugin-api": "workspace:^", "@backstage/frontend-plugin-api": "workspace:^", - "@backstage/version-bridge": "workspace:^" + "@backstage/version-bridge": "workspace:^", + "lodash": "^4.17.21" }, "devDependencies": { "@backstage-community/plugin-puppetdb": "^0.1.18", diff --git a/packages/core-components/src/layout/ErrorBoundary/ErrorBoundary.test.tsx b/packages/core-components/src/layout/ErrorBoundary/ErrorBoundary.test.tsx index 8bfb228f53..c96ab67782 100644 --- a/packages/core-components/src/layout/ErrorBoundary/ErrorBoundary.test.tsx +++ b/packages/core-components/src/layout/ErrorBoundary/ErrorBoundary.test.tsx @@ -77,7 +77,8 @@ describe('', () => { /^The above error occurred in the component:/, ), expect.stringMatching(/^ErrorBoundary/), + expect.stringMatching(/Warning: findDOMNode/), // React warning, unfortunate but currently true ]); - expect(error.length).toEqual(4); + expect(error.length).toEqual(5); }); }); diff --git a/packages/frontend-app-api/package.json b/packages/frontend-app-api/package.json index ec5463642b..674556d144 100644 --- a/packages/frontend-app-api/package.json +++ b/packages/frontend-app-api/package.json @@ -40,17 +40,15 @@ "@backstage/frontend-plugin-api": "workspace:^", "@backstage/types": "workspace:^", "@backstage/version-bridge": "workspace:^", - "@material-ui/core": "^4.12.4", - "@material-ui/icons": "^4.11.3", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "lodash": "^4.17.21", "zod": "^3.22.4" }, "devDependencies": { "@backstage/cli": "workspace:^", + "@backstage/plugin-app": "workspace:^", "@backstage/test-utils": "workspace:^", "@testing-library/jest-dom": "^6.0.0", - "@testing-library/react": "^15.0.0", + "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", "react": "^18.0.2", "react-dom": "^18.0.2", diff --git a/packages/frontend-defaults/package.json b/packages/frontend-defaults/package.json index 651b04258d..8f8abb0512 100644 --- a/packages/frontend-defaults/package.json +++ b/packages/frontend-defaults/package.json @@ -36,8 +36,7 @@ "@backstage/frontend-app-api": "workspace:^", "@backstage/frontend-plugin-api": "workspace:^", "@backstage/plugin-app": "workspace:^", - "@react-hookz/web": "^24.0.0", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0" + "@react-hookz/web": "^24.0.0" }, "devDependencies": { "@backstage/cli": "workspace:^", diff --git a/packages/repo-tools/src/commands/peer-deps/peer-deps.ts b/packages/repo-tools/src/commands/peer-deps/peer-deps.ts index c433dd8581..70e566dd32 100644 --- a/packages/repo-tools/src/commands/peer-deps/peer-deps.ts +++ b/packages/repo-tools/src/commands/peer-deps/peer-deps.ts @@ -27,8 +27,8 @@ type ExtendedPackageJSON = Package['packageJson'] & { const desiredLocalVersionsOfDependencies = { '@types/react': '^18.0.0', - react: '^18.0.0', - 'react-dom': '^18.0.0', + react: '^18.0.2', + 'react-dom': '^18.0.2', 'react-router-dom': '^6.3.0', }; @@ -55,6 +55,10 @@ const isDevDependency = (dep: string, packageJson: ExtendedPackageJSON) => { return !!packageJson.devDependencies?.[dep]; }; +const isProdDependency = (dep: string, packageJson: ExtendedPackageJSON) => { + return !!packageJson.dependencies?.[dep]; +}; + const isPeerDependency = (dep: string, packageJson: ExtendedPackageJSON) => { return !!packageJson.peerDependencies?.[dep]; }; @@ -65,6 +69,16 @@ const isStandaloneApplication = (packageJson: ExtendedPackageJSON) => { ); }; +const matchesDependency = (dep: string, packageJson: ExtendedPackageJSON) => { + return ( + packageJson.devDependencies && + packageJson.devDependencies[dep] === + desiredLocalVersionsOfDependencies[ + dep as keyof typeof desiredLocalVersionsOfDependencies + ] + ); +}; + const matchesPeerDependency = ( dep: string, packageJson: ExtendedPackageJSON, @@ -138,12 +152,20 @@ export default async ({ fix }: { fix: boolean }) => { `Peer dependency ${dep} in ${pkg.packageJson.name} is not listed as a devDependency`, ); attemptToApplyFix(() => { + delete packageJson.dependencies?.[dep]; packageJson.devDependencies = packageJson.devDependencies || {}; packageJson.devDependencies[dep] = desiredLocalVersionsOfDependencies[ dep as keyof typeof desiredLocalVersionsOfDependencies ]; }); + } else if (isProdDependency(dep, packageJson)) { + console.error( + `Peer dependency ${dep} in ${pkg.packageJson.name} is listed as a dependency`, + ); + attemptToApplyFix(() => { + delete packageJson.dependencies?.[dep]; + }); } const groups = groupsOfPeerDependencies.filter(group => @@ -167,6 +189,19 @@ export default async ({ fix }: { fix: boolean }) => { } } + if (!matchesDependency(dep, packageJson)) { + console.error( + `Incorrect dependency ${dep} in ${pkg.packageJson.name}`, + ); + attemptToApplyFix(() => { + packageJson.devDependencies = packageJson.devDependencies || {}; + packageJson.devDependencies[dep] = + desiredLocalVersionsOfDependencies[ + dep as keyof typeof desiredLocalVersionsOfDependencies + ]; + }); + } + if (!matchesPeerDependency(dep, packageJson)) { console.error( `Incorrect peer dependency ${dep} in ${pkg.packageJson.name}`, diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index 00baa817d6..249ec2f062 100644 --- a/packages/techdocs-cli-embedded-app/package.json +++ b/packages/techdocs-cli-embedded-app/package.json @@ -59,8 +59,8 @@ "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", + "@types/react": "*", + "@types/react-dom": "*", "cross-env": "^7.0.0" }, "bundled": true diff --git a/packages/version-bridge/package.json b/packages/version-bridge/package.json index aea9d122bf..b7aaab34f8 100644 --- a/packages/version-bridge/package.json +++ b/packages/version-bridge/package.json @@ -35,6 +35,7 @@ "start": "backstage-cli package start", "test": "backstage-cli package test" }, + "dependencies": {}, "devDependencies": { "@backstage/cli": "workspace:^", "@testing-library/jest-dom": "^6.0.0", diff --git a/plugins/app/package.json b/plugins/app/package.json index 14854539b0..ed33051043 100644 --- a/plugins/app/package.json +++ b/plugins/app/package.json @@ -45,7 +45,6 @@ "@material-ui/core": "^4.9.13", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "^4.0.0-alpha.61", - "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-use": "^17.2.4" }, "devDependencies": { @@ -57,8 +56,8 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "^18.0.0", "msw": "^1.0.0", - "react": "^^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router-dom": "^6.3.0" }, "peerDependencies": { diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index f28b4d248a..b8ef59db90 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -92,7 +92,6 @@ "react-router-dom": "^6.3.0" }, "peerDependencies": { - "@testing-library/react": "^16.0.0", "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/plugins/scaffolder-node-test-utils/package.json b/plugins/scaffolder-node-test-utils/package.json index dc71447bd9..a372dbc317 100644 --- a/plugins/scaffolder-node-test-utils/package.json +++ b/plugins/scaffolder-node-test-utils/package.json @@ -46,6 +46,21 @@ "@backstage/types": "workspace:^" }, "devDependencies": { - "@backstage/cli": "workspace:^" + "@backstage/cli": "workspace:^", + "@types/react": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", + "react-router-dom": "^6.3.0" + }, + "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0 || ^18.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } } diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index 86a491ab24..8fe9b71c1c 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -98,7 +98,6 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/dompurify": "^3.0.0", - "@types/event-source-polyfill": "^1.0.0", "@types/react": "^18.0.0", "canvas": "^2.10.2", "react": "^18.0.2", From 866c7c44240b1b7c0ec908cbb5b1e4c7c0dba1c1 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Tue, 24 Sep 2024 21:43:32 -0400 Subject: [PATCH 044/217] update lockfile Signed-off-by: aramissennyeydd --- packages/version-bridge/package.json | 1 - yarn.lock | 79 ++++++++++++++-------------- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/packages/version-bridge/package.json b/packages/version-bridge/package.json index b7aaab34f8..aea9d122bf 100644 --- a/packages/version-bridge/package.json +++ b/packages/version-bridge/package.json @@ -35,7 +35,6 @@ "start": "backstage-cli package start", "test": "backstage-cli package test" }, - "dependencies": {}, "devDependencies": { "@backstage/cli": "workspace:^", "@testing-library/jest-dom": "^6.0.0", diff --git a/yarn.lock b/yarn.lock index f7eb3d310b..4fbf2e2ad1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4192,8 +4192,9 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@types/react": ^18.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + lodash: ^4.17.21 + react: ^18.0.2 + react-dom: ^18.0.2 react-router-dom: ^6.3.0 zod: ^3.22.4 peerDependencies: @@ -4597,13 +4598,12 @@ __metadata: "@backstage/errors": "workspace:^" "@backstage/frontend-defaults": "workspace:^" "@backstage/frontend-plugin-api": "workspace:^" + "@backstage/plugin-app": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/types": "workspace:^" "@backstage/version-bridge": "workspace:^" - "@material-ui/core": ^4.12.4 - "@material-ui/icons": ^4.11.3 "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 + "@testing-library/react": ^16.0.0 "@types/react": ^18.0.0 lodash: ^4.17.21 react: ^18.0.2 @@ -4636,9 +4636,18 @@ __metadata: "@react-hookz/web": ^24.0.0 "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 + react-router-dom: ^6.3.0 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4973,13 +4982,20 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@testing-library/user-event": ^14.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^18.0.0 msw: ^1.0.0 - react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 + react-router-dom: ^6.3.0 react-use: ^17.2.4 peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -6825,7 +6841,6 @@ __metadata: xterm-addon-attach: ^0.9.0 xterm-addon-fit: ^0.8.0 peerDependencies: - "@testing-library/react": ^16.0.0 "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 react: ^16.13.1 || ^17.0.0 || ^18.0.0 react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 @@ -7598,6 +7613,18 @@ __metadata: "@backstage/cli": "workspace:^" "@backstage/plugin-scaffolder-node": "workspace:^" "@backstage/types": "workspace:^" + "@types/react": ^18.0.0 + react: ^18.0.2 + react-dom: ^18.0.2 + react-router-dom: ^6.3.0 + peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 || ^18.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 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -8377,7 +8404,6 @@ __metadata: "@testing-library/react": ^16.0.0 "@testing-library/user-event": ^14.0.0 "@types/dompurify": ^3.0.0 - "@types/event-source-polyfill": ^1.0.0 "@types/react": ^18.0.0 canvas: ^2.10.2 dompurify: ^3.0.0 @@ -17206,24 +17232,6 @@ __metadata: languageName: node linkType: hard -"@testing-library/react@npm:^15.0.0": - version: 15.0.7 - resolution: "@testing-library/react@npm:15.0.7" - dependencies: - "@babel/runtime": ^7.12.5 - "@testing-library/dom": ^10.0.0 - "@types/react-dom": ^18.0.0 - peerDependencies: - "@types/react": ^18.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: eb33fd82eb811bb8612aa154e430a2c1c251d5ed45a477ef57fe20095db494ea7dcfa6b1e1e2bffb0c7ee10c86e408745d95a879be8ca8fbe301bb91e5f2e5db - languageName: node - linkType: hard - "@testing-library/react@npm:^16.0.0": version: 16.0.1 resolution: "@testing-library/react@npm:16.0.1" @@ -17797,13 +17805,6 @@ __metadata: languageName: node linkType: hard -"@types/event-source-polyfill@npm:^1.0.0": - version: 1.0.5 - resolution: "@types/event-source-polyfill@npm:1.0.5" - checksum: f506b68710162f2ade1bccbc5691b8c67e5a703e565df2bc0b7b5be2637ba838ef81ec6c10b03248fe4d054386d95a6e827c7aace6e924986c2b9985f77b55de - languageName: node - linkType: hard - "@types/expect@npm:^1.20.4": version: 1.20.4 resolution: "@types/expect@npm:1.20.4" @@ -38502,7 +38503,7 @@ __metadata: languageName: node linkType: hard -"react-dom@npm:^18.0.0, react-dom@npm:^18.0.2": +"react-dom@npm:^18.0.2": version: 18.3.1 resolution: "react-dom@npm:18.3.1" dependencies: @@ -39086,7 +39087,7 @@ __metadata: languageName: node linkType: hard -"react@npm:^16.13.1 || ^17.0.0 || ^18.0.0, react@npm:^18.0.0, react@npm:^18.0.2": +"react@npm:^18.0.2": version: 18.3.1 resolution: "react@npm:18.3.1" dependencies: @@ -42318,8 +42319,8 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@testing-library/user-event": ^14.0.0 - "@types/react": ^18.0.0 - "@types/react-dom": ^18.0.0 + "@types/react": "*" + "@types/react-dom": "*" cross-env: ^7.0.0 history: ^5.0.0 react: ^18.0.2 From faacf235255936d3f4dfd813c523545a67eb5a3d Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Wed, 25 Sep 2024 10:44:28 +0530 Subject: [PATCH 045/217] Fixed grammar mistakes in the backstage accessibility docs Signed-off-by: AmbrishRamachandiran --- docs/accessibility/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/accessibility/index.md b/docs/accessibility/index.md index 021c8309be..810fc80e73 100644 --- a/docs/accessibility/index.md +++ b/docs/accessibility/index.md @@ -8,7 +8,7 @@ In an effort to bake accessibility practices further into our process of buildin ## How to contribute -There are multiple ways to contribute to making Backstage more accessible, you'll find below a list of examples to help you get started. +There are multiple ways to contribute to making Backstage more accessible; you'll find below a list of examples to help you get started. ### Run Lighthouse in CI on your plugin @@ -58,6 +58,6 @@ If your Backstage plugin lives outside of the [Backstage main repository](https: ### Report identified issues -It’s important to remember that automated checks can only catch a small number of accessibility issues, therefore we also encourage you to conduct manual testing of your plugins using Assistive technology (screen readers, alternative navigation, and screen magnifiers are a few examples). +It’s important to remember that automated checks can only catch a small number of accessibility issues; therefore, we also encourage you to conduct manual testing of your plugins using Assistive technology (screen readers, alternative navigation, and screen magnifiers are a few examples). If you have identified accessibility issues and don’t have time to contribute a fix, please open an issue over at [Backstage Issues](https://github.com/backstage/backstage/issues) to let us know. From bef41425475452302a004fe4b28c7dfba21dfe0e Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Wed, 25 Sep 2024 18:42:44 +0530 Subject: [PATCH 046/217] updated changes as per review Signed-off-by: AmbrishRamachandiran --- docs/accessibility/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/accessibility/index.md b/docs/accessibility/index.md index 810fc80e73..4073afcf4c 100644 --- a/docs/accessibility/index.md +++ b/docs/accessibility/index.md @@ -8,7 +8,7 @@ In an effort to bake accessibility practices further into our process of buildin ## How to contribute -There are multiple ways to contribute to making Backstage more accessible; you'll find below a list of examples to help you get started. +There are multiple ways to contribute to making Backstage more accessible, you'll find below a list of examples to help you get started. ### Run Lighthouse in CI on your plugin @@ -58,6 +58,6 @@ If your Backstage plugin lives outside of the [Backstage main repository](https: ### Report identified issues -It’s important to remember that automated checks can only catch a small number of accessibility issues; therefore, we also encourage you to conduct manual testing of your plugins using Assistive technology (screen readers, alternative navigation, and screen magnifiers are a few examples). +It’s important to remember that automated checks can only catch a small number of accessibility issues, therefore, we also encourage you to conduct manual testing of your plugins using Assistive technology (screen readers, alternative navigation, and screen magnifiers are a few examples). If you have identified accessibility issues and don’t have time to contribute a fix, please open an issue over at [Backstage Issues](https://github.com/backstage/backstage/issues) to let us know. From be88239ea039bf850c587a0473f2cf2a9b43900d Mon Sep 17 00:00:00 2001 From: bnechyporenko Date: Thu, 26 Sep 2024 08:17:12 +0200 Subject: [PATCH 047/217] Included only step id into check point key. Signed-off-by: bnechyporenko --- .../src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts | 4 ++-- .../src/scaffolder/tasks/NunjucksWorkflowRunner.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts index 8bce6fba17..44f8836fd1 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts @@ -601,11 +601,11 @@ describe('NunjucksWorkflowRunner', () => { return Promise.resolve({ state: { checkpoints: { - ['v1.task.checkpoint.name.test.key1']: { + ['v1.task.checkpoint.test.key1']: { status: 'success', value: 'initial', }, - ['v1.task.checkpoint.name.test2.key2']: { + ['v1.task.checkpoint.test2.key2']: { status: 'failed', reason: 'fatal error', }, diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index cfdd34365d..6de51ea3b6 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -375,7 +375,7 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { keySuffix: string, fn: () => Promise, ) { - const key = `v1.task.checkpoint.${step.name}.${step.id}.${keySuffix}`; + const key = `v1.task.checkpoint.${step.id}.${keySuffix}`; try { let prevValue: U | undefined; if (prevTaskState) { From edad7d03ba848cc23a60787a222ac003adb5a52b Mon Sep 17 00:00:00 2001 From: Debabrata Panigrahi <50622005+Debanitrkl@users.noreply.github.com> Date: Fri, 27 Sep 2024 06:34:14 +0000 Subject: [PATCH 048/217] Added the Harness CCM Plugin to microsite Signed-off-by: Debabrata Panigrahi <50622005+Debanitrkl@users.noreply.github.com> --- microsite/data/plugins/harness-ccm.yaml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 microsite/data/plugins/harness-ccm.yaml diff --git a/microsite/data/plugins/harness-ccm.yaml b/microsite/data/plugins/harness-ccm.yaml new file mode 100644 index 0000000000..dad6febed6 --- /dev/null +++ b/microsite/data/plugins/harness-ccm.yaml @@ -0,0 +1,11 @@ +title: Harness Cloud Cost Management +author: harness.io +authorUrl: https://github.com/harness/backstage-plugins +category: FinOps +description: This plugin lets you manage and optimize cloud costs using Harness Cloud Cost Management module directly inside Backstage. +documentation: https://github.com/harness/backstage-plugins/tree/main/plugins/harness-ccm +iconUrl: https://static.harness.io/ng-static/images/favicon.png +npmPackageName: '@harnessio/backstage-plugin-harness-ccm' +tags: + - finops +addedDate: '2024-09-27' \ No newline at end of file From c8bf46a5c184789c18592665e94794b54ae5d556 Mon Sep 17 00:00:00 2001 From: Debabrata Panigrahi <50622005+Debanitrkl@users.noreply.github.com> Date: Fri, 27 Sep 2024 06:39:01 +0000 Subject: [PATCH 049/217] Added the Harness CCM Plugin to microsite Signed-off-by: Debabrata Panigrahi <50622005+Debanitrkl@users.noreply.github.com> --- microsite/data/plugins/harness-ccm.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microsite/data/plugins/harness-ccm.yaml b/microsite/data/plugins/harness-ccm.yaml index dad6febed6..64fba34c54 100644 --- a/microsite/data/plugins/harness-ccm.yaml +++ b/microsite/data/plugins/harness-ccm.yaml @@ -8,4 +8,4 @@ iconUrl: https://static.harness.io/ng-static/images/favicon.png npmPackageName: '@harnessio/backstage-plugin-harness-ccm' tags: - finops -addedDate: '2024-09-27' \ No newline at end of file +addedDate: '2024-09-27' From e9a95045dc07ef38d270fc10a0328a2581c8b484 Mon Sep 17 00:00:00 2001 From: Debabrata Panigrahi <50622005+Debanitrkl@users.noreply.github.com> Date: Fri, 27 Sep 2024 06:41:55 +0000 Subject: [PATCH 050/217] Added the sign-off Signed-off-by: Debabrata Panigrahi <50622005+Debanitrkl@users.noreply.github.com> --- microsite/data/plugins/harness-ccm.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microsite/data/plugins/harness-ccm.yaml b/microsite/data/plugins/harness-ccm.yaml index 64fba34c54..535cb11b12 100644 --- a/microsite/data/plugins/harness-ccm.yaml +++ b/microsite/data/plugins/harness-ccm.yaml @@ -2,7 +2,7 @@ title: Harness Cloud Cost Management author: harness.io authorUrl: https://github.com/harness/backstage-plugins category: FinOps -description: This plugin lets you manage and optimize cloud costs using Harness Cloud Cost Management module directly inside Backstage. +description: This plugins helps you to manage and optimize cloud costs using Harness Cloud Cost Management module directly inside Backstage. documentation: https://github.com/harness/backstage-plugins/tree/main/plugins/harness-ccm iconUrl: https://static.harness.io/ng-static/images/favicon.png npmPackageName: '@harnessio/backstage-plugin-harness-ccm' From 0040632c8ce6acf9f06489d5e3c694ed61cea476 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Jerna=C5=9B?= Date: Thu, 26 Sep 2024 22:00:49 +0200 Subject: [PATCH 051/217] feat(user-settings): Search for user avatar also in the entities MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If the identity system doesn't provide an avatar, but the existing user entity does have the correct annotation use that as the profile avatar. Fixes #26838 Signed-off-by: Łukasz Jernaś --- .changeset/silly-geckos-learn.md | 5 ++ .changeset/ten-rings-look.md | 5 ++ packages/catalog-client/src/types/api.ts | 1 + plugins/user-settings/dev/index.tsx | 29 +++++++- plugins/user-settings/package.json | 1 + .../DefaultSettingsPage.test.tsx | 21 +++++- .../General/UserSettingsIdentityCard.test.tsx | 32 +++++--- .../General/UserSettingsProfileCard.test.tsx | 74 +++++++++++++++++++ .../SettingsPage/SettingsPage.test.tsx | 56 ++++++++++---- .../src/components/useUserProfileInfo.ts | 18 ++++- yarn.lock | 1 + 11 files changed, 210 insertions(+), 33 deletions(-) create mode 100644 .changeset/silly-geckos-learn.md create mode 100644 .changeset/ten-rings-look.md create mode 100644 plugins/user-settings/src/components/General/UserSettingsProfileCard.test.tsx diff --git a/.changeset/silly-geckos-learn.md b/.changeset/silly-geckos-learn.md new file mode 100644 index 0000000000..e0b525fd4e --- /dev/null +++ b/.changeset/silly-geckos-learn.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-user-settings': minor +--- + +Search for profile image also in User Entities diff --git a/.changeset/ten-rings-look.md b/.changeset/ten-rings-look.md new file mode 100644 index 0000000000..b5275253f9 --- /dev/null +++ b/.changeset/ten-rings-look.md @@ -0,0 +1,5 @@ +--- +'@backstage/catalog-client': minor +--- + +Add missing doc string to API diff --git a/packages/catalog-client/src/types/api.ts b/packages/catalog-client/src/types/api.ts index c8fbc7e7ac..85cea17660 100644 --- a/packages/catalog-client/src/types/api.ts +++ b/packages/catalog-client/src/types/api.ts @@ -650,6 +650,7 @@ export interface CatalogApi { * * @param entity - Entity to validate * @param locationRef - Location ref in format `url:http://example.com/file` + * @param options - Additional options */ validateEntity( entity: Entity, diff --git a/plugins/user-settings/dev/index.tsx b/plugins/user-settings/dev/index.tsx index 90be1e3bad..d7041e96a8 100644 --- a/plugins/user-settings/dev/index.tsx +++ b/plugins/user-settings/dev/index.tsx @@ -17,10 +17,37 @@ import React from 'react'; import { CatalogEntityPage } from '@backstage/plugin-catalog'; import { createDevApp } from '@backstage/dev-utils'; -import { userSettingsPlugin, UserSettingsPage } from '../src/plugin'; +import { UserSettingsPage, userSettingsPlugin } from '../src'; +import { CatalogApi, catalogApiRef } from '@backstage/plugin-catalog-react'; +import { + CompoundEntityRef, + Entity, + UserEntity, +} from '@backstage/catalog-model'; +const userEntity: UserEntity = { + apiVersion: 'backstage.io/v1beta1', + kind: 'User', + metadata: { + name: 'Guest', + }, + spec: {}, +}; createDevApp() .registerPlugin(userSettingsPlugin) + .registerApi({ + api: catalogApiRef, + deps: {}, + factory() { + return { + async getEntityByRef( + _: string | CompoundEntityRef, + ): Promise { + return userEntity; + }, + } as Partial as unknown as CatalogApi; + }, + }) .addPage({ title: 'Settings', path: '/settings', diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index 4c20c2f0f3..8c73defa89 100644 --- a/plugins/user-settings/package.json +++ b/plugins/user-settings/package.json @@ -55,6 +55,7 @@ "test": "backstage-cli package test" }, "dependencies": { + "@backstage/catalog-model": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/core-compat-api": "workspace:^", "@backstage/core-components": "workspace:^", diff --git a/plugins/user-settings/src/components/DefaultSettingsPage/DefaultSettingsPage.test.tsx b/plugins/user-settings/src/components/DefaultSettingsPage/DefaultSettingsPage.test.tsx index e31c9f26fd..14b7b7b48b 100644 --- a/plugins/user-settings/src/components/DefaultSettingsPage/DefaultSettingsPage.test.tsx +++ b/plugins/user-settings/src/components/DefaultSettingsPage/DefaultSettingsPage.test.tsx @@ -15,24 +15,33 @@ */ import React from 'react'; -import { renderInTestApp } from '@backstage/test-utils'; +import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { DefaultSettingsPage } from './DefaultSettingsPage'; import { UserSettingsTab } from '../UserSettingsTab'; import { useOutlet } from 'react-router-dom'; import { SettingsLayout } from '../SettingsLayout'; +import { CatalogApi, catalogApiRef } from '@backstage/plugin-catalog-react'; jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), useOutlet: jest.fn().mockReturnValue(undefined), })); +const catalogApiMock: jest.Mocked = { + getEntityByRef: jest.fn(), +} as any; + describe('', () => { beforeEach(() => { (useOutlet as jest.Mock).mockReset(); }); it('should render the settings page with 3 tabs', async () => { - const { container } = await renderInTestApp(); + const { container } = await renderInTestApp( + + + , + ); const tabs = container.querySelectorAll('[class*=MuiTabs-root] a'); expect(tabs).toHaveLength(3); @@ -45,7 +54,9 @@ describe('', () => { ); const { container } = await renderInTestApp( - , + + + , ); const tabs = container.querySelectorAll('[class*=MuiTabs-root] a'); @@ -60,7 +71,9 @@ describe('', () => { ); const { container } = await renderInTestApp( - , + + + , ); const tabs = container.querySelectorAll('[class*=MuiTabs-root] a'); diff --git a/plugins/user-settings/src/components/General/UserSettingsIdentityCard.test.tsx b/plugins/user-settings/src/components/General/UserSettingsIdentityCard.test.tsx index 1be797980b..b1a811d7fa 100644 --- a/plugins/user-settings/src/components/General/UserSettingsIdentityCard.test.tsx +++ b/plugins/user-settings/src/components/General/UserSettingsIdentityCard.test.tsx @@ -20,19 +20,27 @@ import React from 'react'; import { UserSettingsIdentityCard } from './UserSettingsIdentityCard'; import { ApiProvider } from '@backstage/core-app-api'; import { identityApiRef } from '@backstage/core-plugin-api'; -import { entityRouteRef } from '@backstage/plugin-catalog-react'; +import { catalogApiRef, entityRouteRef } from '@backstage/plugin-catalog-react'; -const apiRegistry = TestApiRegistry.from([ - identityApiRef, - { - getProfileInfo: jest.fn(async () => ({})), - getBackstageIdentity: jest.fn(async () => ({ - type: 'user' as const, - userEntityRef: 'foo:bar/foobar', - ownershipEntityRefs: ['user:default/test-ownership'], - })), - }, -]); +const apiRegistry = TestApiRegistry.from( + [ + identityApiRef, + { + getProfileInfo: jest.fn(async () => ({})), + getBackstageIdentity: jest.fn(async () => ({ + type: 'user' as const, + userEntityRef: 'foo:bar/foobar', + ownershipEntityRefs: ['user:default/test-ownership'], + })), + }, + ], + [ + catalogApiRef, + { + getEntityByRef: jest.fn(), + }, + ], +); describe('', () => { it('displays an identity card', async () => { diff --git a/plugins/user-settings/src/components/General/UserSettingsProfileCard.test.tsx b/plugins/user-settings/src/components/General/UserSettingsProfileCard.test.tsx new file mode 100644 index 0000000000..582daadad7 --- /dev/null +++ b/plugins/user-settings/src/components/General/UserSettingsProfileCard.test.tsx @@ -0,0 +1,74 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { renderInTestApp, TestApiRegistry } from '@backstage/test-utils'; +import { screen } from '@testing-library/react'; +import React from 'react'; +import { identityApiRef } from '@backstage/core-plugin-api'; +import { catalogApiRef, entityRouteRef } from '@backstage/plugin-catalog-react'; +import { ApiProvider } from '@backstage/core-app-api'; +import { UserSettingsProfileCard } from './UserSettingsProfileCard'; + +const apiRegistry = TestApiRegistry.from( + [ + identityApiRef, + { + getProfileInfo: jest.fn(async () => ({})), + getBackstageIdentity: jest.fn(async () => ({ + type: 'user' as const, + userEntityRef: 'foo:bar/foobar', + ownershipEntityRefs: ['user:default/test-ownership'], + })), + }, + ], + [ + catalogApiRef, + { + getEntityByRef: jest.fn(async () => { + return { + apiVersion: 'backstage.io/v1beta1', + kind: 'User', + metadata: { + name: 'Guest', + annotations: {}, + }, + spec: { + profile: { + picture: 'https://example.com/avatar.png', + }, + }, + }; + }), + }, + ], +); + +describe('', () => { + it('displays avatar if it exists in user entity', async () => { + await renderInTestApp( + + + , + { + mountedRoutes: { '/catalog/:namespace/:kind/:name': entityRouteRef }, + }, + ); + expect(screen.getByAltText('Profile picture')).toHaveAttribute( + 'src', + 'https://example.com/avatar.png', + ); + }); +}); diff --git a/plugins/user-settings/src/components/SettingsPage/SettingsPage.test.tsx b/plugins/user-settings/src/components/SettingsPage/SettingsPage.test.tsx index d4b941c850..acdb6c3f87 100644 --- a/plugins/user-settings/src/components/SettingsPage/SettingsPage.test.tsx +++ b/plugins/user-settings/src/components/SettingsPage/SettingsPage.test.tsx @@ -15,29 +15,42 @@ */ import React from 'react'; -import { renderInTestApp } from '@backstage/test-utils'; +import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { SettingsPage } from './SettingsPage'; import { UserSettingsTab } from '../UserSettingsTab'; import { useOutlet } from 'react-router-dom'; import { SettingsLayout } from '../SettingsLayout'; import { screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { entityRouteRef } from '@backstage/plugin-catalog-react'; +import { + CatalogApi, + catalogApiRef, + entityRouteRef, +} from '@backstage/plugin-catalog-react'; jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), useOutlet: jest.fn().mockReturnValue(undefined), })); +const catalogApiMock: jest.Mocked = { + getEntityByRef: jest.fn(), +} as any; + describe('', () => { beforeEach(() => { (useOutlet as jest.Mock).mockReset(); }); it('should render the default settings page with 3 tabs', async () => { - const { container } = await renderInTestApp(, { - mountedRoutes: { '/catalog/:namespace/:kind/:name': entityRouteRef }, - }); + const { container } = await renderInTestApp( + + + , + { + mountedRoutes: { '/catalog/:namespace/:kind/:name': entityRouteRef }, + }, + ); const tabs = container.querySelectorAll('[class*=MuiTabs-root] a'); expect(tabs).toHaveLength(3); @@ -50,9 +63,14 @@ describe('', () => { ); (useOutlet as jest.Mock).mockReturnValue(advancedTabRoute); - const { container } = await renderInTestApp(, { - mountedRoutes: { '/catalog/:namespace/:kind/:name': entityRouteRef }, - }); + const { container } = await renderInTestApp( + + + , + { + mountedRoutes: { '/catalog/:namespace/:kind/:name': entityRouteRef }, + }, + ); const tabs = container.querySelectorAll('[class*=MuiTabs-root] a'); expect(tabs).toHaveLength(4); @@ -66,9 +84,14 @@ describe('', () => { ); (useOutlet as jest.Mock).mockReturnValue(advancedTabRoute); - const { container } = await renderInTestApp(, { - mountedRoutes: { '/catalog/:namespace/:kind/:name': entityRouteRef }, - }); + const { container } = await renderInTestApp( + + + , + { + mountedRoutes: { '/catalog/:namespace/:kind/:name': entityRouteRef }, + }, + ); const tabs = container.querySelectorAll('[class*=MuiTabs-root] a'); expect(tabs).toHaveLength(4); @@ -91,9 +114,14 @@ describe('', () => { ); (useOutlet as jest.Mock).mockReturnValue(customLayout); - const { container } = await renderInTestApp(, { - mountedRoutes: { '/catalog/:namespace/:kind/:name': entityRouteRef }, - }); + const { container } = await renderInTestApp( + + + , + { + mountedRoutes: { '/catalog/:namespace/:kind/:name': entityRouteRef }, + }, + ); const tabs = container.querySelectorAll('[class*=MuiTabs-root] a'); expect(tabs).toHaveLength(2); diff --git a/plugins/user-settings/src/components/useUserProfileInfo.ts b/plugins/user-settings/src/components/useUserProfileInfo.ts index ee4578cd6b..f777c3d75b 100644 --- a/plugins/user-settings/src/components/useUserProfileInfo.ts +++ b/plugins/user-settings/src/components/useUserProfileInfo.ts @@ -22,16 +22,30 @@ import { } from '@backstage/core-plugin-api'; import { useEffect } from 'react'; import useAsync from 'react-use/esm/useAsync'; +import { catalogApiRef } from '@backstage/plugin-catalog-react'; +import { UserEntity } from '@backstage/catalog-model'; /** @public */ export const useUserProfile = () => { const identityApi = useApi(identityApiRef); const alertApi = useApi(alertApiRef); + const catalogApi = useApi(catalogApiRef); const { value, loading, error } = useAsync(async () => { + const identityProfile = await identityApi.getProfileInfo(); + const backStageIdentity = await identityApi.getBackstageIdentity(); + const catalogProfile = (await catalogApi.getEntityByRef( + backStageIdentity.userEntityRef, + )) as unknown as UserEntity; + if ( + identityProfile.picture === undefined && + catalogProfile?.spec?.profile?.picture + ) { + identityProfile.picture = catalogProfile.spec.profile.picture; + } return { - profile: await identityApi.getProfileInfo(), - identity: await identityApi.getBackstageIdentity(), + profile: identityProfile, + identity: backStageIdentity, }; }, []); diff --git a/yarn.lock b/yarn.lock index 9db800de86..231e84a976 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8140,6 +8140,7 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-user-settings@workspace:plugins/user-settings" dependencies: + "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/core-app-api": "workspace:^" "@backstage/core-compat-api": "workspace:^" From 871a660643b0e900c928453d1478391804a79bc5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Sep 2024 12:32:04 +0000 Subject: [PATCH 052/217] build(deps): bump rollup from 0.60.7 to 4.22.5 Bumps [rollup](https://github.com/rollup/rollup) from 0.60.7 to 4.22.5. - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](https://github.com/rollup/rollup/compare/v0.60.7...v4.22.5) --- updated-dependencies: - dependency-name: rollup dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 145 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 76 insertions(+), 69 deletions(-) diff --git a/yarn.lock b/yarn.lock index b8a663a95e..21ea1f81dc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14595,114 +14595,114 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.22.4" +"@rollup/rollup-android-arm-eabi@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.22.5" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-android-arm64@npm:4.22.4" +"@rollup/rollup-android-arm64@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-android-arm64@npm:4.22.5" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-darwin-arm64@npm:4.22.4" +"@rollup/rollup-darwin-arm64@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-darwin-arm64@npm:4.22.5" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-darwin-x64@npm:4.22.4" +"@rollup/rollup-darwin-x64@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-darwin-x64@npm:4.22.5" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.22.4" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.22.5" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.22.4" +"@rollup/rollup-linux-arm-musleabihf@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.22.5" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.22.4" +"@rollup/rollup-linux-arm64-gnu@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.22.5" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.22.4" +"@rollup/rollup-linux-arm64-musl@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.22.5" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.22.4" +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.22.5" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.22.4" +"@rollup/rollup-linux-riscv64-gnu@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.22.5" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.22.4" +"@rollup/rollup-linux-s390x-gnu@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.22.5" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.22.4" +"@rollup/rollup-linux-x64-gnu@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.22.5" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.22.4" +"@rollup/rollup-linux-x64-musl@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.22.5" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.22.4" +"@rollup/rollup-win32-arm64-msvc@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.22.5" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.22.4" +"@rollup/rollup-win32-ia32-msvc@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.22.5" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.22.4": - version: 4.22.4 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.22.4" +"@rollup/rollup-win32-x64-msvc@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.22.5" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -17434,7 +17434,7 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:1.0.5, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5": +"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5": version: 1.0.5 resolution: "@types/estree@npm:1.0.5" checksum: dd8b5bed28e6213b7acd0fb665a84e693554d850b0df423ac8076cc3ad5823a6bc26b0251d080bdc545af83179ede51dd3f6fa78cad2c46ed1f29624ddf3e41a @@ -17448,6 +17448,13 @@ __metadata: languageName: node linkType: hard +"@types/estree@npm:1.0.6": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 8825d6e729e16445d9a1dd2fb1db2edc5ed400799064cd4d028150701031af012ba30d6d03fe9df40f4d7a437d0de6d2b256020152b7b09bde9f2e420afdffd9 + languageName: node + linkType: hard + "@types/expect@npm:^1.20.4": version: 1.20.4 resolution: "@types/expect@npm:1.20.4" @@ -39637,26 +39644,26 @@ __metadata: linkType: hard "rollup@npm:^4.0.0, rollup@npm:^4.20.0": - version: 4.22.4 - resolution: "rollup@npm:4.22.4" + version: 4.22.5 + resolution: "rollup@npm:4.22.5" dependencies: - "@rollup/rollup-android-arm-eabi": 4.22.4 - "@rollup/rollup-android-arm64": 4.22.4 - "@rollup/rollup-darwin-arm64": 4.22.4 - "@rollup/rollup-darwin-x64": 4.22.4 - "@rollup/rollup-linux-arm-gnueabihf": 4.22.4 - "@rollup/rollup-linux-arm-musleabihf": 4.22.4 - "@rollup/rollup-linux-arm64-gnu": 4.22.4 - "@rollup/rollup-linux-arm64-musl": 4.22.4 - "@rollup/rollup-linux-powerpc64le-gnu": 4.22.4 - "@rollup/rollup-linux-riscv64-gnu": 4.22.4 - "@rollup/rollup-linux-s390x-gnu": 4.22.4 - "@rollup/rollup-linux-x64-gnu": 4.22.4 - "@rollup/rollup-linux-x64-musl": 4.22.4 - "@rollup/rollup-win32-arm64-msvc": 4.22.4 - "@rollup/rollup-win32-ia32-msvc": 4.22.4 - "@rollup/rollup-win32-x64-msvc": 4.22.4 - "@types/estree": 1.0.5 + "@rollup/rollup-android-arm-eabi": 4.22.5 + "@rollup/rollup-android-arm64": 4.22.5 + "@rollup/rollup-darwin-arm64": 4.22.5 + "@rollup/rollup-darwin-x64": 4.22.5 + "@rollup/rollup-linux-arm-gnueabihf": 4.22.5 + "@rollup/rollup-linux-arm-musleabihf": 4.22.5 + "@rollup/rollup-linux-arm64-gnu": 4.22.5 + "@rollup/rollup-linux-arm64-musl": 4.22.5 + "@rollup/rollup-linux-powerpc64le-gnu": 4.22.5 + "@rollup/rollup-linux-riscv64-gnu": 4.22.5 + "@rollup/rollup-linux-s390x-gnu": 4.22.5 + "@rollup/rollup-linux-x64-gnu": 4.22.5 + "@rollup/rollup-linux-x64-musl": 4.22.5 + "@rollup/rollup-win32-arm64-msvc": 4.22.5 + "@rollup/rollup-win32-ia32-msvc": 4.22.5 + "@rollup/rollup-win32-x64-msvc": 4.22.5 + "@types/estree": 1.0.6 fsevents: ~2.3.2 dependenciesMeta: "@rollup/rollup-android-arm-eabi": @@ -39695,7 +39702,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: b093b518deb1fd0c0455eef746abe9efa3a2cd7e2b65a4ace9e8fa5d60b3d6da2406816de2c6c1d553609f22cf730f1c5839a05a1ff60003c504486172238d1a + checksum: 894b3d428b5a7f1db2245f50622ce65a3ad8f754265dd1da7dce133e39b315516dbcbac51e4fe100b44d59b168bac3f36ebaeb836fc9f7057d4972f44497d046 languageName: node linkType: hard From 276cd3d1bd88f4386f6a4c5fdbe392aa48749976 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 27 Sep 2024 12:38:26 +0000 Subject: [PATCH 053/217] fix(deps): update dependency @kubernetes-models/apimachinery to v2 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .changeset/renovate-f88b005.md | 7 +++++ plugins/kubernetes-cluster/package.json | 2 +- plugins/kubernetes-react/package.json | 2 +- plugins/kubernetes/package.json | 2 +- yarn.lock | 40 ++----------------------- 5 files changed, 13 insertions(+), 40 deletions(-) create mode 100644 .changeset/renovate-f88b005.md diff --git a/.changeset/renovate-f88b005.md b/.changeset/renovate-f88b005.md new file mode 100644 index 0000000000..b62080e8da --- /dev/null +++ b/.changeset/renovate-f88b005.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-kubernetes-cluster': patch +'@backstage/plugin-kubernetes-react': patch +'@backstage/plugin-kubernetes': patch +--- + +Updated dependency `@kubernetes-models/apimachinery` to `^2.0.0`. diff --git a/plugins/kubernetes-cluster/package.json b/plugins/kubernetes-cluster/package.json index 6523292373..65bf617b91 100644 --- a/plugins/kubernetes-cluster/package.json +++ b/plugins/kubernetes-cluster/package.json @@ -47,7 +47,7 @@ "@backstage/plugin-catalog-react": "workspace:^", "@backstage/plugin-kubernetes-common": "workspace:^", "@backstage/plugin-kubernetes-react": "workspace:^", - "@kubernetes-models/apimachinery": "^1.1.0", + "@kubernetes-models/apimachinery": "^2.0.0", "@kubernetes-models/base": "^5.0.0", "@material-ui/core": "^4.12.2", "@material-ui/lab": "4.0.0-alpha.61", diff --git a/plugins/kubernetes-react/package.json b/plugins/kubernetes-react/package.json index a568016925..582ad9196b 100644 --- a/plugins/kubernetes-react/package.json +++ b/plugins/kubernetes-react/package.json @@ -47,7 +47,7 @@ "@backstage/errors": "workspace:^", "@backstage/plugin-kubernetes-common": "workspace:^", "@backstage/types": "workspace:^", - "@kubernetes-models/apimachinery": "^1.1.0", + "@kubernetes-models/apimachinery": "^2.0.0", "@kubernetes-models/base": "^5.0.0", "@kubernetes/client-node": "^0.20.0", "@material-ui/core": "^4.9.13", diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index 8625fc9167..6d3ac3eddb 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -66,7 +66,7 @@ "@backstage/plugin-catalog-react": "workspace:^", "@backstage/plugin-kubernetes-common": "workspace:^", "@backstage/plugin-kubernetes-react": "workspace:^", - "@kubernetes-models/apimachinery": "^1.1.0", + "@kubernetes-models/apimachinery": "^2.0.0", "@kubernetes-models/base": "^5.0.0", "@kubernetes/client-node": "0.20.0", "@material-ui/core": "^4.12.2", diff --git a/yarn.lock b/yarn.lock index b8a663a95e..fbc5cf1be5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6510,7 +6510,7 @@ __metadata: "@backstage/plugin-kubernetes-common": "workspace:^" "@backstage/plugin-kubernetes-react": "workspace:^" "@backstage/test-utils": "workspace:^" - "@kubernetes-models/apimachinery": ^1.1.0 + "@kubernetes-models/apimachinery": ^2.0.0 "@kubernetes-models/base": ^5.0.0 "@material-ui/core": ^4.12.2 "@material-ui/lab": 4.0.0-alpha.61 @@ -6582,7 +6582,7 @@ __metadata: "@backstage/plugin-kubernetes-common": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/types": "workspace:^" - "@kubernetes-models/apimachinery": ^1.1.0 + "@kubernetes-models/apimachinery": ^2.0.0 "@kubernetes-models/base": ^5.0.0 "@kubernetes/client-node": ^0.20.0 "@material-ui/core": ^4.9.13 @@ -6622,7 +6622,7 @@ __metadata: "@backstage/plugin-kubernetes-common": "workspace:^" "@backstage/plugin-kubernetes-react": "workspace:^" "@backstage/test-utils": "workspace:^" - "@kubernetes-models/apimachinery": ^1.1.0 + "@kubernetes-models/apimachinery": ^2.0.0 "@kubernetes-models/base": ^5.0.0 "@kubernetes/client-node": 0.20.0 "@material-ui/core": ^4.12.2 @@ -10592,17 +10592,6 @@ __metadata: languageName: node linkType: hard -"@kubernetes-models/apimachinery@npm:^1.1.0": - version: 1.2.2 - resolution: "@kubernetes-models/apimachinery@npm:1.2.2" - dependencies: - "@kubernetes-models/base": ^4.0.4 - "@kubernetes-models/validate": ^3.1.2 - tslib: ^2.4.0 - checksum: 57387bb8a1f43b740506877d2557a188122512dd2f05c54e3076e0d6cf9a2112f7c5cbbba762c8f4fee22845fcf1302b97537a9e24cfd18b6a99d51a1360136a - languageName: node - linkType: hard - "@kubernetes-models/apimachinery@npm:^2.0.0": version: 2.0.0 resolution: "@kubernetes-models/apimachinery@npm:2.0.0" @@ -10614,17 +10603,6 @@ __metadata: languageName: node linkType: hard -"@kubernetes-models/base@npm:^4.0.4": - version: 4.0.4 - resolution: "@kubernetes-models/base@npm:4.0.4" - dependencies: - "@kubernetes-models/validate": ^3.1.2 - is-plain-object: ^5.0.0 - tslib: ^2.4.0 - checksum: 15d531118e8a85eda8fd9602de4ba0e61e794d52218df7acb9842fe3c2fad5e788f3468768e8287405c6228625cce5cb1d91d923499e401a1a0f55287b2e6b5a - languageName: node - linkType: hard - "@kubernetes-models/base@npm:^5.0.0": version: 5.0.0 resolution: "@kubernetes-models/base@npm:5.0.0" @@ -10636,18 +10614,6 @@ __metadata: languageName: node linkType: hard -"@kubernetes-models/validate@npm:^3.1.2": - version: 3.1.2 - resolution: "@kubernetes-models/validate@npm:3.1.2" - dependencies: - ajv: ^8.12.0 - ajv-formats: ^2.1.1 - ajv-formats-draft2019: ^1.6.1 - tslib: ^2.4.0 - checksum: 44bd7e45aa9716448532f5afc6510398a7eed77c23df67acd94acde4e940c3284a879cc62372fb3dcb67c12d2d10e43900bdd98bc39d1177492c9f2d48b63d4e - languageName: node - linkType: hard - "@kubernetes-models/validate@npm:^4.0.0": version: 4.0.0 resolution: "@kubernetes-models/validate@npm:4.0.0" From 63963f6c2b8e1394efa78a66d9b7865978d9c5a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Fri, 27 Sep 2024 15:06:36 +0200 Subject: [PATCH 054/217] fixup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/famous-bobcats-remain.md | 5 +++ .../no-top-level-material-ui-4-imports.js | 44 ++++++++++++------- yarn.lock | 15 ++----- 3 files changed, 37 insertions(+), 27 deletions(-) create mode 100644 .changeset/famous-bobcats-remain.md diff --git a/.changeset/famous-bobcats-remain.md b/.changeset/famous-bobcats-remain.md new file mode 100644 index 0000000000..6943eb7e56 --- /dev/null +++ b/.changeset/famous-bobcats-remain.md @@ -0,0 +1,5 @@ +--- +'@backstage/eslint-plugin': patch +--- + +Internal refactor to deal with `estree` upgrade diff --git a/packages/eslint-plugin/rules/no-top-level-material-ui-4-imports.js b/packages/eslint-plugin/rules/no-top-level-material-ui-4-imports.js index 78fd3d63e9..6e0ba9ee87 100644 --- a/packages/eslint-plugin/rules/no-top-level-material-ui-4-imports.js +++ b/packages/eslint-plugin/rules/no-top-level-material-ui-4-imports.js @@ -80,11 +80,14 @@ const KNOWN_STYLES = [ /** * filter function to keep only ImportSpecifier nodes - * @param {import('estree').ImportSpecifier | import('estree').ImportDefaultSpecifier| import('estree').ImportNamespaceSpecifier} specifier + * @param {import('estree').ImportSpecifier | import('estree').ImportDefaultSpecifier | import('estree').ImportNamespaceSpecifier} specifier * @returns {specifier is import('estree').ImportSpecifier} */ function importSpecifiersFilter(specifier) { - return specifier.type === 'ImportSpecifier'; + return ( + specifier.type === 'ImportSpecifier' && + specifier.imported.type !== 'Literal' + ); } /** @@ -146,12 +149,16 @@ module.exports = { const specifiers = node.specifiers.filter(importSpecifiersFilter); - const specifiersMap = specifiers.map( + const specifiersMap = specifiers.flatMap( /** * transform ImportSpecifier to FixerValues to have a simpler object to work with - * @returns {FixerValues} + * @returns {FixerValues[]} */ s => { + if (s.imported.type === 'Literal') { + return []; + } + const value = s.imported.name; const alias = s.local.name === value ? undefined : s.local.name; @@ -165,19 +172,24 @@ module.exports = { const emitComponent = !emitProp; const emitComponentAndProp = emitProp && - specifiers.find(s => s.imported.name === propsMatch[1])?.local - .name; + specifiers.find( + s => + s.imported.type !== 'Literal' && + s.imported.name === propsMatch[1], + )?.local.name; - return { - emitComponent: emitComponent || Boolean(emitComponentAndProp), - emitProp, - value, - componentValue: propsMatch ? propsMatch[1] : undefined, - componentAlias: emitComponentAndProp - ? emitComponentAndProp - : undefined, - alias, - }; + return [ + { + emitComponent: emitComponent || Boolean(emitComponentAndProp), + emitProp, + value, + componentValue: propsMatch ? propsMatch[1] : undefined, + componentAlias: emitComponentAndProp + ? emitComponentAndProp + : undefined, + alias, + }, + ]; }, ); diff --git a/yarn.lock b/yarn.lock index 21ea1f81dc..c662e0492f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17434,10 +17434,10 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5": - version: 1.0.5 - resolution: "@types/estree@npm:1.0.5" - checksum: dd8b5bed28e6213b7acd0fb665a84e693554d850b0df423ac8076cc3ad5823a6bc26b0251d080bdc545af83179ede51dd3f6fa78cad2c46ed1f29624ddf3e41a +"@types/estree@npm:*, @types/estree@npm:1.0.6, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 8825d6e729e16445d9a1dd2fb1db2edc5ed400799064cd4d028150701031af012ba30d6d03fe9df40f4d7a437d0de6d2b256020152b7b09bde9f2e420afdffd9 languageName: node linkType: hard @@ -17448,13 +17448,6 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:1.0.6": - version: 1.0.6 - resolution: "@types/estree@npm:1.0.6" - checksum: 8825d6e729e16445d9a1dd2fb1db2edc5ed400799064cd4d028150701031af012ba30d6d03fe9df40f4d7a437d0de6d2b256020152b7b09bde9f2e420afdffd9 - languageName: node - linkType: hard - "@types/expect@npm:^1.20.4": version: 1.20.4 resolution: "@types/expect@npm:1.20.4" From 55b8b84fa3ec866ec5e80d03dc97288185cb3f5e Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 27 Sep 2024 16:02:55 +0200 Subject: [PATCH 055/217] cli: rework jest configuration collection Signed-off-by: Patrik Oldsberg --- .changeset/cold-nails-rescue.md | 5 + .changeset/sour-grapes-trade.md | 5 + packages/cli/config/jest.js | 182 ++++++++++++++++++++------------ 3 files changed, 124 insertions(+), 68 deletions(-) create mode 100644 .changeset/cold-nails-rescue.md create mode 100644 .changeset/sour-grapes-trade.md diff --git a/.changeset/cold-nails-rescue.md b/.changeset/cold-nails-rescue.md new file mode 100644 index 0000000000..b7667305ca --- /dev/null +++ b/.changeset/cold-nails-rescue.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': minor +--- + +**BREAKING**: The Jest configuration defined at `@backstage/cli/config/jest` no longer collects configuration defined in the `"jest"` field from all parent `package.json` files. Instead, it will only read and merge configuration from the `package.json` in the monorepo root if it exists, as well as the target package. In addition, configuration defined in the root `package.json` will now only be merged into each package configuration if it is a valid project-level configuration key. diff --git a/.changeset/sour-grapes-trade.md b/.changeset/sour-grapes-trade.md new file mode 100644 index 0000000000..acbb6cdbe7 --- /dev/null +++ b/.changeset/sour-grapes-trade.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +The Jest configuration will now search for a `src/setupTests.*` file with any valid script extension, not only `.ts`. diff --git a/packages/cli/config/jest.js b/packages/cli/config/jest.js index bef7b76f96..d99db11656 100644 --- a/packages/cli/config/jest.js +++ b/packages/cli/config/jest.js @@ -19,6 +19,9 @@ const path = require('path'); const crypto = require('crypto'); const glob = require('util').promisify(require('glob')); const { version } = require('../package.json'); +const paths = require('@backstage/cli-common').findPaths(process.cwd()); + +const SRC_EXTS = ['ts', 'js', 'tsx', 'jsx', 'mts', 'cts', 'mjs', 'cjs']; const envOptions = { oldTests: Boolean(process.env.BACKSTAGE_OLD_TESTS), @@ -31,6 +34,75 @@ try { /* ignored */ } +/** + * A list of config keys that are valid for project-level config. + * Jest will complain if we forward any other root configuration to the projects. + * + * @type {Array} + */ +const projectConfigKeys = [ + 'automock', + 'cache', + 'cacheDirectory', + 'clearMocks', + 'collectCoverageFrom', + 'coverageDirectory', + 'coveragePathIgnorePatterns', + 'cwd', + 'dependencyExtractor', + 'detectLeaks', + 'detectOpenHandles', + 'displayName', + 'errorOnDeprecated', + 'extensionsToTreatAsEsm', + 'fakeTimers', + 'filter', + 'forceCoverageMatch', + 'globalSetup', + 'globalTeardown', + 'globals', + 'haste', + 'id', + 'injectGlobals', + 'moduleDirectories', + 'moduleFileExtensions', + 'moduleNameMapper', + 'modulePathIgnorePatterns', + 'modulePaths', + 'openHandlesTimeout', + 'preset', + 'prettierPath', + 'resetMocks', + 'resetModules', + 'resolver', + 'restoreMocks', + 'rootDir', + 'roots', + 'runner', + 'runtime', + 'sandboxInjectedGlobals', + 'setupFiles', + 'setupFilesAfterEnv', + 'skipFilter', + 'skipNodeResolution', + 'slowTestThreshold', + 'snapshotResolver', + 'snapshotSerializers', + 'snapshotFormat', + 'testEnvironment', + 'testEnvironmentOptions', + 'testMatch', + 'testLocationInResults', + 'testPathIgnorePatterns', + 'testRegex', + 'testRunner', + 'transform', + 'transformIgnorePatterns', + 'watchPathIgnorePatterns', + 'unmockedModulePathPatterns', + 'workerIdleMemoryLimit', +]; + const transformIgnorePattern = [ '@material-ui', 'ajv', @@ -76,54 +148,11 @@ async function getProjectConfig(targetPath, extraConfig) { return require(configTsPath); } - // We read all "jest" config fields in package.json files all the way to the filesystem root. - // All configs are merged together to create the final config, with longer paths taking precedence. + // Jest config can be defined both in the root package.json and within each package. The root config + // gets forwarded to us through the `extraConfig` parameter, while the package config is read here. + // If they happen to be the same the keys will simply override each other. // The merging of the configs is shallow, meaning e.g. all transforms are replaced if new ones are defined. - const pkgJsonConfigs = []; - let closestPkgJson = undefined; - let currentPath = targetPath; - - // Some confidence check to avoid infinite loop - for (let i = 0; i < 100; i++) { - const packagePath = path.resolve(currentPath, 'package.json'); - const exists = fs.pathExistsSync(packagePath); - if (exists) { - try { - const data = fs.readJsonSync(packagePath); - if (!closestPkgJson) { - closestPkgJson = data; - } - if (data.jest) { - pkgJsonConfigs.unshift(data.jest); - } - } catch (error) { - throw new Error( - `Failed to parse package.json file reading jest configs, ${error}`, - ); - } - } - - const newPath = path.dirname(currentPath); - if (newPath === currentPath) { - break; - } - currentPath = newPath; - } - - // This is an old deprecated option that is no longer used. - const transformModules = pkgJsonConfigs - .flatMap(conf => { - const modules = conf.transformModules || []; - delete conf.transformModules; - return modules; - }) - .map(name => `${name}/`) - .join('|'); - if (transformModules.length > 0) { - console.warn( - 'The Backstage CLI jest transformModules option is no longer used and will be ignored. All modules are now always transformed.', - ); - } + const pkgJson = await fs.readJson(path.resolve(targetPath, 'package.json')); const options = { ...extraConfig, @@ -191,14 +220,14 @@ async function getProjectConfig(targetPath, extraConfig) { }, // A bit more opinionated - testMatch: ['**/*.test.{js,jsx,ts,tsx,mjs,cjs}'], + testMatch: [`**/*.test.{${SRC_EXTS.join(',')}}`], runtime: envOptions.oldTests ? undefined : require.resolve('./jestCachingModuleLoader'), transformIgnorePatterns: [`/node_modules/(?:${transformIgnorePattern})/`], - ...getRoleConfig(closestPkgJson?.backstage?.role), + ...getRoleConfig(pkgJson.backstage?.role), }; options.setupFilesAfterEnv = options.setupFilesAfterEnv || []; @@ -208,12 +237,15 @@ async function getProjectConfig(targetPath, extraConfig) { options.setupFilesAfterEnv.unshift(require.resolve('cross-fetch/polyfill')); } - // Use src/setupTests.ts as the default location for configuring test env - if (fs.existsSync(path.resolve(targetPath, 'src/setupTests.ts'))) { - options.setupFilesAfterEnv.push('/setupTests.ts'); + // Use src/setupTests.* as the default location for configuring test env + for (const ext of SRC_EXTS) { + if (fs.existsSync(path.resolve(targetPath, `src/setupTests.${ext}`))) { + options.setupFilesAfterEnv.push(`/setupTests.${ext}`); + break; + } } - const config = Object.assign(options, ...pkgJsonConfigs); + const config = Object.assign(options, pkgJson.jest); // The config id is a cache key that lets us share the jest cache across projects. // If no explicit id was configured, generated one based on the configuration. @@ -234,31 +266,44 @@ async function getProjectConfig(targetPath, extraConfig) { // configuration for the current package, or a collection of configurations for // the target workspace packages async function getRootConfig() { - const targetPath = process.cwd(); - const targetPackagePath = path.resolve(targetPath, 'package.json'); - const exists = await fs.pathExists(targetPackagePath); + const rootPkgJson = await fs.readJson( + paths.resolveTargetRoot('package.json'), + ); - const coverageConfig = { - coverageDirectory: path.resolve(targetPath, 'coverage'), + const baseCoverageConfig = { + coverageDirectory: paths.resolveTarget('coverage'), coverageProvider: envOptions.oldTests ? 'v8' : 'babel', collectCoverageFrom: ['**/*.{js,jsx,ts,tsx,mjs,cjs}', '!**/*.d.ts'], }; - if (!exists) { - return getProjectConfig(targetPath, coverageConfig); + const workspacePatterns = + rootPkgJson.workspaces && rootPkgJson.workspaces.packages; + + // Check if we're running within a specific monorepo package. In that case just get the single project config. + if (!workspacePatterns || paths.targetRoot !== paths.targetDir) { + return getProjectConfig(paths.targetDir, { + ...baseCoverageConfig, + ...(rootPkgJson.jest ?? {}), + }); } - // Check whether the current package is a workspace root or not - const data = await fs.readJson(targetPackagePath); - const workspacePatterns = data.workspaces && data.workspaces.packages; - if (!workspacePatterns) { - return getProjectConfig(targetPath, coverageConfig); + const globalRootConfig = { ...baseCoverageConfig }; + const globalProjectConfig = {}; + + for (const [key, value] of Object.entries(rootPkgJson.jest ?? {})) { + if (projectConfigKeys.includes(key)) { + globalProjectConfig[key] = value; + } else { + globalRootConfig[key] = value; + } } // If the target package is a workspace root, we find all packages in the // workspace and load those in as separate jest projects instead. const projectPaths = await Promise.all( - workspacePatterns.map(pattern => glob(path.join(targetPath, pattern))), + workspacePatterns.map(pattern => + glob(path.join(paths.targetRoot, pattern)), + ), ).then(_ => _.flat()); const configs = await Promise.all( @@ -277,6 +322,7 @@ async function getRootConfig() { testScript?.includes('backstage-cli package test'); if (testScript && isSupportedTestScript) { return await getProjectConfig(projectPath, { + ...globalProjectConfig, displayName: packageData.name, }); } @@ -286,9 +332,9 @@ async function getRootConfig() { ).then(cs => cs.filter(Boolean)); return { - rootDir: targetPath, + rootDir: paths.targetRoot, projects: configs, - ...coverageConfig, + ...globalRootConfig, }; } From 207b8382fd126f01f583644c8738e231b74596d5 Mon Sep 17 00:00:00 2001 From: Thomas Cardonne Date: Fri, 27 Sep 2024 16:55:05 +0200 Subject: [PATCH 056/217] Update cyan-cooks-sing.md Co-authored-by: Vincenzo Scamporlino Signed-off-by: Thomas Cardonne --- .changeset/cyan-cooks-sing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/cyan-cooks-sing.md b/.changeset/cyan-cooks-sing.md index 18aa3966ec..70492d0165 100644 --- a/.changeset/cyan-cooks-sing.md +++ b/.changeset/cyan-cooks-sing.md @@ -2,4 +2,4 @@ '@backstage/plugin-catalog-backend-module-gerrit': patch --- -Add missing `schedule` key in `config.d.ts` +Fixed an issue preventing the provider's `schedule` config from being applied." From cebee4f9a9d2e0323e3a2062ee23ff602318d239 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 27 Sep 2024 16:51:51 +0200 Subject: [PATCH 057/217] cli: add support for trimming next entry Signed-off-by: Patrik Oldsberg --- .changeset/friendly-cougars-return.md | 5 +++++ packages/cli/src/lib/entryPoints.ts | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 .changeset/friendly-cougars-return.md diff --git a/.changeset/friendly-cougars-return.md b/.changeset/friendly-cougars-return.md new file mode 100644 index 0000000000..8852177e0a --- /dev/null +++ b/.changeset/friendly-cougars-return.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Added support for a new experimental `EXPERIMENTAL_TRIM_NEXT_ENTRY` flag which removes any `./next` entry points present in packages when building and publishing. diff --git a/packages/cli/src/lib/entryPoints.ts b/packages/cli/src/lib/entryPoints.ts index 1f6e2feec2..2cead6b41f 100644 --- a/packages/cli/src/lib/entryPoints.ts +++ b/packages/cli/src/lib/entryPoints.ts @@ -67,6 +67,11 @@ export function readEntryPoints(pkg: BackstagePackageJson): Array { ); } + // Setting the EXPERIMENTAL_TRIM_NEXT_ENTRY flag will remove any `./next` entry points + if (process.env.EXPERIMENTAL_TRIM_NEXT_ENTRY && mount === './next') { + continue; + } + entryPoints.push(parseEntryPoint(mount, path)); } From cd41dce4f1a27a3f38168b91acd61d033baebc01 Mon Sep 17 00:00:00 2001 From: Debabrata Panigrahi <50622005+Debanitrkl@users.noreply.github.com> Date: Fri, 27 Sep 2024 20:29:53 +0530 Subject: [PATCH 058/217] Update harness-ccm.yaml Co-authored-by: Camila Belo Signed-off-by: Debabrata Panigrahi <50622005+Debanitrkl@users.noreply.github.com> --- microsite/data/plugins/harness-ccm.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microsite/data/plugins/harness-ccm.yaml b/microsite/data/plugins/harness-ccm.yaml index 535cb11b12..e696fdca4b 100644 --- a/microsite/data/plugins/harness-ccm.yaml +++ b/microsite/data/plugins/harness-ccm.yaml @@ -2,7 +2,7 @@ title: Harness Cloud Cost Management author: harness.io authorUrl: https://github.com/harness/backstage-plugins category: FinOps -description: This plugins helps you to manage and optimize cloud costs using Harness Cloud Cost Management module directly inside Backstage. +description: This plugin helps you to manage and optimize cloud costs using Harness Cloud Cost Management module directly inside Backstage. documentation: https://github.com/harness/backstage-plugins/tree/main/plugins/harness-ccm iconUrl: https://static.harness.io/ng-static/images/favicon.png npmPackageName: '@harnessio/backstage-plugin-harness-ccm' From 920004b48661798320ae1edc26419846019da98d Mon Sep 17 00:00:00 2001 From: Joshua Jung Date: Thu, 26 Sep 2024 17:19:49 -0500 Subject: [PATCH 059/217] Fixing getProjectId error message to be more descriptive Signed-off-by: Joshua Jung --- .changeset/rude-apricots-eat.md | 6 ++++++ .../src/entrypoints/urlReader/lib/GitlabUrlReader.test.ts | 4 +++- packages/integration/src/gitlab/core.ts | 4 +++- 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 .changeset/rude-apricots-eat.md diff --git a/.changeset/rude-apricots-eat.md b/.changeset/rude-apricots-eat.md new file mode 100644 index 0000000000..198d6a0ec7 --- /dev/null +++ b/.changeset/rude-apricots-eat.md @@ -0,0 +1,6 @@ +--- +'@backstage/backend-defaults': patch +'@backstage/integration': patch +--- + +Updating error message for getProjectId when fetching Gitlab project from its url to be more accurate diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/GitlabUrlReader.test.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/GitlabUrlReader.test.ts index dd6a0970d2..d0607767c2 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/GitlabUrlReader.test.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/GitlabUrlReader.test.ts @@ -697,7 +697,9 @@ describe('GitlabUrlReader', () => { (gitlabProcessor as any).getGitlabFetchUrl( 'https://gitlab.com/some/random/endpoint', ), - ).rejects.toThrow('Please provide full path to yaml file from GitLab'); + ).rejects.toThrow( + 'Failed converting /some/random/endpoint to a project id. Url path must include /blob/.', + ); }); }); diff --git a/packages/integration/src/gitlab/core.ts b/packages/integration/src/gitlab/core.ts index 94f4b65d9f..c7f8dd036f 100644 --- a/packages/integration/src/gitlab/core.ts +++ b/packages/integration/src/gitlab/core.ts @@ -116,7 +116,9 @@ export async function getProjectId( const url = new URL(target); if (!url.pathname.includes('/blob/')) { - throw new Error('Please provide full path to yaml file from GitLab'); + throw new Error( + `Failed converting ${url.pathname} to a project id. Url path must include /blob/.`, + ); } try { From f43634fc206f1833064516f520ec635d613e8298 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sat, 28 Sep 2024 11:56:50 +0200 Subject: [PATCH 060/217] scripts: add pin-workspace-versions Signed-off-by: Patrik Oldsberg --- scripts/pin-workspace-versions.js | 59 +++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100755 scripts/pin-workspace-versions.js diff --git a/scripts/pin-workspace-versions.js b/scripts/pin-workspace-versions.js new file mode 100755 index 0000000000..cbfb0c720b --- /dev/null +++ b/scripts/pin-workspace-versions.js @@ -0,0 +1,59 @@ +#!/usr/bin/env node +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// This switches all `workspace:^` dependencies in the project to instead use `workspace:*` +// This is used for next releases in order to avoid the `^` range that is otherwise likely to cause issues. +// For example, a `^0.5.0-next.0` range will match `0.5.0-next.0`, `0.5.0-next.1`, and even `0.5.2`. +// This can often lead to issues as there might be breaking changes across these versions, and in practice +// it will only be possible to install the most recent release without a lot of hassle. + +const fs = require('fs-extra'); +const { getPackages } = require('@manypkg/get-packages'); +const { resolve } = require('path'); + +const depTypes = ['dependencies', 'devDependencies', 'peerDependencies']; + +async function main() { + const rootPath = resolve(__dirname, '..'); + const { packages } = await getPackages(rootPath); + + for (const pkg of packages) { + let changed = false; + for (const depType of depTypes) { + const deps = pkg.packageJson[depType]; + if (deps) { + for (const depName of Object.keys(deps)) { + if (deps[depName] === 'workspace:^') { + deps[depName] = 'workspace:*'; + changed = true; + } + } + } + } + + if (changed) { + await fs.writeJson(resolve(pkg.dir, 'package.json'), pkg.packageJson, { + spaces: 2, + }); + } + } +} + +main(process.argv.slice(2)).catch(error => { + console.error(error.stack || error); + process.exit(1); +}); From 44c52067dffe482dc44e5225fcdaa16a6fc6a617 Mon Sep 17 00:00:00 2001 From: Calvin Lee Date: Sun, 29 Sep 2024 14:01:54 -0700 Subject: [PATCH 061/217] feat: fix issue in repos and parsing Signed-off-by: Calvin Lee --- packages/integration/src/harness/core.ts | 72 ++++++++++++++++-------- 1 file changed, 47 insertions(+), 25 deletions(-) diff --git a/packages/integration/src/harness/core.ts b/packages/integration/src/harness/core.ts index 1887a5c0d8..af2dab8a89 100644 --- a/packages/integration/src/harness/core.ts +++ b/packages/integration/src/harness/core.ts @@ -62,13 +62,19 @@ export function getHarnessFileContentsUrl( ) { const parsedUrl = parseHarnessUrl(config, url); - return `${parsedUrl.baseUrl}/gateway/code/api/v1/repos/${ - parsedUrl.accountId - }/${parsedUrl.orgName}${ - parsedUrl.projectName !== '' ? `/${parsedUrl.projectName}/` : '/' - }${parsedUrl.repoName}/+/raw/${parsedUrl.path}?routingId=${ - parsedUrl.accountId - }&git_ref=refs/heads/${parsedUrl.refString}`; + let constructedUrl = `${parsedUrl.baseUrl}/gateway/code/api/v1/repos/${parsedUrl.accountId}`; + + if (parsedUrl.orgName) { + constructedUrl += `/${parsedUrl.orgName}`; + } + + if (parsedUrl.projectName) { + constructedUrl += `/${parsedUrl.projectName}`; + } + + constructedUrl += `/${parsedUrl.repoName}/+/raw/${parsedUrl.path}?routingId=${parsedUrl.accountId}&git_ref=refs/heads/${parsedUrl.refString}`; + + return constructedUrl; } /** @@ -90,13 +96,20 @@ export function getHarnessArchiveUrl( url: string, ) { const parsedUrl = parseHarnessUrl(config, url); - return `${parsedUrl.baseUrl}/gateway/code/api/v1/repos/${ - parsedUrl.accountId - }/${parsedUrl.orgName}${ - parsedUrl.projectName !== '' ? `/${parsedUrl.projectName}/` : '/' - }${parsedUrl.repoName}/+/archive/${parsedUrl.branch}.zip?routingId=${ - parsedUrl.accountId - }`; + + let constructedUrl = `${parsedUrl.baseUrl}/gateway/code/api/v1/repos/${parsedUrl.accountId}`; + + if (parsedUrl.orgName) { + constructedUrl += `/${parsedUrl.orgName}`; + } + + if (parsedUrl.projectName) { + constructedUrl += `/${parsedUrl.projectName}`; + } + + constructedUrl += `/${parsedUrl.repoName}/+/archive/${parsedUrl.branch}.zip?routingId=${parsedUrl.accountId}`; + + return constructedUrl; } /** @@ -118,13 +131,20 @@ export function getHarnessLatestCommitUrl( url: string, ) { const parsedUrl = parseHarnessUrl(config, url); - return `${parsedUrl.baseUrl}/gateway/code/api/v1/repos/${ - parsedUrl.accountId - }/${parsedUrl.orgName}${ - parsedUrl.projectName !== '' ? `/${parsedUrl.projectName}/` : '/' - }${parsedUrl.repoName}/+/content?routingId=${ - parsedUrl.accountId - }&include_commit=true&git_ref=refs/heads/${parsedUrl.branch}`; + + let constructedUrl = `${parsedUrl.baseUrl}/gateway/code/api/v1/repos/${parsedUrl.accountId}`; + + if (parsedUrl.orgName) { + constructedUrl += `/${parsedUrl.orgName}`; + } + + if (parsedUrl.projectName) { + constructedUrl += `/${parsedUrl.projectName}`; + } + + constructedUrl += `/${parsedUrl.repoName}/+/content?routingId=${parsedUrl.accountId}&include_commit=true&git_ref=refs/heads/${parsedUrl.branch}`; + + return constructedUrl; } /** @@ -185,18 +205,20 @@ export function parseHarnessUrl( const orgNameIndex = pathSegments.findIndex(segment => segment === 'orgs'); const orgName = orgNameIndex !== -1 ? pathSegments[orgNameIndex + 1] : ''; - const projectNameIndex = pathSegments.findIndex( segment => segment === 'projects', ); const projectName = projectNameIndex !== -1 ? pathSegments[projectNameIndex + 1] : ''; - + // Adjust repoNameIndex to correctly identify the repository name const repoNameIndex = - pathSegments.findIndex(segment => segment === 'repos') + 1; + pathSegments.findIndex( + (segment, index) => + segment === 'repos' && + index > Math.max(accountIdIndex, orgNameIndex, projectNameIndex), + ) + 1; const repoName = pathSegments[repoNameIndex]; - const refAndPath = urlParts.slice( urlParts.findIndex(i => i === 'files' || i === 'edit') + 1, ); From 090e49a1f381bd940603b82c188650e2ae0d62ba Mon Sep 17 00:00:00 2001 From: Calvin Lee Date: Sun, 29 Sep 2024 14:07:41 -0700 Subject: [PATCH 062/217] feat: fix issue in repos and parsing Signed-off-by: Calvin Lee --- .changeset/tough-pillows-sip.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/tough-pillows-sip.md diff --git a/.changeset/tough-pillows-sip.md b/.changeset/tough-pillows-sip.md new file mode 100644 index 0000000000..9ded656fc8 --- /dev/null +++ b/.changeset/tough-pillows-sip.md @@ -0,0 +1,5 @@ +--- +'@backstage/integration': patch +--- + +Updated functions parseHarnessUrl, getHarnessLatestCommitUrl, getHarnessFileContentsUrl and getHarnessArchiveUrl From abdbde4285a8583326006d3153db82ea7da13884 Mon Sep 17 00:00:00 2001 From: Calvin Lee Date: Sun, 29 Sep 2024 14:08:53 -0700 Subject: [PATCH 063/217] feat: fix issue in repos and parsing Signed-off-by: Calvin Lee --- .changeset/tough-pillows-sip.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/tough-pillows-sip.md b/.changeset/tough-pillows-sip.md index 9ded656fc8..aea3e2d5a0 100644 --- a/.changeset/tough-pillows-sip.md +++ b/.changeset/tough-pillows-sip.md @@ -2,4 +2,4 @@ '@backstage/integration': patch --- -Updated functions parseHarnessUrl, getHarnessLatestCommitUrl, getHarnessFileContentsUrl and getHarnessArchiveUrl +Updated functions parseHarnessUrl, getHarnessLatestCommitUrl, getHarnessFileContentsUrl and getHarnessArchiveUrl to fix parsing of urls From 60403a86b88b61e4c113b62c4fd5ba207c6d01a2 Mon Sep 17 00:00:00 2001 From: mischievous007 Date: Mon, 30 Sep 2024 09:26:16 +0530 Subject: [PATCH 064/217] Fixes grammar in api docs Signed-off-by: mischievous007 --- docs/api/deprecations.md | 6 +++--- docs/api/utility-apis.md | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/api/deprecations.md b/docs/api/deprecations.md index 664d7c327d..d4a4a37041 100644 --- a/docs/api/deprecations.md +++ b/docs/api/deprecations.md @@ -26,7 +26,7 @@ opens up for other type of themes, and removes the hardcoded usage of To migrate an existing theme, remove the `theme` property and move it over to a new `Provider` component, using `ThemeProvider` from Material UI to provide the new -theme, along with ``. For example a theme that currently looks like +theme, along with ``. For example, a theme that currently looks like this: ```tsx @@ -84,7 +84,7 @@ migrate to your own custom API. First, you'll need to define a new Utility API reference. If you're only using the API for sign-in, you can put the definition in `packages/app/src/apis.ts`. However, if you need to access your auth API inside plugins you you'll need to -export it from a common package. If you don't already have one we recommended +export it from a common package. If you don't already have one, we recommended creating `@internal/apis` and from there export the API reference. ```ts @@ -101,7 +101,7 @@ export const acmeAuthApiRef: ApiRef< }); ``` -Next you'll want to wire up the API inside `packages/app/src/apis.ts`, which +Next, you'll want to wire up the API inside `packages/app/src/apis.ts`, which varies depending on which API you're replacing. If you for example are replacing the `oauth2ApiRef`, the factory might look like this: diff --git a/docs/api/utility-apis.md b/docs/api/utility-apis.md index 5df8fc334a..06183f1fc0 100644 --- a/docs/api/utility-apis.md +++ b/docs/api/utility-apis.md @@ -166,10 +166,10 @@ the final say in what APIs will be loaded at runtime? The app may override the factories for any of the core or plugin APIs, with the exception of the config, app theme, and identity APIs. These are static APIs that are tied into the [`createApp`](../reference/app-defaults.createapp.md) implementation and -therefore not possible to override. +therefore, not possible to override. Overriding APIs is useful for apps that want to switch out behavior to tailor it -to their environment. In some cases plugins, may also export multiple +to their environment. In some cases, plugins may also export multiple implementations of the same API, where they each have their own different requirements, for example, backend storage and the surrounding environment. From 7bfaf23de1d315e37a89c706bf8f9ef9d9745d62 Mon Sep 17 00:00:00 2001 From: zcmander Date: Thu, 26 Sep 2024 16:02:56 +0300 Subject: [PATCH 065/217] fix(scaffolder): use entity title for selected entity in EntityPicker field Signed-off-by: zcmander --- .changeset/large-hats-reply.md | 5 +++++ .../src/components/fields/EntityPicker/EntityPicker.tsx | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/large-hats-reply.md diff --git a/.changeset/large-hats-reply.md b/.changeset/large-hats-reply.md new file mode 100644 index 0000000000..02fe00d70c --- /dev/null +++ b/.changeset/large-hats-reply.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': minor +--- + +Text field content of the `EntityPicker` is now more readable as it uses entity title instead of entity reference. diff --git a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx index b97b776b19..2ef5171c7b 100644 --- a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx +++ b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx @@ -190,7 +190,7 @@ export const EntityPicker = (props: EntityPickerProps) => { typeof option === 'string' ? option : entities?.entityRefToPresentation.get(stringifyEntityRef(option)) - ?.entityRef! + ?.primaryTitle! } autoSelect freeSolo={allowArbitraryValues} From 0440f401881e6f0a72da3e7d0492adb57f70bfb9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 08:31:17 +0000 Subject: [PATCH 066/217] chore(deps): update dependency @backstage-community/plugin-puppetdb to v0.1.21 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/yarn.lock b/yarn.lock index 2544f782b9..fd39c35de1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3398,14 +3398,14 @@ __metadata: linkType: hard "@backstage-community/plugin-puppetdb@npm:^0.1.18": - version: 0.1.20 - resolution: "@backstage-community/plugin-puppetdb@npm:0.1.20" + version: 0.1.21 + resolution: "@backstage-community/plugin-puppetdb@npm:0.1.21" dependencies: - "@backstage/catalog-model": ^1.6.0 - "@backstage/core-components": ^0.14.10 - "@backstage/core-plugin-api": ^1.9.3 + "@backstage/catalog-model": ^1.7.0 + "@backstage/core-components": ^0.15.0 + "@backstage/core-plugin-api": ^1.9.4 "@backstage/errors": ^1.2.4 - "@backstage/plugin-catalog-react": ^1.12.3 + "@backstage/plugin-catalog-react": ^1.13.1 "@material-ui/core": ^4.12.2 "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 react-use: ^17.2.4 @@ -3413,7 +3413,7 @@ __metadata: react: ^16.13.1 || ^17.0.0 || ^18.0.0 react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: 231855a135575bdc6eb92890602589adcf82c5eabaec7dfaef456c598454d8d05e2484ee80c3684824a9b52f62ce313d5e780722ae0553c3742ec7a89ec558c7 + checksum: 35ba13300ef26f705ebd7844bfb8e6dc9bda4db5a4d92d09a9d1dbff52c73a5c4175081fd6b3ef4612cb6018250eedd4e7e1db63b9f1339f723866813dae1595 languageName: node linkType: hard @@ -3839,7 +3839,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/catalog-model@^1.4.3, @backstage/catalog-model@^1.6.0, @backstage/catalog-model@^1.7.0, @backstage/catalog-model@workspace:^, @backstage/catalog-model@workspace:packages/catalog-model": +"@backstage/catalog-model@^1.4.3, @backstage/catalog-model@^1.7.0, @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: @@ -4676,9 +4676,9 @@ __metadata: languageName: unknown linkType: soft -"@backstage/integration-react@npm:^1.1.31": - version: 1.1.31 - resolution: "@backstage/integration-react@npm:1.1.31" +"@backstage/integration-react@npm:^1.1.32": + version: 1.1.32 + resolution: "@backstage/integration-react@npm:1.1.32" dependencies: "@backstage/config": ^1.2.0 "@backstage/core-plugin-api": ^1.9.4 @@ -4690,7 +4690,7 @@ __metadata: react: ^16.13.1 || ^17.0.0 || ^18.0.0 react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: a31313bc3cd2189535eee6150ad49963f3172fa33d1c1f1c7f93e46b891c67ead9e0ea810bcfcbd6dc5ceabebb2036b0d562ec2088b0559d48c22e8b65e09bd1 + checksum: d26362ad3a8a6c8ac41b3eadf9c6d5b01e3cef3ca3e38a86bbf7b1c5e1b6e8ba5e940e74d31006faf0640a366ba8c5deb0ca6cbc58099d5f51fae6a7484944d6 languageName: node linkType: hard @@ -5979,9 +5979,9 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-react@npm:^1.12.3, @backstage/plugin-catalog-react@npm:^1.9.3": - version: 1.13.0 - resolution: "@backstage/plugin-catalog-react@npm:1.13.0" +"@backstage/plugin-catalog-react@npm:^1.13.1, @backstage/plugin-catalog-react@npm:^1.9.3": + version: 1.13.1 + resolution: "@backstage/plugin-catalog-react@npm:1.13.1" dependencies: "@backstage/catalog-client": ^1.7.0 "@backstage/catalog-model": ^1.7.0 @@ -5990,7 +5990,7 @@ __metadata: "@backstage/core-plugin-api": ^1.9.4 "@backstage/errors": ^1.2.4 "@backstage/frontend-plugin-api": ^0.8.0 - "@backstage/integration-react": ^1.1.31 + "@backstage/integration-react": ^1.1.32 "@backstage/plugin-catalog-common": ^1.1.0 "@backstage/plugin-permission-common": ^0.8.1 "@backstage/plugin-permission-react": ^0.4.26 @@ -6012,7 +6012,7 @@ __metadata: react: ^16.13.1 || ^17.0.0 || ^18.0.0 react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: e86fdfdab9f2b0fcbc68b0521acbc3c2ba95ab4206aabb09f307021960776f0aca6335cdb47b27c506b4a32f88768716839fe1e09e156d8970414da94992f0b9 + checksum: d41f4d3a72f17be6a9019a4d8acaeb9d3198e2b1d0e25bd28efb3b5617d301a5798e259d4bcc077351d76e1c130e565344564bf987f4079f4b4bc040ae7a9878 languageName: node linkType: hard From 9f48f87d85bc89210b009753886d17943405b30a Mon Sep 17 00:00:00 2001 From: Aditya Kumar <136452216+AdityaK60@users.noreply.github.com> Date: Mon, 30 Sep 2024 14:11:48 +0530 Subject: [PATCH 067/217] Update docs/api/deprecations.md Co-authored-by: Camila Belo Signed-off-by: Aditya Kumar <136452216+AdityaK60@users.noreply.github.com> --- docs/api/deprecations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api/deprecations.md b/docs/api/deprecations.md index d4a4a37041..d0d210c6a2 100644 --- a/docs/api/deprecations.md +++ b/docs/api/deprecations.md @@ -84,7 +84,7 @@ migrate to your own custom API. First, you'll need to define a new Utility API reference. If you're only using the API for sign-in, you can put the definition in `packages/app/src/apis.ts`. However, if you need to access your auth API inside plugins you you'll need to -export it from a common package. If you don't already have one, we recommended +export it from a common package. If you don't already have one, we recommend creating `@internal/apis` and from there export the API reference. ```ts From 5288e48267503719feb0bd031e736f784a0eefb1 Mon Sep 17 00:00:00 2001 From: Aditya Kumar <136452216+AdityaK60@users.noreply.github.com> Date: Mon, 30 Sep 2024 14:12:02 +0530 Subject: [PATCH 068/217] Update docs/api/deprecations.md Co-authored-by: Camila Belo Signed-off-by: Aditya Kumar <136452216+AdityaK60@users.noreply.github.com> --- docs/api/deprecations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api/deprecations.md b/docs/api/deprecations.md index d0d210c6a2..a9127426f0 100644 --- a/docs/api/deprecations.md +++ b/docs/api/deprecations.md @@ -85,7 +85,7 @@ First, you'll need to define a new Utility API reference. If you're only using the API for sign-in, you can put the definition in `packages/app/src/apis.ts`. However, if you need to access your auth API inside plugins you you'll need to export it from a common package. If you don't already have one, we recommend -creating `@internal/apis` and from there export the API reference. +creating `@internal/apis` and from there exporting the API reference. ```ts // `ProfileInfoApi & BackstageIdentityApi & SessionApi` are required for sign-in From 70c59bc9a355edc2890fead1c58777077269d301 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 09:21:31 +0000 Subject: [PATCH 069/217] chore(deps): update dependency @backstage-community/plugin-stackstorm to v0.1.19 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 65 +++++++------------------------------------------------ 1 file changed, 8 insertions(+), 57 deletions(-) diff --git a/yarn.lock b/yarn.lock index fd39c35de1..c8964dd4b6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3418,11 +3418,11 @@ __metadata: linkType: hard "@backstage-community/plugin-stackstorm@npm:^0.1.16": - version: 0.1.18 - resolution: "@backstage-community/plugin-stackstorm@npm:0.1.18" + version: 0.1.19 + resolution: "@backstage-community/plugin-stackstorm@npm:0.1.19" dependencies: - "@backstage/core-components": ^0.14.10 - "@backstage/core-plugin-api": ^1.9.3 + "@backstage/core-components": ^0.15.0 + "@backstage/core-plugin-api": ^1.9.4 "@backstage/errors": ^1.2.4 "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 @@ -3432,7 +3432,7 @@ __metadata: react: ^16.13.1 || ^17.0.0 || ^18.0.0 react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: 9a11e4ee8c6e28df83658b91efa27d41808664a19b71b874b7a3eaa1a6befa1733f92ed14902f291e8050cc78a879357ab2fd0b37042cad9f0953d78953fcfd5 + checksum: 861f59dbdc65e8ed9cb0bbcf08761ce7ae4cc5e43b548e95e99d3411930e77ff946cf6498212d8e3347b1d95feeb2df2777c02f606e9fe224ed22e261e1e2a1d languageName: node linkType: hard @@ -4235,55 +4235,6 @@ __metadata: languageName: node linkType: hard -"@backstage/core-components@npm:^0.14.10": - version: 0.14.10 - resolution: "@backstage/core-components@npm:0.14.10" - dependencies: - "@backstage/config": ^1.2.0 - "@backstage/core-plugin-api": ^1.9.3 - "@backstage/errors": ^1.2.4 - "@backstage/theme": ^0.5.6 - "@backstage/version-bridge": ^1.0.8 - "@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": ^24.0.0 - "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 - "@types/react-sparklines": ^1.7.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 - linkify-react: 4.1.3 - linkifyjs: 4.1.3 - lodash: ^4.17.21 - pluralize: ^8.0.0 - qs: ^6.9.4 - rc-progress: 3.5.1 - react-helmet: 6.1.0 - react-hook-form: ^7.12.2 - react-idle-timer: 5.7.2 - react-markdown: ^8.0.0 - react-sparklines: ^1.7.0 - react-syntax-highlighter: ^15.4.5 - 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.22.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: 303682d411b846a4892b27c1064d499dbd4eccb5a3cdc5acbb1d3247e1141f4704efc7bd286744c19818487e52a61891943156817f59e3bd6555926f7331f575 - languageName: node - linkType: hard - "@backstage/core-components@npm:^0.15.0": version: 0.15.0 resolution: "@backstage/core-components@npm:0.15.0" @@ -4404,7 +4355,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-plugin-api@npm:^1.8.2, @backstage/core-plugin-api@npm:^1.9.3, @backstage/core-plugin-api@npm:^1.9.4": +"@backstage/core-plugin-api@npm:^1.8.2, @backstage/core-plugin-api@npm:^1.9.4": version: 1.9.4 resolution: "@backstage/core-plugin-api@npm:1.9.4" dependencies: @@ -8269,7 +8220,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/theme@^0.5.0, @backstage/theme@^0.5.6, @backstage/theme@^0.5.7, @backstage/theme@workspace:^, @backstage/theme@workspace:packages/theme": +"@backstage/theme@^0.5.0, @backstage/theme@^0.5.7, @backstage/theme@workspace:^, @backstage/theme@workspace:packages/theme": version: 0.0.0-use.local resolution: "@backstage/theme@workspace:packages/theme" dependencies: @@ -8300,7 +8251,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/version-bridge@^1.0.7, @backstage/version-bridge@^1.0.8, @backstage/version-bridge@^1.0.9, @backstage/version-bridge@workspace:^, @backstage/version-bridge@workspace:packages/version-bridge": +"@backstage/version-bridge@^1.0.7, @backstage/version-bridge@^1.0.9, @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: From a89dde37e5dd39cbc1bc4a8b2123da7ea2a712f1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 10:08:35 +0000 Subject: [PATCH 070/217] chore(deps): update dependency @types/node to v18.19.54 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/yarn.lock b/yarn.lock index c8964dd4b6..53b3d07f2d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17907,11 +17907,11 @@ __metadata: linkType: hard "@types/node@npm:*, @types/node@npm:>=13.7.0": - version: 22.5.4 - resolution: "@types/node@npm:22.5.4" + version: 22.7.4 + resolution: "@types/node@npm:22.7.4" dependencies: undici-types: ~6.19.2 - checksum: 77ac225c38c428200036780036da0bc6764e2721cfa8f528c7e7da7cfefe01a32a5791e28a54efbeedbc977949058d7db902b2e00139298225d4686cee4ae6db + checksum: a3f4154147639369aed08fe6f8d62eff637cf87b187bb252d7bbccdc82884626007af424b08a653c53f2182adfa0340001b4888cb7cbb942cef351210fc742a5 languageName: node linkType: hard @@ -17930,9 +17930,9 @@ __metadata: linkType: hard "@types/node@npm:^16.11.26, @types/node@npm:^16.7.10": - version: 16.18.108 - resolution: "@types/node@npm:16.18.108" - checksum: 5029ce7b0d247690360f2698da4fe765ef5cd5e2409b63b3a45e90bbf7bbaaf3497e769336fb7725be04a221d6e934e3a4616ec7fc205812943def3ea9d70862 + version: 16.18.112 + resolution: "@types/node@npm:16.18.112" + checksum: d634729e60d2e7bd951843fddf5fb59ae786ca707f384e8f90881b011076962b4e3fee3393e3be4be4fb7d86943893e0bda9650aea24ac692bdf407bf1a5d84d languageName: node linkType: hard @@ -17944,20 +17944,20 @@ __metadata: linkType: hard "@types/node@npm:^18.11.9, @types/node@npm:^18.17.15, @types/node@npm:^18.17.8": - version: 18.19.50 - resolution: "@types/node@npm:18.19.50" + version: 18.19.54 + resolution: "@types/node@npm:18.19.54" dependencies: undici-types: ~5.26.4 - checksum: 73bdd2b46fb96816a1f7309e1b609f0832a29739c87df7daa729ff497160be143e02cf18486a0112e1981b092358aed3ca0716b532aff93c7e05f7dbb4f7586a + checksum: d85bacc7430c2913bcd2cf293f312bc1f9108819707ac25b58404185c3b8f9ca9e3e93c396672f457c18e65f5ba86cc8363803f830207c6b7dd14fd74e1455b0 languageName: node linkType: hard "@types/node@npm:^20.1.1, @types/node@npm:^20.11.16": - version: 20.16.5 - resolution: "@types/node@npm:20.16.5" + version: 20.16.10 + resolution: "@types/node@npm:20.16.10" dependencies: undici-types: ~6.19.2 - checksum: f38b7bd8c4993dcf38943afa2ffdd7dfd18fc94f8f3f28d0c1045a10d39871a6cc1b8f8d3bf0c7ed848457d0e1d283482f6ca125579c13fed1b7575d23e8e8f5 + checksum: 8b4d5a0af828871627e80da095df50ef8ae7ca458f39ccde1d060e3bf97b0bc76af9547bd5d75ce4ccb1dd80466804b2fe4f12553c11cb8691c6667effd9a9d7 languageName: node linkType: hard From 66141bbd21dd25943a539f828561ea2b42edeab9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Jerna=C5=9B?= Date: Mon, 30 Sep 2024 13:00:49 +0200 Subject: [PATCH 071/217] Update .changeset/silly-geckos-learn.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Vincenzo Scamporlino Signed-off-by: Łukasz Jernaś --- .changeset/silly-geckos-learn.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.changeset/silly-geckos-learn.md b/.changeset/silly-geckos-learn.md index e0b525fd4e..53d4301b5c 100644 --- a/.changeset/silly-geckos-learn.md +++ b/.changeset/silly-geckos-learn.md @@ -1,5 +1,5 @@ --- -'@backstage/plugin-user-settings': minor +'@backstage/plugin-user-settings': patch --- -Search for profile image also in User Entities +`useUserProfile` will now use the user's picture stored in the catalog as a fallback if the identity provider doesn't return a picture. From 5c7d9a3808adf5bb6ed11bcdf7f6016ef9955979 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Jerna=C5=9B?= Date: Mon, 30 Sep 2024 13:01:01 +0200 Subject: [PATCH 072/217] Update .changeset/ten-rings-look.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Vincenzo Scamporlino Signed-off-by: Łukasz Jernaś --- .changeset/ten-rings-look.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/ten-rings-look.md b/.changeset/ten-rings-look.md index b5275253f9..d3f6e059bd 100644 --- a/.changeset/ten-rings-look.md +++ b/.changeset/ten-rings-look.md @@ -1,5 +1,5 @@ --- -'@backstage/catalog-client': minor +'@backstage/catalog-client': patch --- Add missing doc string to API From 94a7bcdee9bac1d03d30ba81c6d5745c36683658 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl-Erik=20Bergstr=C3=B6m?= Date: Wed, 18 Sep 2024 11:59:32 +0200 Subject: [PATCH 073/217] fix: use outlined button as registering existing component is not a primary action MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Carl-Erik Bergström --- .changeset/hungry-buckets-repair.md | 5 +++++ .../components/TemplateListPage/RegisterExistingButton.tsx | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/hungry-buckets-repair.md diff --git a/.changeset/hungry-buckets-repair.md b/.changeset/hungry-buckets-repair.md new file mode 100644 index 0000000000..fde682d603 --- /dev/null +++ b/.changeset/hungry-buckets-repair.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': patch +--- + +Change "Register Existing Component" CTA to outlined as it's not a primary action on the scaffolder pages diff --git a/plugins/scaffolder/src/alpha/components/TemplateListPage/RegisterExistingButton.tsx b/plugins/scaffolder/src/alpha/components/TemplateListPage/RegisterExistingButton.tsx index abec7c47e1..126f00dde5 100644 --- a/plugins/scaffolder/src/alpha/components/TemplateListPage/RegisterExistingButton.tsx +++ b/plugins/scaffolder/src/alpha/components/TemplateListPage/RegisterExistingButton.tsx @@ -61,7 +61,7 @@ export const RegisterExistingButton = (props: RegisterExistingButtonProps) => { ) : ( - ); From 444965ad1d70cf34a629a279cc7b8894f34530fa Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 12:36:07 +0000 Subject: [PATCH 074/217] chore(deps): update dependency @types/react to v18.3.10 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 ad20fae595..e3be35497c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18282,12 +18282,12 @@ __metadata: linkType: hard "@types/react@npm:^18": - version: 18.3.7 - resolution: "@types/react@npm:18.3.7" + version: 18.3.10 + resolution: "@types/react@npm:18.3.10" dependencies: "@types/prop-types": "*" csstype: ^3.0.2 - checksum: 027cf84d8309c4d0a9b16ec26f71de0950e2d748293bbc4dac42519f77d0bec099aeb5fb1c0bcb891725973e53085c1aedea5c3a16bca215c2fc2ecf68c7ec6e + checksum: 04261654b5f4bc9584e9d882c7dfd5b36dc58963f958f8c3efd24cb68c9d205bc2d57558a1479b86d7827f0e5116d5bd111791d1253583d1e1c165f0aeb48c48 languageName: node linkType: hard From 30416a1c7a12281771b33c6b484a75b6ac0c3db8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 13:27:21 +0000 Subject: [PATCH 075/217] chore(deps): update dependency @vitejs/plugin-react to v4.3.2 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index e3be35497c..2225a1184d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1891,7 +1891,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.19.6, @babel/core@npm:^7.24.5, @babel/core@npm:^7.24.7": +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.19.6, @babel/core@npm:^7.24.7, @babel/core@npm:^7.25.2": version: 7.25.2 resolution: "@babel/core@npm:7.25.2" dependencies: @@ -2975,7 +2975,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-self@npm:^7.24.5": +"@babel/plugin-transform-react-jsx-self@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-react-jsx-self@npm:7.24.7" dependencies: @@ -2986,7 +2986,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-source@npm:^7.24.1": +"@babel/plugin-transform-react-jsx-source@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-react-jsx-source@npm:7.24.7" dependencies: @@ -19275,17 +19275,17 @@ __metadata: linkType: hard "@vitejs/plugin-react@npm:^4.3.1": - version: 4.3.1 - resolution: "@vitejs/plugin-react@npm:4.3.1" + version: 4.3.2 + resolution: "@vitejs/plugin-react@npm:4.3.2" dependencies: - "@babel/core": ^7.24.5 - "@babel/plugin-transform-react-jsx-self": ^7.24.5 - "@babel/plugin-transform-react-jsx-source": ^7.24.1 + "@babel/core": ^7.25.2 + "@babel/plugin-transform-react-jsx-self": ^7.24.7 + "@babel/plugin-transform-react-jsx-source": ^7.24.7 "@types/babel__core": ^7.20.5 react-refresh: ^0.14.2 peerDependencies: vite: ^4.2.0 || ^5.0.0 - checksum: 57872e0193c7e545c5ef4852cbe1adf17a6b35406a2aba4b3acce06c173a9dabbf6ff4c72701abc11bb3cbe24a056f5054f39018f7034c9aa57133a3a7770237 + checksum: 6bd3f8ec4a5c1f9f2970217d6a7291fafb41b7760f7761b982b6835c8f9cd3874cea9eb3b6659aa75c511954fcec7707116ea32042854b1be47902ebbb781794 languageName: node linkType: hard From 2e7fcc1410caff8f8fab1a802d2cf2b381bfda25 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 14:12:59 +0000 Subject: [PATCH 076/217] chore(deps): update dependency knip to v5.30.6 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index 2225a1184d..c40b034e82 100644 --- a/yarn.lock +++ b/yarn.lock @@ -31983,8 +31983,8 @@ __metadata: linkType: hard "knip@npm:^5.0.0": - version: 5.30.2 - resolution: "knip@npm:5.30.2" + version: 5.30.6 + resolution: "knip@npm:5.30.6" dependencies: "@nodelib/fs.walk": 1.2.8 "@snyk/github-codeowners": 1.1.0 @@ -31997,7 +31997,7 @@ __metadata: picocolors: ^1.0.0 picomatch: ^4.0.1 pretty-ms: ^9.0.0 - smol-toml: ^1.1.4 + smol-toml: ^1.3.0 strip-json-comments: 5.0.1 summary: 2.1.0 zod: ^3.22.4 @@ -32008,7 +32008,7 @@ __metadata: bin: knip: bin/knip.js knip-bun: bin/knip-bun.js - checksum: fafb6ee078c1e9f24e83c08c6b97c7ad82ef78d043eff6a064639e08354a4b81cbb132d705acc53874d0f0d02dc690d960f75efe8783ac349fde491bcbf1b742 + checksum: 9820761248882926789bdf3cf8014a32e695d94bdabc335b4b637bceaeec7922358b67027b46aa5f7f2af10460027d0d33be407d48db76e50c8d1dd8dfca95ce languageName: node linkType: hard @@ -40484,10 +40484,10 @@ __metadata: languageName: node linkType: hard -"smol-toml@npm:^1.1.4": - version: 1.2.1 - resolution: "smol-toml@npm:1.2.1" - checksum: 12040dd8e38b6efb7a1572bfd803c6a7ac89b8d715d0614b024601165059ea3f4653dd5b87b601308dcefd20a26af8445e9be9888b52e0c4f24d1bfc6d2c4e84 +"smol-toml@npm:^1.3.0": + version: 1.3.0 + resolution: "smol-toml@npm:1.3.0" + checksum: 79e1db6b6cd32a13ad7602bfe1a02f20894fe599657a5cc2c8ffab7c3de4ba51f7426b701b513f9b859560918b36a63f7c73f7eaf6def8a1dc73db74ffd9b601 languageName: node linkType: hard From 949ac48303bf463be6392fc52980248053b84d00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Mon, 30 Sep 2024 16:42:57 +0200 Subject: [PATCH 077/217] fixup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../backend-defaults/report-urlReader.api.md | 134 +++++++++--------- plugins/catalog-backend/report.api.md | 2 +- plugins/catalog-node/report.api.md | 30 ++-- plugins/scaffolder-backend/report.api.md | 68 ++++----- plugins/scaffolder-node/report.api.md | 10 +- yarn.lock | 63 ++++---- 6 files changed, 157 insertions(+), 150 deletions(-) diff --git a/packages/backend-defaults/report-urlReader.api.md b/packages/backend-defaults/report-urlReader.api.md index 7b41ce33e4..77f0d5ccbd 100644 --- a/packages/backend-defaults/report-urlReader.api.md +++ b/packages/backend-defaults/report-urlReader.api.md @@ -449,73 +449,73 @@ export type UrlReadersOptions = { // Warnings were encountered during analysis: // -// src/entrypoints/urlReader/lib/AwsS3UrlReader.d.ts:27:5 - (ae-undocumented) Missing documentation for "factory". -// src/entrypoints/urlReader/lib/AwsS3UrlReader.d.ts:39:5 - (ae-undocumented) Missing documentation for "read". -// src/entrypoints/urlReader/lib/AwsS3UrlReader.d.ts:40:5 - (ae-undocumented) Missing documentation for "readUrl". -// src/entrypoints/urlReader/lib/AwsS3UrlReader.d.ts:41:5 - (ae-undocumented) Missing documentation for "readTree". -// src/entrypoints/urlReader/lib/AwsS3UrlReader.d.ts:42:5 - (ae-undocumented) Missing documentation for "search". -// src/entrypoints/urlReader/lib/AwsS3UrlReader.d.ts:43:5 - (ae-undocumented) Missing documentation for "toString". -// src/entrypoints/urlReader/lib/AzureUrlReader.d.ts:13:5 - (ae-undocumented) Missing documentation for "factory". -// src/entrypoints/urlReader/lib/AzureUrlReader.d.ts:18:5 - (ae-undocumented) Missing documentation for "read". -// src/entrypoints/urlReader/lib/AzureUrlReader.d.ts:19:5 - (ae-undocumented) Missing documentation for "readUrl". -// src/entrypoints/urlReader/lib/AzureUrlReader.d.ts:20:5 - (ae-undocumented) Missing documentation for "readTree". -// src/entrypoints/urlReader/lib/AzureUrlReader.d.ts:21:5 - (ae-undocumented) Missing documentation for "search". -// src/entrypoints/urlReader/lib/AzureUrlReader.d.ts:22:5 - (ae-undocumented) Missing documentation for "toString". -// src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.d.ts:13:5 - (ae-undocumented) Missing documentation for "factory". -// src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.d.ts:17:5 - (ae-undocumented) Missing documentation for "read". -// src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.d.ts:18:5 - (ae-undocumented) Missing documentation for "readUrl". -// src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.d.ts:19:5 - (ae-undocumented) Missing documentation for "readTree". -// src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.d.ts:20:5 - (ae-undocumented) Missing documentation for "search". -// src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.d.ts:21:5 - (ae-undocumented) Missing documentation for "toString". -// src/entrypoints/urlReader/lib/BitbucketServerUrlReader.d.ts:13:5 - (ae-undocumented) Missing documentation for "factory". -// src/entrypoints/urlReader/lib/BitbucketServerUrlReader.d.ts:17:5 - (ae-undocumented) Missing documentation for "read". -// src/entrypoints/urlReader/lib/BitbucketServerUrlReader.d.ts:18:5 - (ae-undocumented) Missing documentation for "readUrl". -// src/entrypoints/urlReader/lib/BitbucketServerUrlReader.d.ts:19:5 - (ae-undocumented) Missing documentation for "readTree". -// src/entrypoints/urlReader/lib/BitbucketServerUrlReader.d.ts:20:5 - (ae-undocumented) Missing documentation for "search". -// src/entrypoints/urlReader/lib/BitbucketServerUrlReader.d.ts:21:5 - (ae-undocumented) Missing documentation for "toString". -// src/entrypoints/urlReader/lib/BitbucketUrlReader.d.ts:16:5 - (ae-undocumented) Missing documentation for "factory". -// src/entrypoints/urlReader/lib/BitbucketUrlReader.d.ts:20:5 - (ae-undocumented) Missing documentation for "read". -// src/entrypoints/urlReader/lib/BitbucketUrlReader.d.ts:21:5 - (ae-undocumented) Missing documentation for "readUrl". -// src/entrypoints/urlReader/lib/BitbucketUrlReader.d.ts:22:5 - (ae-undocumented) Missing documentation for "readTree". -// src/entrypoints/urlReader/lib/BitbucketUrlReader.d.ts:23:5 - (ae-undocumented) Missing documentation for "search". -// src/entrypoints/urlReader/lib/BitbucketUrlReader.d.ts:24:5 - (ae-undocumented) Missing documentation for "toString". -// src/entrypoints/urlReader/lib/FetchUrlReader.d.ts:23:5 - (ae-undocumented) Missing documentation for "read". -// src/entrypoints/urlReader/lib/FetchUrlReader.d.ts:24:5 - (ae-undocumented) Missing documentation for "readUrl". -// src/entrypoints/urlReader/lib/FetchUrlReader.d.ts:25:5 - (ae-undocumented) Missing documentation for "readTree". -// src/entrypoints/urlReader/lib/FetchUrlReader.d.ts:26:5 - (ae-undocumented) Missing documentation for "search". -// src/entrypoints/urlReader/lib/FetchUrlReader.d.ts:27:5 - (ae-undocumented) Missing documentation for "toString". -// src/entrypoints/urlReader/lib/GerritUrlReader.d.ts:28:5 - (ae-undocumented) Missing documentation for "factory". -// src/entrypoints/urlReader/lib/GerritUrlReader.d.ts:32:5 - (ae-undocumented) Missing documentation for "read". -// src/entrypoints/urlReader/lib/GerritUrlReader.d.ts:33:5 - (ae-undocumented) Missing documentation for "readUrl". -// src/entrypoints/urlReader/lib/GerritUrlReader.d.ts:34:5 - (ae-undocumented) Missing documentation for "readTree". -// src/entrypoints/urlReader/lib/GerritUrlReader.d.ts:35:5 - (ae-undocumented) Missing documentation for "search". -// src/entrypoints/urlReader/lib/GerritUrlReader.d.ts:36:5 - (ae-undocumented) Missing documentation for "toString". -// src/entrypoints/urlReader/lib/GiteaUrlReader.d.ts:13:5 - (ae-undocumented) Missing documentation for "factory". -// src/entrypoints/urlReader/lib/GiteaUrlReader.d.ts:17:5 - (ae-undocumented) Missing documentation for "read". -// src/entrypoints/urlReader/lib/GiteaUrlReader.d.ts:18:5 - (ae-undocumented) Missing documentation for "readUrl". -// src/entrypoints/urlReader/lib/GiteaUrlReader.d.ts:19:5 - (ae-undocumented) Missing documentation for "readTree". -// src/entrypoints/urlReader/lib/GiteaUrlReader.d.ts:20:5 - (ae-undocumented) Missing documentation for "search". -// src/entrypoints/urlReader/lib/GiteaUrlReader.d.ts:21:5 - (ae-undocumented) Missing documentation for "toString". -// src/entrypoints/urlReader/lib/GithubUrlReader.d.ts:19:5 - (ae-undocumented) Missing documentation for "factory". -// src/entrypoints/urlReader/lib/GithubUrlReader.d.ts:24:5 - (ae-undocumented) Missing documentation for "read". -// src/entrypoints/urlReader/lib/GithubUrlReader.d.ts:26:5 - (ae-undocumented) Missing documentation for "readUrl". -// src/entrypoints/urlReader/lib/GithubUrlReader.d.ts:27:5 - (ae-undocumented) Missing documentation for "readTree". -// src/entrypoints/urlReader/lib/GithubUrlReader.d.ts:28:5 - (ae-undocumented) Missing documentation for "search". -// src/entrypoints/urlReader/lib/GithubUrlReader.d.ts:29:5 - (ae-undocumented) Missing documentation for "toString". -// src/entrypoints/urlReader/lib/GitlabUrlReader.d.ts:13:5 - (ae-undocumented) Missing documentation for "factory". -// src/entrypoints/urlReader/lib/GitlabUrlReader.d.ts:17:5 - (ae-undocumented) Missing documentation for "read". -// src/entrypoints/urlReader/lib/GitlabUrlReader.d.ts:18:5 - (ae-undocumented) Missing documentation for "readUrl". -// src/entrypoints/urlReader/lib/GitlabUrlReader.d.ts:19:5 - (ae-undocumented) Missing documentation for "readTree". -// src/entrypoints/urlReader/lib/GitlabUrlReader.d.ts:20:5 - (ae-undocumented) Missing documentation for "search". -// src/entrypoints/urlReader/lib/GitlabUrlReader.d.ts:30:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/entrypoints/urlReader/lib/GitlabUrlReader.d.ts:31:8 - (tsdoc-undefined-tag) The TSDoc tag "@private" is not defined in this configuration -// src/entrypoints/urlReader/lib/GitlabUrlReader.d.ts:34:5 - (ae-undocumented) Missing documentation for "toString". -// src/entrypoints/urlReader/lib/HarnessUrlReader.d.ts:14:5 - (ae-undocumented) Missing documentation for "factory". -// src/entrypoints/urlReader/lib/HarnessUrlReader.d.ts:18:5 - (ae-undocumented) Missing documentation for "read". -// src/entrypoints/urlReader/lib/HarnessUrlReader.d.ts:19:5 - (ae-undocumented) Missing documentation for "readUrl". -// src/entrypoints/urlReader/lib/HarnessUrlReader.d.ts:20:5 - (ae-undocumented) Missing documentation for "readTree". -// src/entrypoints/urlReader/lib/HarnessUrlReader.d.ts:21:5 - (ae-undocumented) Missing documentation for "search". -// src/entrypoints/urlReader/lib/HarnessUrlReader.d.ts:22:5 - (ae-undocumented) Missing documentation for "toString". +// src/entrypoints/urlReader/lib/AwsS3UrlReader.d.ts:28:5 - (ae-undocumented) Missing documentation for "factory". +// src/entrypoints/urlReader/lib/AwsS3UrlReader.d.ts:40:5 - (ae-undocumented) Missing documentation for "read". +// src/entrypoints/urlReader/lib/AwsS3UrlReader.d.ts:41:5 - (ae-undocumented) Missing documentation for "readUrl". +// src/entrypoints/urlReader/lib/AwsS3UrlReader.d.ts:42:5 - (ae-undocumented) Missing documentation for "readTree". +// src/entrypoints/urlReader/lib/AwsS3UrlReader.d.ts:43:5 - (ae-undocumented) Missing documentation for "search". +// src/entrypoints/urlReader/lib/AwsS3UrlReader.d.ts:44:5 - (ae-undocumented) Missing documentation for "toString". +// src/entrypoints/urlReader/lib/AzureUrlReader.d.ts:14:5 - (ae-undocumented) Missing documentation for "factory". +// src/entrypoints/urlReader/lib/AzureUrlReader.d.ts:19:5 - (ae-undocumented) Missing documentation for "read". +// src/entrypoints/urlReader/lib/AzureUrlReader.d.ts:20:5 - (ae-undocumented) Missing documentation for "readUrl". +// src/entrypoints/urlReader/lib/AzureUrlReader.d.ts:21:5 - (ae-undocumented) Missing documentation for "readTree". +// src/entrypoints/urlReader/lib/AzureUrlReader.d.ts:22:5 - (ae-undocumented) Missing documentation for "search". +// src/entrypoints/urlReader/lib/AzureUrlReader.d.ts:23:5 - (ae-undocumented) Missing documentation for "toString". +// src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.d.ts:14:5 - (ae-undocumented) Missing documentation for "factory". +// src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.d.ts:18:5 - (ae-undocumented) Missing documentation for "read". +// src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.d.ts:19:5 - (ae-undocumented) Missing documentation for "readUrl". +// src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.d.ts:20:5 - (ae-undocumented) Missing documentation for "readTree". +// src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.d.ts:21:5 - (ae-undocumented) Missing documentation for "search". +// src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.d.ts:22:5 - (ae-undocumented) Missing documentation for "toString". +// src/entrypoints/urlReader/lib/BitbucketServerUrlReader.d.ts:14:5 - (ae-undocumented) Missing documentation for "factory". +// src/entrypoints/urlReader/lib/BitbucketServerUrlReader.d.ts:18:5 - (ae-undocumented) Missing documentation for "read". +// src/entrypoints/urlReader/lib/BitbucketServerUrlReader.d.ts:19:5 - (ae-undocumented) Missing documentation for "readUrl". +// src/entrypoints/urlReader/lib/BitbucketServerUrlReader.d.ts:20:5 - (ae-undocumented) Missing documentation for "readTree". +// src/entrypoints/urlReader/lib/BitbucketServerUrlReader.d.ts:21:5 - (ae-undocumented) Missing documentation for "search". +// src/entrypoints/urlReader/lib/BitbucketServerUrlReader.d.ts:22:5 - (ae-undocumented) Missing documentation for "toString". +// src/entrypoints/urlReader/lib/BitbucketUrlReader.d.ts:17:5 - (ae-undocumented) Missing documentation for "factory". +// src/entrypoints/urlReader/lib/BitbucketUrlReader.d.ts:21:5 - (ae-undocumented) Missing documentation for "read". +// src/entrypoints/urlReader/lib/BitbucketUrlReader.d.ts:22:5 - (ae-undocumented) Missing documentation for "readUrl". +// src/entrypoints/urlReader/lib/BitbucketUrlReader.d.ts:23:5 - (ae-undocumented) Missing documentation for "readTree". +// src/entrypoints/urlReader/lib/BitbucketUrlReader.d.ts:24:5 - (ae-undocumented) Missing documentation for "search". +// src/entrypoints/urlReader/lib/BitbucketUrlReader.d.ts:25:5 - (ae-undocumented) Missing documentation for "toString". +// src/entrypoints/urlReader/lib/FetchUrlReader.d.ts:24:5 - (ae-undocumented) Missing documentation for "read". +// src/entrypoints/urlReader/lib/FetchUrlReader.d.ts:25:5 - (ae-undocumented) Missing documentation for "readUrl". +// src/entrypoints/urlReader/lib/FetchUrlReader.d.ts:26:5 - (ae-undocumented) Missing documentation for "readTree". +// src/entrypoints/urlReader/lib/FetchUrlReader.d.ts:27:5 - (ae-undocumented) Missing documentation for "search". +// src/entrypoints/urlReader/lib/FetchUrlReader.d.ts:28:5 - (ae-undocumented) Missing documentation for "toString". +// src/entrypoints/urlReader/lib/GerritUrlReader.d.ts:29:5 - (ae-undocumented) Missing documentation for "factory". +// src/entrypoints/urlReader/lib/GerritUrlReader.d.ts:33:5 - (ae-undocumented) Missing documentation for "read". +// src/entrypoints/urlReader/lib/GerritUrlReader.d.ts:34:5 - (ae-undocumented) Missing documentation for "readUrl". +// src/entrypoints/urlReader/lib/GerritUrlReader.d.ts:35:5 - (ae-undocumented) Missing documentation for "readTree". +// src/entrypoints/urlReader/lib/GerritUrlReader.d.ts:36:5 - (ae-undocumented) Missing documentation for "search". +// src/entrypoints/urlReader/lib/GerritUrlReader.d.ts:37:5 - (ae-undocumented) Missing documentation for "toString". +// src/entrypoints/urlReader/lib/GiteaUrlReader.d.ts:14:5 - (ae-undocumented) Missing documentation for "factory". +// src/entrypoints/urlReader/lib/GiteaUrlReader.d.ts:18:5 - (ae-undocumented) Missing documentation for "read". +// src/entrypoints/urlReader/lib/GiteaUrlReader.d.ts:19:5 - (ae-undocumented) Missing documentation for "readUrl". +// src/entrypoints/urlReader/lib/GiteaUrlReader.d.ts:20:5 - (ae-undocumented) Missing documentation for "readTree". +// src/entrypoints/urlReader/lib/GiteaUrlReader.d.ts:21:5 - (ae-undocumented) Missing documentation for "search". +// src/entrypoints/urlReader/lib/GiteaUrlReader.d.ts:22:5 - (ae-undocumented) Missing documentation for "toString". +// src/entrypoints/urlReader/lib/GithubUrlReader.d.ts:20:5 - (ae-undocumented) Missing documentation for "factory". +// src/entrypoints/urlReader/lib/GithubUrlReader.d.ts:25:5 - (ae-undocumented) Missing documentation for "read". +// src/entrypoints/urlReader/lib/GithubUrlReader.d.ts:27:5 - (ae-undocumented) Missing documentation for "readUrl". +// src/entrypoints/urlReader/lib/GithubUrlReader.d.ts:28:5 - (ae-undocumented) Missing documentation for "readTree". +// src/entrypoints/urlReader/lib/GithubUrlReader.d.ts:29:5 - (ae-undocumented) Missing documentation for "search". +// src/entrypoints/urlReader/lib/GithubUrlReader.d.ts:30:5 - (ae-undocumented) Missing documentation for "toString". +// src/entrypoints/urlReader/lib/GitlabUrlReader.d.ts:14:5 - (ae-undocumented) Missing documentation for "factory". +// src/entrypoints/urlReader/lib/GitlabUrlReader.d.ts:18:5 - (ae-undocumented) Missing documentation for "read". +// src/entrypoints/urlReader/lib/GitlabUrlReader.d.ts:19:5 - (ae-undocumented) Missing documentation for "readUrl". +// src/entrypoints/urlReader/lib/GitlabUrlReader.d.ts:20:5 - (ae-undocumented) Missing documentation for "readTree". +// src/entrypoints/urlReader/lib/GitlabUrlReader.d.ts:21:5 - (ae-undocumented) Missing documentation for "search". +// src/entrypoints/urlReader/lib/GitlabUrlReader.d.ts:31:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/entrypoints/urlReader/lib/GitlabUrlReader.d.ts:32:8 - (tsdoc-undefined-tag) The TSDoc tag "@private" is not defined in this configuration +// src/entrypoints/urlReader/lib/GitlabUrlReader.d.ts:35:5 - (ae-undocumented) Missing documentation for "toString". +// src/entrypoints/urlReader/lib/HarnessUrlReader.d.ts:15:5 - (ae-undocumented) Missing documentation for "factory". +// src/entrypoints/urlReader/lib/HarnessUrlReader.d.ts:19:5 - (ae-undocumented) Missing documentation for "read". +// src/entrypoints/urlReader/lib/HarnessUrlReader.d.ts:20:5 - (ae-undocumented) Missing documentation for "readUrl". +// src/entrypoints/urlReader/lib/HarnessUrlReader.d.ts:21:5 - (ae-undocumented) Missing documentation for "readTree". +// src/entrypoints/urlReader/lib/HarnessUrlReader.d.ts:22:5 - (ae-undocumented) Missing documentation for "search". +// src/entrypoints/urlReader/lib/HarnessUrlReader.d.ts:23:5 - (ae-undocumented) Missing documentation for "toString". // src/entrypoints/urlReader/lib/types.d.ts:74:5 - (ae-undocumented) Missing documentation for "fromTarArchive". // src/entrypoints/urlReader/lib/types.d.ts:81:5 - (ae-undocumented) Missing documentation for "fromZipArchive". // src/entrypoints/urlReader/lib/types.d.ts:82:5 - (ae-undocumented) Missing documentation for "fromReadableArray". diff --git a/plugins/catalog-backend/report.api.md b/plugins/catalog-backend/report.api.md index 9e27995a28..6fff29f6f8 100644 --- a/plugins/catalog-backend/report.api.md +++ b/plugins/catalog-backend/report.api.md @@ -558,5 +558,5 @@ export class UrlReaderProcessor implements CatalogProcessor_2 { // src/search/DefaultCatalogCollator.d.ts:33:5 - (ae-undocumented) Missing documentation for "execute". // src/service/CatalogBuilder.d.ts:19:1 - (ae-undocumented) Missing documentation for "CatalogEnvironment". // src/service/CatalogBuilder.d.ts:233:5 - (ae-undocumented) Missing documentation for "subscribe". -// src/util/parse.d.ts:5:1 - (ae-undocumented) Missing documentation for "parseEntityYaml". +// src/util/parse.d.ts:6:1 - (ae-undocumented) Missing documentation for "parseEntityYaml". ``` diff --git a/plugins/catalog-node/report.api.md b/plugins/catalog-node/report.api.md index 1e585d59e2..3702f933ee 100644 --- a/plugins/catalog-node/report.api.md +++ b/plugins/catalog-node/report.api.md @@ -246,19 +246,19 @@ export type ScmLocationAnalyzer = { // Warnings were encountered during analysis: // -// src/api/processor.d.ts:9:1 - (ae-undocumented) Missing documentation for "CatalogProcessor". -// src/api/processor.d.ts:104:1 - (ae-undocumented) Missing documentation for "CatalogProcessorEmit". -// src/api/processor.d.ts:106:1 - (ae-undocumented) Missing documentation for "CatalogProcessorLocationResult". -// src/api/processor.d.ts:111:1 - (ae-undocumented) Missing documentation for "CatalogProcessorEntityResult". -// src/api/processor.d.ts:117:1 - (ae-undocumented) Missing documentation for "CatalogProcessorRelationResult". -// src/api/processor.d.ts:122:1 - (ae-undocumented) Missing documentation for "CatalogProcessorErrorResult". -// src/api/processor.d.ts:128:1 - (ae-undocumented) Missing documentation for "CatalogProcessorRefreshKeysResult". -// src/api/processor.d.ts:133:1 - (ae-undocumented) Missing documentation for "CatalogProcessorResult". -// src/processing/types.d.ts:16:1 - (ae-undocumented) Missing documentation for "PlaceholderResolverRead". -// src/processing/types.d.ts:18:1 - (ae-undocumented) Missing documentation for "PlaceholderResolverResolveUrl". -// src/processing/types.d.ts:20:1 - (ae-undocumented) Missing documentation for "PlaceholderResolverParams". -// src/processing/types.d.ts:29:1 - (ae-undocumented) Missing documentation for "PlaceholderResolver". -// src/processing/types.d.ts:31:1 - (ae-undocumented) Missing documentation for "LocationAnalyzer". -// src/processing/types.d.ts:41:1 - (ae-undocumented) Missing documentation for "AnalyzeOptions". -// src/processing/types.d.ts:46:1 - (ae-undocumented) Missing documentation for "ScmLocationAnalyzer". +// src/api/processor.d.ts:10:1 - (ae-undocumented) Missing documentation for "CatalogProcessor". +// src/api/processor.d.ts:105:1 - (ae-undocumented) Missing documentation for "CatalogProcessorEmit". +// src/api/processor.d.ts:107:1 - (ae-undocumented) Missing documentation for "CatalogProcessorLocationResult". +// src/api/processor.d.ts:112:1 - (ae-undocumented) Missing documentation for "CatalogProcessorEntityResult". +// src/api/processor.d.ts:118:1 - (ae-undocumented) Missing documentation for "CatalogProcessorRelationResult". +// src/api/processor.d.ts:123:1 - (ae-undocumented) Missing documentation for "CatalogProcessorErrorResult". +// src/api/processor.d.ts:129:1 - (ae-undocumented) Missing documentation for "CatalogProcessorRefreshKeysResult". +// src/api/processor.d.ts:134:1 - (ae-undocumented) Missing documentation for "CatalogProcessorResult". +// src/processing/types.d.ts:17:1 - (ae-undocumented) Missing documentation for "PlaceholderResolverRead". +// src/processing/types.d.ts:19:1 - (ae-undocumented) Missing documentation for "PlaceholderResolverResolveUrl". +// src/processing/types.d.ts:21:1 - (ae-undocumented) Missing documentation for "PlaceholderResolverParams". +// src/processing/types.d.ts:30:1 - (ae-undocumented) Missing documentation for "PlaceholderResolver". +// src/processing/types.d.ts:32:1 - (ae-undocumented) Missing documentation for "LocationAnalyzer". +// src/processing/types.d.ts:42:1 - (ae-undocumented) Missing documentation for "AnalyzeOptions". +// src/processing/types.d.ts:47:1 - (ae-undocumented) Missing documentation for "ScmLocationAnalyzer". ``` diff --git a/plugins/scaffolder-backend/report.api.md b/plugins/scaffolder-backend/report.api.md index 9ea60fcfdd..e791762416 100644 --- a/plugins/scaffolder-backend/report.api.md +++ b/plugins/scaffolder-backend/report.api.md @@ -871,40 +871,40 @@ export type TemplatePermissionRuleInput< // src/scaffolder/actions/deprecated.d.ts:109:22 - (ae-undocumented) Missing documentation for "createPublishGerritReviewAction". // src/scaffolder/actions/deprecated.d.ts:114:22 - (ae-undocumented) Missing documentation for "createPublishGitlabAction". // src/scaffolder/actions/deprecated.d.ts:119:22 - (ae-undocumented) Missing documentation for "createPublishGitlabMergeRequestAction". -// src/scaffolder/tasks/DatabaseTaskStore.d.ts:41:5 - (ae-undocumented) Missing documentation for "create". -// src/scaffolder/tasks/DatabaseTaskStore.d.ts:48:5 - (ae-undocumented) Missing documentation for "list". -// src/scaffolder/tasks/DatabaseTaskStore.d.ts:67:5 - (ae-undocumented) Missing documentation for "getTask". -// src/scaffolder/tasks/DatabaseTaskStore.d.ts:68:5 - (ae-undocumented) Missing documentation for "createTask". -// src/scaffolder/tasks/DatabaseTaskStore.d.ts:69:5 - (ae-undocumented) Missing documentation for "claimTask". -// src/scaffolder/tasks/DatabaseTaskStore.d.ts:70:5 - (ae-undocumented) Missing documentation for "heartbeatTask". -// src/scaffolder/tasks/DatabaseTaskStore.d.ts:71:5 - (ae-undocumented) Missing documentation for "listStaleTasks". -// src/scaffolder/tasks/DatabaseTaskStore.d.ts:79:5 - (ae-undocumented) Missing documentation for "completeTask". -// src/scaffolder/tasks/DatabaseTaskStore.d.ts:84:5 - (ae-undocumented) Missing documentation for "emitLogEvent". -// src/scaffolder/tasks/DatabaseTaskStore.d.ts:87:5 - (ae-undocumented) Missing documentation for "getTaskState". -// src/scaffolder/tasks/DatabaseTaskStore.d.ts:92:5 - (ae-undocumented) Missing documentation for "saveTaskState". -// src/scaffolder/tasks/DatabaseTaskStore.d.ts:96:5 - (ae-undocumented) Missing documentation for "listEvents". -// src/scaffolder/tasks/DatabaseTaskStore.d.ts:99:5 - (ae-undocumented) Missing documentation for "shutdownTask". -// src/scaffolder/tasks/DatabaseTaskStore.d.ts:100:5 - (ae-undocumented) Missing documentation for "rehydrateWorkspace". -// src/scaffolder/tasks/DatabaseTaskStore.d.ts:104:5 - (ae-undocumented) Missing documentation for "cleanWorkspace". -// src/scaffolder/tasks/DatabaseTaskStore.d.ts:107:5 - (ae-undocumented) Missing documentation for "serializeWorkspace". -// src/scaffolder/tasks/DatabaseTaskStore.d.ts:111:5 - (ae-undocumented) Missing documentation for "cancelTask". -// src/scaffolder/tasks/DatabaseTaskStore.d.ts:114:5 - (ae-undocumented) Missing documentation for "retryTask". -// src/scaffolder/tasks/DatabaseTaskStore.d.ts:117:5 - (ae-undocumented) Missing documentation for "recoverTasks". -// src/scaffolder/tasks/StorageTaskBroker.d.ts:24:5 - (ae-undocumented) Missing documentation for "create". -// src/scaffolder/tasks/StorageTaskBroker.d.ts:26:5 - (ae-undocumented) Missing documentation for "spec". -// src/scaffolder/tasks/StorageTaskBroker.d.ts:27:5 - (ae-undocumented) Missing documentation for "cancelSignal". -// src/scaffolder/tasks/StorageTaskBroker.d.ts:28:5 - (ae-undocumented) Missing documentation for "secrets". -// src/scaffolder/tasks/StorageTaskBroker.d.ts:29:5 - (ae-undocumented) Missing documentation for "createdBy". -// src/scaffolder/tasks/StorageTaskBroker.d.ts:30:5 - (ae-undocumented) Missing documentation for "getWorkspaceName". -// src/scaffolder/tasks/StorageTaskBroker.d.ts:31:5 - (ae-undocumented) Missing documentation for "rehydrateWorkspace". -// src/scaffolder/tasks/StorageTaskBroker.d.ts:35:5 - (ae-undocumented) Missing documentation for "done". -// src/scaffolder/tasks/StorageTaskBroker.d.ts:36:5 - (ae-undocumented) Missing documentation for "emitLog". -// src/scaffolder/tasks/StorageTaskBroker.d.ts:37:5 - (ae-undocumented) Missing documentation for "getTaskState". -// src/scaffolder/tasks/StorageTaskBroker.d.ts:40:5 - (ae-undocumented) Missing documentation for "updateCheckpoint". -// src/scaffolder/tasks/StorageTaskBroker.d.ts:49:5 - (ae-undocumented) Missing documentation for "serializeWorkspace". -// src/scaffolder/tasks/StorageTaskBroker.d.ts:52:5 - (ae-undocumented) Missing documentation for "cleanWorkspace". -// src/scaffolder/tasks/StorageTaskBroker.d.ts:53:5 - (ae-undocumented) Missing documentation for "complete". -// src/scaffolder/tasks/StorageTaskBroker.d.ts:55:5 - (ae-undocumented) Missing documentation for "getInitiatorCredentials". +// src/scaffolder/tasks/DatabaseTaskStore.d.ts:42:5 - (ae-undocumented) Missing documentation for "create". +// src/scaffolder/tasks/DatabaseTaskStore.d.ts:49:5 - (ae-undocumented) Missing documentation for "list". +// src/scaffolder/tasks/DatabaseTaskStore.d.ts:68:5 - (ae-undocumented) Missing documentation for "getTask". +// src/scaffolder/tasks/DatabaseTaskStore.d.ts:69:5 - (ae-undocumented) Missing documentation for "createTask". +// src/scaffolder/tasks/DatabaseTaskStore.d.ts:70:5 - (ae-undocumented) Missing documentation for "claimTask". +// src/scaffolder/tasks/DatabaseTaskStore.d.ts:71:5 - (ae-undocumented) Missing documentation for "heartbeatTask". +// src/scaffolder/tasks/DatabaseTaskStore.d.ts:72:5 - (ae-undocumented) Missing documentation for "listStaleTasks". +// src/scaffolder/tasks/DatabaseTaskStore.d.ts:80:5 - (ae-undocumented) Missing documentation for "completeTask". +// src/scaffolder/tasks/DatabaseTaskStore.d.ts:85:5 - (ae-undocumented) Missing documentation for "emitLogEvent". +// src/scaffolder/tasks/DatabaseTaskStore.d.ts:88:5 - (ae-undocumented) Missing documentation for "getTaskState". +// src/scaffolder/tasks/DatabaseTaskStore.d.ts:93:5 - (ae-undocumented) Missing documentation for "saveTaskState". +// src/scaffolder/tasks/DatabaseTaskStore.d.ts:97:5 - (ae-undocumented) Missing documentation for "listEvents". +// src/scaffolder/tasks/DatabaseTaskStore.d.ts:100:5 - (ae-undocumented) Missing documentation for "shutdownTask". +// src/scaffolder/tasks/DatabaseTaskStore.d.ts:101:5 - (ae-undocumented) Missing documentation for "rehydrateWorkspace". +// src/scaffolder/tasks/DatabaseTaskStore.d.ts:105:5 - (ae-undocumented) Missing documentation for "cleanWorkspace". +// src/scaffolder/tasks/DatabaseTaskStore.d.ts:108:5 - (ae-undocumented) Missing documentation for "serializeWorkspace". +// src/scaffolder/tasks/DatabaseTaskStore.d.ts:112:5 - (ae-undocumented) Missing documentation for "cancelTask". +// src/scaffolder/tasks/DatabaseTaskStore.d.ts:115:5 - (ae-undocumented) Missing documentation for "retryTask". +// src/scaffolder/tasks/DatabaseTaskStore.d.ts:118:5 - (ae-undocumented) Missing documentation for "recoverTasks". +// src/scaffolder/tasks/StorageTaskBroker.d.ts:25:5 - (ae-undocumented) Missing documentation for "create". +// src/scaffolder/tasks/StorageTaskBroker.d.ts:27:5 - (ae-undocumented) Missing documentation for "spec". +// src/scaffolder/tasks/StorageTaskBroker.d.ts:28:5 - (ae-undocumented) Missing documentation for "cancelSignal". +// src/scaffolder/tasks/StorageTaskBroker.d.ts:29:5 - (ae-undocumented) Missing documentation for "secrets". +// src/scaffolder/tasks/StorageTaskBroker.d.ts:30:5 - (ae-undocumented) Missing documentation for "createdBy". +// src/scaffolder/tasks/StorageTaskBroker.d.ts:31:5 - (ae-undocumented) Missing documentation for "getWorkspaceName". +// src/scaffolder/tasks/StorageTaskBroker.d.ts:32:5 - (ae-undocumented) Missing documentation for "rehydrateWorkspace". +// src/scaffolder/tasks/StorageTaskBroker.d.ts:36:5 - (ae-undocumented) Missing documentation for "done". +// src/scaffolder/tasks/StorageTaskBroker.d.ts:37:5 - (ae-undocumented) Missing documentation for "emitLog". +// src/scaffolder/tasks/StorageTaskBroker.d.ts:38:5 - (ae-undocumented) Missing documentation for "getTaskState". +// src/scaffolder/tasks/StorageTaskBroker.d.ts:41:5 - (ae-undocumented) Missing documentation for "updateCheckpoint". +// src/scaffolder/tasks/StorageTaskBroker.d.ts:50:5 - (ae-undocumented) Missing documentation for "serializeWorkspace". +// src/scaffolder/tasks/StorageTaskBroker.d.ts:53:5 - (ae-undocumented) Missing documentation for "cleanWorkspace". +// src/scaffolder/tasks/StorageTaskBroker.d.ts:54:5 - (ae-undocumented) Missing documentation for "complete". +// src/scaffolder/tasks/StorageTaskBroker.d.ts:56:5 - (ae-undocumented) Missing documentation for "getInitiatorCredentials". // src/scaffolder/tasks/TaskWorker.d.ts:60:5 - (ae-undocumented) Missing documentation for "create". // src/scaffolder/tasks/TaskWorker.d.ts:61:5 - (ae-undocumented) Missing documentation for "recoverTasks". // src/scaffolder/tasks/TaskWorker.d.ts:62:5 - (ae-undocumented) Missing documentation for "start". diff --git a/plugins/scaffolder-node/report.api.md b/plugins/scaffolder-node/report.api.md index ed4f19c7d8..c6cabda02c 100644 --- a/plugins/scaffolder-node/report.api.md +++ b/plugins/scaffolder-node/report.api.md @@ -496,11 +496,11 @@ export type TemplateGlobal = // src/actions/util.d.ts:5:22 - (ae-undocumented) Missing documentation for "getRepoSourceDirectory". // src/actions/util.d.ts:9:22 - (ae-undocumented) Missing documentation for "parseRepoUrl". // src/files/serializeDirectoryContents.d.ts:6:1 - (ae-undocumented) Missing documentation for "serializeDirectoryContents". -// src/files/types.d.ts:5:1 - (ae-undocumented) Missing documentation for "SerializedFile". -// src/files/types.d.ts:6:5 - (ae-undocumented) Missing documentation for "path". -// src/files/types.d.ts:7:5 - (ae-undocumented) Missing documentation for "content". -// src/files/types.d.ts:8:5 - (ae-undocumented) Missing documentation for "executable". -// src/files/types.d.ts:9:5 - (ae-undocumented) Missing documentation for "symlink". +// src/files/types.d.ts:6:1 - (ae-undocumented) Missing documentation for "SerializedFile". +// src/files/types.d.ts:7:5 - (ae-undocumented) Missing documentation for "path". +// src/files/types.d.ts:8:5 - (ae-undocumented) Missing documentation for "content". +// src/files/types.d.ts:9:5 - (ae-undocumented) Missing documentation for "executable". +// src/files/types.d.ts:10:5 - (ae-undocumented) Missing documentation for "symlink". // src/tasks/types.d.ts:83:5 - (ae-undocumented) Missing documentation for "cancelSignal". // src/tasks/types.d.ts:84:5 - (ae-undocumented) Missing documentation for "spec". // src/tasks/types.d.ts:85:5 - (ae-undocumented) Missing documentation for "secrets". diff --git a/yarn.lock b/yarn.lock index 53b3d07f2d..99a81ecb77 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19567,19 +19567,19 @@ __metadata: linkType: hard "@yarnpkg/core@npm:^4.0.0, @yarnpkg/core@npm:^4.0.3": - version: 4.0.3 - resolution: "@yarnpkg/core@npm:4.0.3" + version: 4.1.3 + resolution: "@yarnpkg/core@npm:4.1.3" dependencies: "@arcanis/slice-ansi": ^1.1.1 "@types/semver": ^7.1.0 "@types/treeify": ^1.0.0 - "@yarnpkg/fslib": ^3.0.2 - "@yarnpkg/libzip": ^3.0.1 - "@yarnpkg/parsers": ^3.0.0 - "@yarnpkg/shell": ^4.0.0 + "@yarnpkg/fslib": ^3.1.0 + "@yarnpkg/libzip": ^3.1.0 + "@yarnpkg/parsers": ^3.0.2 + "@yarnpkg/shell": ^4.1.0 camelcase: ^5.3.1 chalk: ^3.0.0 - ci-info: ^3.2.0 + ci-info: ^4.0.0 clipanion: ^4.0.0-rc.2 cross-spawn: 7.0.3 diff: ^5.1.0 @@ -19596,7 +19596,7 @@ __metadata: treeify: ^1.1.0 tslib: ^2.4.0 tunnel: ^0.0.6 - checksum: 811956ab94e9f4b3601f304312baf816322df124cf85754ef3985110c90935b1b761c8266a06c2c5633f6edc39c8a4ceffeff50f08f036d7adf19612ce3761a3 + checksum: 789bf7c1451d24e6405a42537a53382ec76387bf2696aadd3a189e8a343768d78377ff7b363f0c9271465f6a83c8e1e913d390ad3a233f7aa3d8ce9512e5147c languageName: node linkType: hard @@ -19609,12 +19609,12 @@ __metadata: languageName: node linkType: hard -"@yarnpkg/fslib@npm:^3.0.0, @yarnpkg/fslib@npm:^3.0.1, @yarnpkg/fslib@npm:^3.0.2": - version: 3.0.2 - resolution: "@yarnpkg/fslib@npm:3.0.2" +"@yarnpkg/fslib@npm:^3.0.0, @yarnpkg/fslib@npm:^3.0.1, @yarnpkg/fslib@npm:^3.0.2, @yarnpkg/fslib@npm:^3.1.0": + version: 3.1.0 + resolution: "@yarnpkg/fslib@npm:3.1.0" dependencies: tslib: ^2.4.0 - checksum: b0795df777e43eb1c2bd8aa1d6c45f88b8a1d3922ee8bf264cdca916cc6f9455551a9499761a9c1f585aa576350d84adcc315e497fc031cdbbbc1a5c71942e1b + checksum: 5274c63731cb30283a93e1446d6796b890fc56c55ed046156b2963a527465bc3add091a1e7f471b7533c8b1aa67b8532960e64589787014dee2cf3d97a9304f6 languageName: node linkType: hard @@ -19630,16 +19630,16 @@ __metadata: languageName: node linkType: hard -"@yarnpkg/libzip@npm:^3.0.0, @yarnpkg/libzip@npm:^3.0.1": - version: 3.0.1 - resolution: "@yarnpkg/libzip@npm:3.0.1" +"@yarnpkg/libzip@npm:^3.0.0, @yarnpkg/libzip@npm:^3.0.1, @yarnpkg/libzip@npm:^3.1.0": + version: 3.1.0 + resolution: "@yarnpkg/libzip@npm:3.1.0" dependencies: "@types/emscripten": ^1.39.6 - "@yarnpkg/fslib": ^3.0.2 + "@yarnpkg/fslib": ^3.1.0 tslib: ^2.4.0 peerDependencies: - "@yarnpkg/fslib": ^3.0.2 - checksum: 932b1fc35bb60ca57d033aab7a940f7b1d7bf52a68bfff6c755fe26827c0f1b373fda33e373afabbae98de3ed31ae4f0e9ee2ef24588cd074b75fb814117827d + "@yarnpkg/fslib": ^3.1.0 + checksum: 2bb7c10b41184a079906ec4ebdadda69e4cd3b101d11aae965c08934254dbd303e51e9869fd8d799c5f58d59214cd13d67d454ad96e1c76ce9384816d58da08c languageName: node linkType: hard @@ -19661,13 +19661,13 @@ __metadata: languageName: node linkType: hard -"@yarnpkg/parsers@npm:^3.0.0": - version: 3.0.0 - resolution: "@yarnpkg/parsers@npm:3.0.0" +"@yarnpkg/parsers@npm:^3.0.0, @yarnpkg/parsers@npm:^3.0.2": + version: 3.0.2 + resolution: "@yarnpkg/parsers@npm:3.0.2" dependencies: js-yaml: ^3.10.0 tslib: ^2.4.0 - checksum: fefe5ecafb5bfa2b678ac9ba9259810fdda40142afd9d0b7e0e5cc1cce1fd824dffc52217c5e429807481d8fd18ead074bd317e64fd626335d3c9f1a320bade2 + checksum: fb40a87ae7c9f3fc0b2a6b7d84375d1c69ae8304daf598c089b52966bfb4ac94fbd2dcd87ed041970416e03d34359cb5ff16be5f5601f48d1f936213a8edaf4d languageName: node linkType: hard @@ -20050,12 +20050,12 @@ __metadata: languageName: node linkType: hard -"@yarnpkg/shell@npm:^4.0.0": - version: 4.0.0 - resolution: "@yarnpkg/shell@npm:4.0.0" +"@yarnpkg/shell@npm:^4.0.0, @yarnpkg/shell@npm:^4.1.0": + version: 4.1.0 + resolution: "@yarnpkg/shell@npm:4.1.0" dependencies: - "@yarnpkg/fslib": ^3.0.0 - "@yarnpkg/parsers": ^3.0.0 + "@yarnpkg/fslib": ^3.1.0 + "@yarnpkg/parsers": ^3.0.2 chalk: ^3.0.0 clipanion: ^4.0.0-rc.2 cross-spawn: 7.0.3 @@ -20064,7 +20064,7 @@ __metadata: tslib: ^2.4.0 bin: shell: ./lib/cli.js - checksum: 8497e278b1d3d0ffe324a3b9c878ca7165bbbe4d182f5ecb02f1bfaaf4dd18c8aaa54c33ee17bb37eb09173816dc4617b70c3fe0925f5fb99749687e2650b7a2 + checksum: d5ad721cadc6d6f1411ad98b5d8362c2c804be4e4e9ed9799debbaa96fd2413fc5beaf011e30e69f54ab66b66779ba916125dc40efcf104a4e99053b3a8c645b languageName: node linkType: hard @@ -22450,6 +22450,13 @@ __metadata: languageName: node linkType: hard +"ci-info@npm:^4.0.0": + version: 4.0.0 + resolution: "ci-info@npm:4.0.0" + checksum: 122fe41c5eb8d0b5fa0ab6fd674c5ddcf2dc59766528b062a0144ff0d913cfb210ef925ec52110e7c2a7f4e603d5f0e8b91cfe68867e196e9212fa0b94d0a08a + languageName: node + linkType: hard + "cidr-regex@npm:^3.1.1": version: 3.1.1 resolution: "cidr-regex@npm:3.1.1" From 54fee6e8cbb2446758d3ad78d836ad19c31ade4f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 14:53:52 +0000 Subject: [PATCH 078/217] chore(deps): update dependency msw to v2.4.9 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index c40b034e82..e9e5b3d576 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11279,9 +11279,9 @@ __metadata: languageName: node linkType: hard -"@mswjs/interceptors@npm:^0.35.6": - version: 0.35.6 - resolution: "@mswjs/interceptors@npm:0.35.6" +"@mswjs/interceptors@npm:^0.35.8": + version: 0.35.9 + resolution: "@mswjs/interceptors@npm:0.35.9" dependencies: "@open-draft/deferred-promise": ^2.2.0 "@open-draft/logger": ^0.3.0 @@ -11289,7 +11289,7 @@ __metadata: is-node-process: ^1.2.0 outvariant: ^1.4.3 strict-event-emitter: ^0.5.1 - checksum: aee024149ae5f034d628e8685a4e12ab4eca6706a5d1ba459987fcc7994f93c3598cf21099352a776657b92cbb410eab0d3231f3ab2317056c6a399e0dd3f118 + checksum: 35b9382b94b7e3af962dc901db80bde99385645fb0b1f4cbaf64d58ff7181adb962430437db5b7d6db9db2e82399a3d1f319378d3c98e72c7ada8245180f0979 languageName: node linkType: hard @@ -34321,14 +34321,14 @@ __metadata: linkType: hard "msw@npm:^2.0.0, msw@npm:^2.0.8": - version: 2.4.8 - resolution: "msw@npm:2.4.8" + version: 2.4.9 + resolution: "msw@npm:2.4.9" dependencies: "@bundled-es-modules/cookie": ^2.0.0 "@bundled-es-modules/statuses": ^1.0.1 "@bundled-es-modules/tough-cookie": ^0.1.6 "@inquirer/confirm": ^3.0.0 - "@mswjs/interceptors": ^0.35.6 + "@mswjs/interceptors": ^0.35.8 "@open-draft/until": ^2.1.0 "@types/cookie": ^0.6.0 "@types/statuses": ^2.0.4 @@ -34348,7 +34348,7 @@ __metadata: optional: true bin: msw: cli/index.js - checksum: 3cfc2588715aa1a006032b6e255ce6dc899e51f6fea0b69bb0df8b635d9a332227b3463f5017577ca82076afb489dfd036fb9cc156c89f482fb5e8a44de97ad8 + checksum: add5a614ce58f5e75c65afcb59b76d0d807b9103b7fb3aaf23efd6ebd82d79415ecd9bc55dd48bcc4c31ec7ce196a75ace46d94224f0a80567c89a190e367ba8 languageName: node linkType: hard From 07944d74194e8480043444d65e8858af0c846a88 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 15:40:08 +0000 Subject: [PATCH 079/217] chore(deps): update dependency nodemon to v3.1.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 e9e5b3d576..0e3ea76809 100644 --- a/yarn.lock +++ b/yarn.lock @@ -34908,8 +34908,8 @@ __metadata: linkType: hard "nodemon@npm:^3.0.1": - version: 3.1.5 - resolution: "nodemon@npm:3.1.5" + version: 3.1.7 + resolution: "nodemon@npm:3.1.7" dependencies: chokidar: ^3.5.2 debug: ^4 @@ -34923,7 +34923,7 @@ __metadata: undefsafe: ^2.0.5 bin: nodemon: bin/nodemon.js - checksum: 56a41473b4990efebe8341f1da360af49d3b9e62c164d76ef6ec7f81efeca56c990dd4f275f03ddd1afde83d27c1ed3abe9c73d712fbebe08406c459b9f030ab + checksum: c500ac2feb278ddb187049ac8ede6423c1fb074cc3dabf74882568d5e93401293c10039e184a9d1bfc617c983ddb432437d396b421926914d04ebba671a7d8b8 languageName: node linkType: hard From d7e8298a260073b3df16c0c49a3bee38bc9e5cd4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 16:31:08 +0000 Subject: [PATCH 080/217] chore(deps): update dependency vite to v5.4.8 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 0e3ea76809..7411eb4baf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -43748,8 +43748,8 @@ __metadata: linkType: hard "vite@npm:^5.0.0": - version: 5.4.6 - resolution: "vite@npm:5.4.6" + version: 5.4.8 + resolution: "vite@npm:5.4.8" dependencies: esbuild: ^0.21.3 fsevents: ~2.3.3 @@ -43786,7 +43786,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: ea293748f624b3bb53e68d30ddc55e7addeaa38bbcde06d900e6d476bef3d0550de2a67f5316680dbeae483afedd3e735fb91b65004659f62bece537ed038a59 + checksum: b5686ff76a60d53092dc13a5c1e5627165226b8e3da7736931adf87bbe58d383bca386383cea134750108c2d42750c916db3f2314ac90a9477d693950145f140 languageName: node linkType: hard From 3e3aa8094946bf6933cb58125ada2fa1d1076b41 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 07:27:10 +0000 Subject: [PATCH 081/217] chore(deps): update chromaui/action digest to 30b6228 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/verify_storybook.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/verify_storybook.yml b/.github/workflows/verify_storybook.yml index 458ef69690..77a01f9ffd 100644 --- a/.github/workflows/verify_storybook.yml +++ b/.github/workflows/verify_storybook.yml @@ -51,7 +51,7 @@ jobs: - run: yarn build-storybook - - uses: chromaui/action@f4e60a7072abcac4203f4ca50613f28e199a52ba # v11 + - uses: chromaui/action@30b6228aa809059d46219e0f556752e8672a7e26 # v11 with: token: ${{ secrets.GITHUB_TOKEN }} # projectToken intentionally shared to allow collaborators to run Chromatic on forks From 720a2f943a7d06634b5e3d4f39c36407c48bce30 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 09:08:04 +0000 Subject: [PATCH 082/217] fix(deps): update dependency git-url-parse to v15 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .changeset/renovate-85a184e.md | 15 +++++++++ packages/backend-defaults/package.json | 2 +- packages/cli/package.json | 2 +- packages/integration/package.json | 2 +- .../package.json | 2 +- plugins/catalog-backend/package.json | 2 +- plugins/catalog-import/package.json | 2 +- .../package.json | 2 +- plugins/scaffolder/package.json | 2 +- .../package.json | 2 +- plugins/techdocs-node/package.json | 2 +- plugins/techdocs/package.json | 2 +- yarn.lock | 31 ++++++++++++------- 13 files changed, 46 insertions(+), 22 deletions(-) create mode 100644 .changeset/renovate-85a184e.md diff --git a/.changeset/renovate-85a184e.md b/.changeset/renovate-85a184e.md new file mode 100644 index 0000000000..91b575e6db --- /dev/null +++ b/.changeset/renovate-85a184e.md @@ -0,0 +1,15 @@ +--- +'@backstage/backend-defaults': patch +'@backstage/cli': patch +'@backstage/integration': patch +'@backstage/plugin-catalog-backend-module-github': patch +'@backstage/plugin-catalog-backend': patch +'@backstage/plugin-catalog-import': patch +'@backstage/plugin-scaffolder-backend-module-confluence-to-markdown': patch +'@backstage/plugin-scaffolder': patch +'@backstage/plugin-techdocs-module-addons-contrib': patch +'@backstage/plugin-techdocs-node': patch +'@backstage/plugin-techdocs': patch +--- + +Updated dependency `git-url-parse` to `^15.0.0`. diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 4437a4ff1f..8e3525989d 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -153,7 +153,7 @@ "express": "^4.17.1", "express-promise-router": "^4.1.0", "fs-extra": "^11.2.0", - "git-url-parse": "^14.0.0", + "git-url-parse": "^15.0.0", "helmet": "^6.0.0", "isomorphic-git": "^1.23.0", "jose": "^5.0.0", diff --git a/packages/cli/package.json b/packages/cli/package.json index 2cbf7b8484..f032d37c1f 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -106,7 +106,7 @@ "express": "^4.17.1", "fork-ts-checker-webpack-plugin": "^9.0.0", "fs-extra": "^11.2.0", - "git-url-parse": "^14.0.0", + "git-url-parse": "^15.0.0", "glob": "^7.1.7", "global-agent": "^3.0.0", "handlebars": "^4.7.3", diff --git a/packages/integration/package.json b/packages/integration/package.json index 4566c8efe2..6fc8f8cadb 100644 --- a/packages/integration/package.json +++ b/packages/integration/package.json @@ -43,7 +43,7 @@ "@octokit/auth-app": "^4.0.0", "@octokit/rest": "^19.0.3", "cross-fetch": "^4.0.0", - "git-url-parse": "^14.0.0", + "git-url-parse": "^15.0.0", "lodash": "^4.17.21", "luxon": "^3.0.0" }, diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json index 876deb2db8..3b916c4a52 100644 --- a/plugins/catalog-backend-module-github/package.json +++ b/plugins/catalog-backend-module-github/package.json @@ -63,7 +63,7 @@ "@backstage/plugin-events-node": "workspace:^", "@octokit/graphql": "^5.0.0", "@octokit/rest": "^19.0.3", - "git-url-parse": "^14.0.0", + "git-url-parse": "^15.0.0", "lodash": "^4.17.21", "minimatch": "^9.0.0", "node-fetch": "^2.7.0", diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index 1a18bfdebc..0df7ad33c5 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -83,7 +83,7 @@ "express": "^4.17.1", "fast-json-stable-stringify": "^2.1.0", "fs-extra": "^11.2.0", - "git-url-parse": "^14.0.0", + "git-url-parse": "^15.0.0", "glob": "^7.1.6", "knex": "^3.0.0", "lodash": "^4.17.21", diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index 277e259458..6245a38a03 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -70,7 +70,7 @@ "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@octokit/rest": "^19.0.3", - "git-url-parse": "^14.0.0", + "git-url-parse": "^15.0.0", "js-base64": "^3.6.0", "lodash": "^4.17.21", "react-hook-form": "^7.12.2", diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json index 17a4b22d70..7d15c30e80 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json @@ -52,7 +52,7 @@ "@backstage/integration": "workspace:^", "@backstage/plugin-scaffolder-node": "workspace:^", "fs-extra": "^11.2.0", - "git-url-parse": "^14.0.0", + "git-url-parse": "^15.0.0", "node-fetch": "^2.7.0", "node-html-markdown": "^1.3.0", "yaml": "^2.0.0" diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index 01c7dacf66..af5d8a33a2 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -87,7 +87,7 @@ "@rjsf/validator-ajv8": "5.21.1", "@uiw/react-codemirror": "^4.9.3", "classnames": "^2.2.6", - "git-url-parse": "^14.0.0", + "git-url-parse": "^15.0.0", "humanize-duration": "^3.25.1", "idb-keyval": "5.0.2", "json-schema": "^0.4.0", diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index 951bd8f432..a7866cd2bb 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -47,7 +47,7 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@react-hookz/web": "^24.0.0", - "git-url-parse": "^14.0.0", + "git-url-parse": "^15.0.0", "photoswipe": "^5.3.7" }, "devDependencies": { diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index e807b7abb0..2d9f0be516 100644 --- a/plugins/techdocs-node/package.json +++ b/plugins/techdocs-node/package.json @@ -68,7 +68,7 @@ "dockerode": "^4.0.0", "express": "^4.17.1", "fs-extra": "^11.2.0", - "git-url-parse": "^14.0.0", + "git-url-parse": "^15.0.0", "hpagent": "^1.2.0", "js-yaml": "^4.0.0", "json5": "^2.1.3", diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index 8fe9b71c1c..e11ba0618d 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -81,7 +81,7 @@ "@material-ui/styles": "^4.10.0", "@microsoft/fetch-event-source": "^2.0.1", "dompurify": "^3.0.0", - "git-url-parse": "^14.0.0", + "git-url-parse": "^15.0.0", "jss": "~10.10.0", "lodash": "^4.17.21", "react-helmet": "6.1.0", diff --git a/yarn.lock b/yarn.lock index 11bbcb2240..c190460f9a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3651,7 +3651,7 @@ __metadata: express: ^4.17.1 express-promise-router: ^4.1.0 fs-extra: ^11.2.0 - git-url-parse: ^14.0.0 + git-url-parse: ^15.0.0 helmet: ^6.0.0 http-errors: ^2.0.0 isomorphic-git: ^1.23.0 @@ -3981,7 +3981,7 @@ __metadata: express: ^4.17.1 fork-ts-checker-webpack-plugin: ^9.0.0 fs-extra: ^11.2.0 - git-url-parse: ^14.0.0 + git-url-parse: ^15.0.0 glob: ^7.1.7 global-agent: ^3.0.0 handlebars: ^4.7.3 @@ -4765,7 +4765,7 @@ __metadata: "@octokit/rest": ^19.0.3 "@types/luxon": ^3.0.0 cross-fetch: ^4.0.0 - git-url-parse: ^14.0.0 + git-url-parse: ^15.0.0 lodash: ^4.17.21 luxon: ^3.0.0 msw: ^1.0.0 @@ -5672,7 +5672,7 @@ __metadata: "@octokit/graphql": ^5.0.0 "@octokit/rest": ^19.0.3 "@types/lodash": ^4.14.151 - git-url-parse: ^14.0.0 + git-url-parse: ^15.0.0 lodash: ^4.17.21 luxon: ^3.0.0 minimatch: ^9.0.0 @@ -5921,7 +5921,7 @@ __metadata: express: ^4.17.1 fast-json-stable-stringify: ^2.1.0 fs-extra: ^11.2.0 - git-url-parse: ^14.0.0 + git-url-parse: ^15.0.0 glob: ^7.1.6 knex: ^3.0.0 lodash: ^4.17.21 @@ -6026,7 +6026,7 @@ __metadata: "@testing-library/react": ^16.0.0 "@testing-library/user-event": ^14.0.0 "@types/react": ^18.0.0 - git-url-parse: ^14.0.0 + git-url-parse: ^15.0.0 js-base64: ^3.6.0 lodash: ^4.17.21 msw: ^1.0.0 @@ -7263,7 +7263,7 @@ __metadata: "@backstage/plugin-scaffolder-node": "workspace:^" "@backstage/plugin-scaffolder-node-test-utils": "workspace:^" fs-extra: ^11.2.0 - git-url-parse: ^14.0.0 + git-url-parse: ^15.0.0 msw: ^1.0.0 node-fetch: ^2.7.0 node-html-markdown: ^1.3.0 @@ -7718,7 +7718,7 @@ __metadata: "@types/react-window": ^1.8.8 "@uiw/react-codemirror": ^4.9.3 classnames: ^2.2.6 - git-url-parse: ^14.0.0 + git-url-parse: ^15.0.0 humanize-duration: ^3.25.1 idb-keyval: 5.0.2 json-schema: ^0.4.0 @@ -8222,7 +8222,7 @@ __metadata: "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@types/react": ^18.0.0 - git-url-parse: ^14.0.0 + git-url-parse: ^15.0.0 photoswipe: ^5.3.7 react: ^18.0.2 react-dom: ^18.0.2 @@ -8271,7 +8271,7 @@ __metadata: dockerode: ^4.0.0 express: ^4.17.1 fs-extra: ^11.2.0 - git-url-parse: ^14.0.0 + git-url-parse: ^15.0.0 hpagent: ^1.2.0 js-yaml: ^4.0.0 json5: ^2.1.3 @@ -8356,7 +8356,7 @@ __metadata: "@types/react": ^18.0.0 canvas: ^2.10.2 dompurify: ^3.0.0 - git-url-parse: ^14.0.0 + git-url-parse: ^15.0.0 jss: ~10.10.0 lodash: ^4.17.21 react: ^18.0.2 @@ -28405,6 +28405,15 @@ __metadata: languageName: node linkType: hard +"git-url-parse@npm:^15.0.0": + version: 15.0.0 + resolution: "git-url-parse@npm:15.0.0" + dependencies: + git-up: ^7.0.0 + checksum: 4379e9b0a1297b62d603630341a7ce1a6e17901114ee7bb70a611f62ea0fd3b3649ac754891d2746fd42031a21e97ddc0092287a04cc028cbf37df8f6be65a9e + languageName: node + linkType: hard + "github-from-package@npm:0.0.0": version: 0.0.0 resolution: "github-from-package@npm:0.0.0" From c42c7109826852bd93887642765c73d388377561 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 1 Oct 2024 09:20:36 +0000 Subject: [PATCH 083/217] Version Packages (next) --- .changeset/create-app-1727774359.md | 5 + .changeset/pre.json | 30 +- docs/releases/v1.32.0-next.1-changelog.md | 1556 +++++++++++++++++ package.json | 2 +- packages/app-defaults/CHANGELOG.md | 12 + 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 | 45 + packages/app-next/package.json | 2 +- packages/app/CHANGELOG.md | 41 + packages/app/package.json | 2 +- packages/backend-defaults/CHANGELOG.md | 21 + packages/backend-defaults/package.json | 2 +- .../CHANGELOG.md | 25 + .../package.json | 2 +- packages/backend-legacy/CHANGELOG.md | 41 + packages/backend-legacy/package.json | 2 +- packages/backend-test-utils/CHANGELOG.md | 14 + packages/backend-test-utils/package.json | 2 +- packages/backend/CHANGELOG.md | 37 + packages/backend/package.json | 2 +- packages/cli/CHANGELOG.md | 23 + packages/cli/package.json | 2 +- packages/core-app-api/CHANGELOG.md | 11 + packages/core-app-api/package.json | 2 +- packages/core-compat-api/CHANGELOG.md | 10 + packages/core-compat-api/package.json | 2 +- packages/core-components/CHANGELOG.md | 14 + packages/core-components/package.json | 2 +- packages/core-plugin-api/CHANGELOG.md | 11 + packages/core-plugin-api/package.json | 2 +- packages/create-app/CHANGELOG.md | 8 + packages/create-app/package.json | 2 +- packages/dev-utils/CHANGELOG.md | 15 + packages/dev-utils/package.json | 2 +- packages/e2e-test/CHANGELOG.md | 9 + packages/e2e-test/package.json | 2 +- packages/eslint-plugin/CHANGELOG.md | 6 + packages/eslint-plugin/package.json | 2 +- packages/frontend-app-api/CHANGELOG.md | 15 + packages/frontend-app-api/package.json | 2 +- packages/frontend-defaults/CHANGELOG.md | 11 + packages/frontend-defaults/package.json | 2 +- packages/frontend-internal/CHANGELOG.md | 9 + packages/frontend-internal/package.json | 2 +- packages/frontend-plugin-api/CHANGELOG.md | 11 + packages/frontend-plugin-api/package.json | 2 +- packages/frontend-test-utils/CHANGELOG.md | 14 + packages/frontend-test-utils/package.json | 2 +- packages/integration-react/CHANGELOG.md | 15 + packages/integration-react/package.json | 2 +- packages/integration/CHANGELOG.md | 10 + packages/integration/package.json | 2 +- packages/repo-tools/CHANGELOG.md | 17 + packages/repo-tools/package.json | 2 +- packages/scaffolder-internal/CHANGELOG.md | 7 + packages/scaffolder-internal/package.json | 2 +- .../techdocs-cli-embedded-app/CHANGELOG.md | 19 + .../techdocs-cli-embedded-app/package.json | 2 +- packages/techdocs-cli/CHANGELOG.md | 11 + packages/techdocs-cli/package.json | 2 +- packages/test-utils/CHANGELOG.md | 14 + packages/test-utils/package.json | 2 +- packages/theme/CHANGELOG.md | 6 + packages/theme/package.json | 2 +- packages/version-bridge/CHANGELOG.md | 6 + packages/version-bridge/package.json | 2 +- .../CHANGELOG.md | 6 + .../package.json | 2 +- plugins/api-docs/CHANGELOG.md | 16 + plugins/api-docs/package.json | 2 +- plugins/app-visualizer/CHANGELOG.md | 10 + plugins/app-visualizer/package.json | 2 +- plugins/app/CHANGELOG.md | 11 + plugins/app/package.json | 2 +- plugins/auth-react/CHANGELOG.md | 10 + plugins/auth-react/package.json | 2 +- plugins/bitbucket-cloud-common/CHANGELOG.md | 7 + plugins/bitbucket-cloud-common/package.json | 2 +- .../catalog-backend-module-aws/CHANGELOG.md | 16 + .../catalog-backend-module-aws/package.json | 2 +- .../catalog-backend-module-azure/CHANGELOG.md | 11 + .../catalog-backend-module-azure/package.json | 2 +- .../CHANGELOG.md | 15 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 15 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../catalog-backend-module-logs/CHANGELOG.md | 9 + .../catalog-backend-module-logs/package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- plugins/catalog-backend/CHANGELOG.md | 22 + plugins/catalog-backend/package.json | 2 +- plugins/catalog-graph/CHANGELOG.md | 15 + plugins/catalog-graph/package.json | 2 +- plugins/catalog-import/CHANGELOG.md | 19 + plugins/catalog-import/package.json | 2 +- plugins/catalog-react/CHANGELOG.md | 24 + plugins/catalog-react/package.json | 2 +- .../catalog-unprocessed-entities/CHANGELOG.md | 11 + .../catalog-unprocessed-entities/package.json | 2 +- plugins/catalog/CHANGELOG.md | 22 + plugins/catalog/package.json | 2 +- plugins/config-schema/CHANGELOG.md | 11 + plugins/config-schema/package.json | 2 +- plugins/devtools/CHANGELOG.md | 14 + plugins/devtools/package.json | 2 +- plugins/example-todo-list/CHANGELOG.md | 8 + plugins/example-todo-list/package.json | 2 +- plugins/home-react/CHANGELOG.md | 9 + plugins/home-react/package.json | 2 +- plugins/home/CHANGELOG.md | 18 + plugins/home/package.json | 2 +- plugins/kubernetes-cluster/CHANGELOG.md | 14 + plugins/kubernetes-cluster/package.json | 2 +- plugins/kubernetes-react/CHANGELOG.md | 14 + plugins/kubernetes-react/package.json | 2 +- plugins/kubernetes/CHANGELOG.md | 16 + plugins/kubernetes/package.json | 2 +- plugins/notifications/CHANGELOG.md | 14 + plugins/notifications/package.json | 2 +- plugins/org-react/CHANGELOG.md | 12 + plugins/org-react/package.json | 2 +- plugins/org/CHANGELOG.md | 14 + plugins/org/package.json | 2 +- plugins/permission-react/CHANGELOG.md | 10 + plugins/permission-react/package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 13 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 13 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 13 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- plugins/scaffolder-backend/CHANGELOG.md | 31 + plugins/scaffolder-backend/package.json | 2 +- .../scaffolder-node-test-utils/CHANGELOG.md | 10 + .../scaffolder-node-test-utils/package.json | 2 +- plugins/scaffolder-node/CHANGELOG.md | 12 + plugins/scaffolder-node/package.json | 2 +- plugins/scaffolder-react/CHANGELOG.md | 23 + plugins/scaffolder-react/package.json | 2 +- plugins/scaffolder/CHANGELOG.md | 30 + plugins/scaffolder/package.json | 2 +- .../CHANGELOG.md | 16 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- plugins/search-backend-module-pg/CHANGELOG.md | 10 + plugins/search-backend-module-pg/package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 16 + .../package.json | 2 +- plugins/search-backend-node/CHANGELOG.md | 12 + plugins/search-backend-node/package.json | 2 +- plugins/search-backend/CHANGELOG.md | 16 + plugins/search-backend/package.json | 2 +- plugins/search-react/CHANGELOG.md | 14 + plugins/search-react/package.json | 2 +- plugins/search/CHANGELOG.md | 17 + plugins/search/package.json | 2 +- plugins/signals-react/CHANGELOG.md | 9 + plugins/signals-react/package.json | 2 +- plugins/signals/CHANGELOG.md | 12 + plugins/signals/package.json | 2 +- .../techdocs-addons-test-utils/CHANGELOG.md | 16 + .../techdocs-addons-test-utils/package.json | 2 +- plugins/techdocs-backend/CHANGELOG.md | 18 + plugins/techdocs-backend/package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- plugins/techdocs-node/CHANGELOG.md | 14 + plugins/techdocs-node/package.json | 2 +- plugins/techdocs-react/CHANGELOG.md | 12 + plugins/techdocs-react/package.json | 2 +- plugins/techdocs/CHANGELOG.md | 23 + plugins/techdocs/package.json | 2 +- plugins/user-settings-backend/CHANGELOG.md | 14 + plugins/user-settings-backend/package.json | 2 +- plugins/user-settings/CHANGELOG.md | 18 + plugins/user-settings/package.json | 2 +- yarn.lock | 52 +- 221 files changed, 3301 insertions(+), 113 deletions(-) create mode 100644 .changeset/create-app-1727774359.md create mode 100644 docs/releases/v1.32.0-next.1-changelog.md diff --git a/.changeset/create-app-1727774359.md b/.changeset/create-app-1727774359.md new file mode 100644 index 0000000000..b50d431d4b --- /dev/null +++ b/.changeset/create-app-1727774359.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Bumped create-app version. diff --git a/.changeset/pre.json b/.changeset/pre.json index 706cec0de5..1d47683d1b 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -195,6 +195,7 @@ "@internal/scaffolder": "0.0.1" }, "changesets": [ + "angry-mayflies-collect", "angry-windows-decide", "big-rules-nail", "breezy-bulldogs-smell", @@ -202,34 +203,61 @@ "chair-fairs-drive", "chilled-dolphins-join", "clever-paws-stare", + "cold-nails-rescue", + "create-app-1727774359", + "curly-foxes-brake", + "cyan-cooks-sing", "cyan-peaches-lay", + "cyan-vans-study", "dry-frogs-drum", "early-drinks-kneel", + "early-sloths-cross", "eight-steaks-chew", "eleven-pugs-hear", "fair-chairs-drive", + "famous-bobcats-remain", "fifty-trainers-watch", "five-gorillas-pay", + "five-turkeys-taste", + "flat-eels-exist", "fluffy-pears-cry", + "four-moons-watch", + "friendly-cougars-return", "funny-rocks-train", "fuzzy-elephants-tease", "giant-kiwis-retire", + "gold-pots-end", + "green-bottles-live", "happy-ligers-think", + "honest-impalas-rescue", + "hungry-buckets-repair", + "large-hats-reply", "large-plants-rhyme", "light-rats-travel", "long-humans-hunt", + "loud-hotels-tan", "nasty-lamps-greet", + "nice-badgers-travel", "polite-days-flash", + "pretty-plants-hammer", + "quiet-dingos-bathe", + "renovate-156753b", "rich-deers-attend", + "rich-needles-collect", + "rude-apricots-eat", "shy-olives-swim", "slow-gorillas-thank", "slow-trees-compare", + "sour-grapes-trade", "sour-phones-fix", "stale-roses-serve", "strange-bees-attack", "strong-monkeys-melt", "sweet-chicken-smash", "thirty-pets-fry", - "tiny-pugs-kick" + "tiny-pugs-kick", + "tough-pillows-sip", + "two-plums-fail", + "weak-bottles-cross" ] } diff --git a/docs/releases/v1.32.0-next.1-changelog.md b/docs/releases/v1.32.0-next.1-changelog.md new file mode 100644 index 0000000000..d62c0e753f --- /dev/null +++ b/docs/releases/v1.32.0-next.1-changelog.md @@ -0,0 +1,1556 @@ +# Release v1.32.0-next.1 + +Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.32.0-next.1](https://backstage.github.io/upgrade-helper/?to=1.32.0-next.1) + +## @backstage/cli@0.28.0-next.1 + +### Minor Changes + +- 55b8b84: **BREAKING**: The Jest configuration defined at `@backstage/cli/config/jest` no longer collects configuration defined in the `"jest"` field from all parent `package.json` files. Instead, it will only read and merge configuration from the `package.json` in the monorepo root if it exists, as well as the target package. In addition, configuration defined in the root `package.json` will now only be merged into each package configuration if it is a valid project-level configuration key. + +### Patch Changes + +- 03810d2: Remove unknown dependency `diff` +- cebee4f: Added support for a new experimental `EXPERIMENTAL_TRIM_NEXT_ENTRY` flag which removes any `./next` entry points present in packages when building and publishing. +- 55b8b84: The Jest configuration will now search for a `src/setupTests.*` file with any valid script extension, not only `.ts`. +- Updated dependencies + - @backstage/eslint-plugin@0.1.10-next.0 + - @backstage/integration@1.15.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/cli-common@0.1.14 + - @backstage/cli-node@0.2.8 + - @backstage/config@1.2.0 + - @backstage/config-loader@1.9.1 + - @backstage/errors@1.2.4 + - @backstage/release-manifests@0.0.11 + - @backstage/types@1.1.1 + +## @backstage/integration-react@1.2.0-next.1 + +### Minor Changes + +- a11495a: Added new ScmAuth method `forBitbucketServer` that uses correct OAuth scopes by default. Also updated `forBitbucket` method to allow overriding the default OAuth scopes. + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- 3dbac17: Revert of change #26430 +- Updated dependencies + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/integration@1.15.1-next.0 + - @backstage/config@1.2.0 + +## @backstage/repo-tools@0.10.0-next.1 + +### Minor Changes + +- 8eb3033: Adds a new command `backstage-repo-tools peer-deps` for validating your usage of peer dependencies in your plugins. It currently supports react related peer dependencies. It also has a `--fix` mode for quickly fixing any issues that it finds. + +### Patch Changes + +- 1f6706f: Properly log instructions when APIs do not match +- Updated dependencies + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/cli-common@0.1.14 + - @backstage/cli-node@0.2.8 + - @backstage/config-loader@1.9.1 + - @backstage/errors@1.2.4 + +## @backstage/plugin-catalog-react@1.14.0-next.1 + +### Minor Changes + +- 6812980: Added a new prop, `disableTooltip` to the `EntityRefLink` component + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/integration-react@1.2.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-permission-react@0.4.27-next.1 + - @backstage/version-bridge@1.0.10-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-permission-common@0.8.1 + +## @backstage/plugin-scaffolder@1.26.0-next.1 + +### Minor Changes + +- c433ae9: Improved the layout of the manage templates page (`/edit`) by adding icons and descriptions that better describe what each page is for. Updated the header menu to link back to the scaffolder create page. +- 7bfaf23: Text field content of the `EntityPicker` is now more readable as it uses entity title instead of entity reference. + +### Patch Changes + +- f6c15d8: Apply `defaultValue` props in `MultiEntityPicker` +- e969dc7: Move `@types/react` to a peer dependency. +- 785d68f: Add support for pagination in scaffolder tasks list +- 94a7bcd: Change "Register Existing Component" CTA to outlined as it's not a primary action on the scaffolder pages +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/integration-react@1.2.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-permission-react@0.4.27-next.1 + - @backstage/plugin-scaffolder-react@1.13.0-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/integration@1.15.1-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-scaffolder-common@1.5.6 + +## @backstage/plugin-scaffolder-react@1.13.0-next.1 + +### Minor Changes + +- d851b5b: Renamed Template Editor to Manage Templates. + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- 785d68f: Add support for pagination in scaffolder tasks list +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-permission-react@0.4.27-next.1 + - @backstage/version-bridge@1.0.10-next.0 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/theme@0.5.8-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-common@1.5.6 + +## @backstage/app-defaults@1.5.12-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-permission-react@0.4.27-next.1 + - @backstage/core-app-api@1.15.1-next.1 + - @backstage/theme@0.5.8-next.0 + +## @backstage/backend-defaults@0.5.1-next.1 + +### Patch Changes + +- 920004b: Updating error message for getProjectId when fetching Gitlab project from its url to be more accurate +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-app-api@1.0.1-next.0 + - @backstage/backend-dev-utils@0.1.5 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/cli-common@0.1.14 + - @backstage/cli-node@0.2.8 + - @backstage/config@1.2.0 + - @backstage/config-loader@1.9.1 + - @backstage/errors@1.2.4 + - @backstage/integration-aws-node@0.1.12 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + - @backstage/plugin-permission-node@0.8.4-next.0 + +## @backstage/backend-dynamic-feature-service@0.4.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.26.2-next.1 + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/backend-app-api@1.0.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/cli-common@0.1.14 + - @backstage/cli-node@0.2.8 + - @backstage/config@1.2.0 + - @backstage/config-loader@1.9.1 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-app-node@0.1.26-next.0 + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/plugin-events-backend@0.3.13-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.4-next.0 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + - @backstage/plugin-search-backend-node@1.3.3-next.1 + - @backstage/plugin-search-common@1.2.14 + +## @backstage/backend-test-utils@1.0.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/backend-app-api@1.0.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + +## @backstage/core-app-api@1.15.1-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/version-bridge@1.0.10-next.0 + - @backstage/config@1.2.0 + - @backstage/types@1.1.1 + +## @backstage/core-compat-api@0.3.1-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/version-bridge@1.0.10-next.0 + +## @backstage/core-components@0.15.1-next.1 + +### Patch Changes + +- 3f76d0e: Correct size of FavoriteToggle and inherit non-starred color from parent +- e969dc7: Move `@types/react` to a peer dependency. +- 83e2887: Fixed a bug in the `SidebarSubmenu` core component that caused the nested menu to overlap with the sidebar when the user hovers over the pinned sidebar. +- Updated dependencies + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/version-bridge@1.0.10-next.0 + - @backstage/theme@0.5.8-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## @backstage/core-plugin-api@1.10.0-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/version-bridge@1.0.10-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## @backstage/create-app@0.5.21-next.1 + +### Patch Changes + +- Bumped create-app version. +- Updated dependencies + - @backstage/cli-common@0.1.14 + +## @backstage/dev-utils@1.1.2-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/integration-react@1.2.0-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/app-defaults@1.5.12-next.1 + - @backstage/core-app-api@1.15.1-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/theme@0.5.8-next.0 + - @backstage/catalog-model@1.7.0 + +## @backstage/eslint-plugin@0.1.10-next.0 + +### Patch Changes + +- 63963f6: Internal refactor to deal with `estree` upgrade + +## @backstage/frontend-app-api@0.10.0-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/version-bridge@1.0.10-next.0 + - @backstage/core-app-api@1.15.1-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/frontend-defaults@0.1.1-next.1 + - @backstage/types@1.1.1 + +## @backstage/frontend-defaults@0.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/frontend-app-api@0.10.0-next.1 + - @backstage/plugin-app@0.1.1-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## @backstage/frontend-plugin-api@0.9.0-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/version-bridge@1.0.10-next.0 + - @backstage/types@1.1.1 + +## @backstage/frontend-test-utils@0.2.1-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/frontend-app-api@0.10.0-next.1 + - @backstage/version-bridge@1.0.10-next.0 + - @backstage/test-utils@1.6.1-next.1 + - @backstage/plugin-app@0.1.1-next.1 + - @backstage/config@1.2.0 + - @backstage/types@1.1.1 + +## @backstage/integration@1.15.1-next.0 + +### Patch Changes + +- 920004b: Updating error message for getProjectId when fetching Gitlab project from its url to be more accurate +- 090e49a: Updated functions parseHarnessUrl, getHarnessLatestCommitUrl, getHarnessFileContentsUrl and getHarnessArchiveUrl to fix parsing of urls +- Updated dependencies + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## @techdocs/cli@1.8.20-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/cli-common@0.1.14 + - @backstage/config@1.2.0 + - @backstage/plugin-techdocs-node@1.12.12-next.1 + +## @backstage/test-utils@1.6.1-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-permission-react@0.4.27-next.1 + - @backstage/core-app-api@1.15.1-next.1 + - @backstage/theme@0.5.8-next.0 + - @backstage/config@1.2.0 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.8.1 + +## @backstage/theme@0.5.8-next.0 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. + +## @backstage/version-bridge@1.0.10-next.0 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. + +## @backstage/plugin-api-docs@0.11.11-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-permission-react@0.4.27-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/plugin-catalog@1.24.0-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/plugin-catalog-common@1.1.0 + +## @backstage/plugin-api-docs-module-protoc-gen-doc@0.1.8-next.0 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. + +## @backstage/plugin-app@0.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-permission-react@0.4.27-next.1 + - @backstage/theme@0.5.8-next.0 + +## @backstage/plugin-app-visualizer@0.1.11-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + +## @backstage/plugin-auth-react@0.1.7-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/errors@1.2.4 + +## @backstage/plugin-bitbucket-cloud-common@0.2.24-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + +## @backstage/plugin-catalog@1.24.0-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/integration-react@1.2.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-permission-react@0.4.27-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/plugin-search-react@1.8.1-next.1 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-scaffolder-common@1.5.6 + - @backstage/plugin-search-common@1.2.14 + +## @backstage/plugin-catalog-backend@1.26.2-next.1 + +### Patch Changes + +- 62747f8: Fixed a bug where the concurrency limiter for URL reading was not honored +- 8206f49: Fix a bug where etags were expiring too soon in the URL reader +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-openapi-utils@0.1.19-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-node@1.13.1-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.4-next.0 + - @backstage/plugin-search-backend-module-catalog@0.2.3-next.1 + +## @backstage/plugin-catalog-backend-module-aws@0.4.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/integration-aws-node@0.1.12 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-node@1.13.1-next.0 + - @backstage/plugin-kubernetes-common@0.8.3 + +## @backstage/plugin-catalog-backend-module-azure@0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-node@1.13.1-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.3.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.24-next.0 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-node@1.13.1-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-catalog-node@1.13.1-next.0 + +## @backstage/plugin-catalog-backend-module-gerrit@0.2.3-next.1 + +### Patch Changes + +- 5b6edf1: Fixed an issue preventing the provider's `schedule` config from being applied." +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-catalog-node@1.13.1-next.0 + +## @backstage/plugin-catalog-backend-module-github@0.7.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.26.2-next.1 + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-node@1.13.1-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + +## @backstage/plugin-catalog-backend-module-github-org@0.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/plugin-catalog-backend-module-github@0.7.5-next.1 + - @backstage/plugin-catalog-node@1.13.1-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + +## @backstage/plugin-catalog-backend-module-gitlab@0.4.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-node@1.13.1-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + +## @backstage/plugin-catalog-backend-module-gitlab-org@0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/plugin-catalog-backend-module-gitlab@0.4.3-next.1 + - @backstage/plugin-catalog-node@1.13.1-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.5.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.26.2-next.1 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-catalog-node@1.13.1-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + - @backstage/plugin-permission-common@0.8.1 + +## @backstage/plugin-catalog-backend-module-logs@0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.26.2-next.1 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + +## @backstage/plugin-catalog-backend-module-openapi@0.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.26.2-next.1 + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-node@1.13.1-next.0 + +## @backstage/plugin-catalog-graph@0.4.11-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/types@1.1.1 + +## @backstage/plugin-catalog-import@0.12.5-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/integration-react@1.2.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/integration@1.15.1-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-catalog-common@1.1.0 + +## @backstage/plugin-catalog-unprocessed-entities@0.2.9-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/errors@1.2.4 + +## @backstage/plugin-config-schema@0.1.60-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## @backstage/plugin-devtools@0.1.19-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-permission-react@0.4.27-next.1 + - @backstage/errors@1.2.4 + - @backstage/plugin-devtools-common@0.1.12 + +## @backstage/plugin-home@0.7.12-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/core-app-api@1.15.1-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/plugin-home-react@0.1.18-next.1 + - @backstage/theme@0.5.8-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + +## @backstage/plugin-home-react@0.1.18-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + +## @backstage/plugin-kubernetes@0.11.16-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- 605e0bb: Updated dependency `@kubernetes-models/base` to `^5.0.0`. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-kubernetes-react@0.4.4-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/plugin-kubernetes-common@0.8.3 + +## @backstage/plugin-kubernetes-cluster@0.0.17-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- 605e0bb: Updated dependency `@kubernetes-models/base` to `^5.0.0`. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-kubernetes-react@0.4.4-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/plugin-kubernetes-common@0.8.3 + +## @backstage/plugin-kubernetes-react@0.4.4-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- 605e0bb: Updated dependency `@kubernetes-models/base` to `^5.0.0`. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-kubernetes-common@0.8.3 + +## @backstage/plugin-notifications@0.3.2-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/plugin-signals-react@0.0.6-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/theme@0.5.8-next.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-notifications-common@0.0.5 + +## @backstage/plugin-org@0.6.31-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/plugin-catalog-common@1.1.0 + +## @backstage/plugin-org-react@0.1.30-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + +## @backstage/plugin-permission-react@0.4.27-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/config@1.2.0 + - @backstage/plugin-permission-common@0.8.1 + +## @backstage/plugin-scaffolder-backend@1.26.0-next.1 + +### Patch Changes + +- 2f90932: Include step name and step id to checkpoint key +- Updated dependencies + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/integration@1.15.1-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.1-next.1 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.24-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.1-next.0 + - @backstage/plugin-catalog-node@1.13.1-next.0 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.4-next.0 + - @backstage/plugin-scaffolder-backend-module-azure@0.2.1-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.1-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.1-next.1 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.1-next.1 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.1-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.5.1-next.1 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.5.1-next.1 + - @backstage/plugin-scaffolder-common@1.5.6 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-azure@0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.1-next.1 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.1-next.1 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-bitbucket-cloud-common@0.2.24-next.0 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.1-next.1 + +### Patch Changes + +- 66a6b45: Use protocol from Bitbucket Server apiBaseUrl config parameter instead of hard-coded https +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-gcp@0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-gerrit@0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-gitea@0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-github@0.5.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.5.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-notifications@0.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/plugin-notifications-common@0.0.5 + - @backstage/plugin-notifications-node@0.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-rails@0.5.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.4.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node-test-utils@0.1.13-next.1 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + +## @backstage/plugin-scaffolder-node@0.5.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-common@1.5.6 + +## @backstage/plugin-scaffolder-node-test-utils@0.1.13-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/backend-test-utils@1.0.1-next.1 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + +## @backstage/plugin-search@1.4.18-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/version-bridge@1.0.10-next.0 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/plugin-search-react@1.8.1-next.1 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-search-common@1.2.14 + +## @backstage/plugin-search-backend@1.5.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/backend-openapi-utils@0.1.19-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.4-next.0 + - @backstage/plugin-search-backend-node@1.3.3-next.1 + - @backstage/plugin-search-common@1.2.14 + +## @backstage/plugin-search-backend-module-catalog@0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-node@1.13.1-next.0 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-search-backend-node@1.3.3-next.1 + - @backstage/plugin-search-common@1.2.14 + +## @backstage/plugin-search-backend-module-elasticsearch@1.5.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/integration-aws-node@0.1.12 + - @backstage/plugin-search-backend-node@1.3.3-next.1 + - @backstage/plugin-search-common@1.2.14 + +## @backstage/plugin-search-backend-module-explore@0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/plugin-search-backend-node@1.3.3-next.1 + - @backstage/plugin-search-common@1.2.14 + +## @backstage/plugin-search-backend-module-pg@0.5.36-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/plugin-search-backend-node@1.3.3-next.1 + - @backstage/plugin-search-common@1.2.14 + +## @backstage/plugin-search-backend-module-stack-overflow-collator@0.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/plugin-search-backend-node@1.3.3-next.1 + - @backstage/plugin-search-common@1.2.14 + +## @backstage/plugin-search-backend-module-techdocs@0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-node@1.13.1-next.0 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-search-backend-node@1.3.3-next.1 + - @backstage/plugin-search-common@1.2.14 + - @backstage/plugin-techdocs-node@1.12.12-next.1 + +## @backstage/plugin-search-backend-node@1.3.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-search-common@1.2.14 + +## @backstage/plugin-search-react@1.8.1-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/version-bridge@1.0.10-next.0 + - @backstage/theme@0.5.8-next.0 + - @backstage/types@1.1.1 + - @backstage/plugin-search-common@1.2.14 + +## @backstage/plugin-signals@0.0.11-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/plugin-signals-react@0.0.6-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/theme@0.5.8-next.0 + - @backstage/types@1.1.1 + +## @backstage/plugin-signals-react@0.0.6-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/types@1.1.1 + +## @backstage/plugin-techdocs@1.10.11-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/integration-react@1.2.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-techdocs-react@1.2.9-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/plugin-search-react@1.8.1-next.1 + - @backstage/plugin-auth-react@0.1.7-next.1 + - @backstage/theme@0.5.8-next.0 + - @backstage/integration@1.15.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-search-common@1.2.14 + - @backstage/plugin-techdocs-common@0.1.0 + +## @backstage/plugin-techdocs-addons-test-utils@1.0.40-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/integration-react@1.2.0-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-techdocs-react@1.2.9-next.1 + - @backstage/core-app-api@1.15.1-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/plugin-search-react@1.8.1-next.1 + - @backstage/test-utils@1.6.1-next.1 + - @backstage/plugin-techdocs@1.10.11-next.1 + - @backstage/plugin-catalog@1.24.0-next.1 + +## @backstage/plugin-techdocs-backend@1.10.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-node@1.13.1-next.0 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-search-backend-module-techdocs@0.2.3-next.1 + - @backstage/plugin-techdocs-common@0.1.0 + - @backstage/plugin-techdocs-node@1.12.12-next.1 + +## @backstage/plugin-techdocs-module-addons-contrib@1.1.16-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/integration-react@1.2.0-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-techdocs-react@1.2.9-next.1 + - @backstage/integration@1.15.1-next.0 + +## @backstage/plugin-techdocs-node@1.12.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/integration-aws-node@0.1.12 + - @backstage/plugin-search-common@1.2.14 + - @backstage/plugin-techdocs-common@0.1.0 + +## @backstage/plugin-techdocs-react@1.2.9-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/version-bridge@1.0.10-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + +## @backstage/plugin-user-settings@0.8.14-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/plugin-signals-react@0.0.6-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/core-app-api@1.15.1-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/theme@0.5.8-next.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-user-settings-common@0.0.1 + +## @backstage/plugin-user-settings-backend@0.2.25-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/plugin-signals-node@0.1.12-next.0 + - @backstage/plugin-user-settings-common@0.0.1 + +## example-app@0.2.102-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/cli@0.28.0-next.1 + - @backstage/plugin-scaffolder@1.26.0-next.1 + - @backstage/plugin-signals@0.0.11-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.16-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.9-next.1 + - @backstage/integration-react@1.2.0-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.17-next.1 + - @backstage/frontend-app-api@0.10.0-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-permission-react@0.4.27-next.1 + - @backstage/plugin-scaffolder-react@1.13.0-next.1 + - @backstage/plugin-catalog-import@0.12.5-next.1 + - @backstage/plugin-techdocs-react@1.2.9-next.1 + - @backstage/app-defaults@1.5.12-next.1 + - @backstage/core-app-api@1.15.1-next.1 + - @backstage/plugin-catalog-graph@0.4.11-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/plugin-notifications@0.3.2-next.1 + - @backstage/plugin-user-settings@0.8.14-next.1 + - @backstage/plugin-search-react@1.8.1-next.1 + - @backstage/plugin-auth-react@0.1.7-next.1 + - @backstage/plugin-kubernetes@0.11.16-next.1 + - @backstage/plugin-api-docs@0.11.11-next.1 + - @backstage/plugin-devtools@0.1.19-next.1 + - @backstage/plugin-techdocs@1.10.11-next.1 + - @backstage/plugin-catalog@1.24.0-next.1 + - @backstage/theme@0.5.8-next.0 + - @backstage/plugin-search@1.4.18-next.1 + - @backstage/plugin-home@0.7.12-next.1 + - @backstage/plugin-org@0.6.31-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-search-common@1.2.14 + +## example-app-next@0.0.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/cli@0.28.0-next.1 + - @backstage/plugin-scaffolder@1.26.0-next.1 + - @backstage/plugin-signals@0.0.11-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.16-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.9-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/integration-react@1.2.0-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.17-next.1 + - @backstage/frontend-app-api@0.10.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-permission-react@0.4.27-next.1 + - @backstage/plugin-scaffolder-react@1.13.0-next.1 + - @backstage/plugin-app-visualizer@0.1.11-next.1 + - @backstage/plugin-catalog-import@0.12.5-next.1 + - @backstage/plugin-techdocs-react@1.2.9-next.1 + - @backstage/app-defaults@1.5.12-next.1 + - @backstage/core-app-api@1.15.1-next.1 + - @backstage/plugin-catalog-graph@0.4.11-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/plugin-notifications@0.3.2-next.1 + - @backstage/plugin-user-settings@0.8.14-next.1 + - @backstage/plugin-search-react@1.8.1-next.1 + - @backstage/plugin-auth-react@0.1.7-next.1 + - @backstage/plugin-kubernetes@0.11.16-next.1 + - @backstage/plugin-api-docs@0.11.11-next.1 + - @backstage/plugin-techdocs@1.10.11-next.1 + - @backstage/plugin-catalog@1.24.0-next.1 + - @backstage/theme@0.5.8-next.0 + - @backstage/plugin-search@1.4.18-next.1 + - @backstage/plugin-home@0.7.12-next.1 + - @backstage/plugin-org@0.6.31-next.1 + - @backstage/plugin-app@0.1.1-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/frontend-defaults@0.1.1-next.1 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-search-common@1.2.14 + +## app-next-example-plugin@0.0.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + +## example-backend@0.0.31-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.26.0-next.1 + - @backstage/plugin-catalog-backend@1.26.2-next.1 + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/plugin-app-backend@0.3.75-next.0 + - @backstage/plugin-auth-backend@0.23.1-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.2.1-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.1-next.0 + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.1-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.2.2-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.1-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.1-next.0 + - @backstage/plugin-devtools-backend@0.4.1-next.0 + - @backstage/plugin-events-backend@0.3.13-next.0 + - @backstage/plugin-kubernetes-backend@0.18.7-next.0 + - @backstage/plugin-notifications-backend@0.4.1-next.0 + - @backstage/plugin-permission-backend@0.5.50-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.1-next.0 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.4-next.0 + - @backstage/plugin-proxy-backend@0.5.7-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.5.1-next.1 + - @backstage/plugin-search-backend@1.5.18-next.1 + - @backstage/plugin-search-backend-module-catalog@0.2.3-next.1 + - @backstage/plugin-search-backend-module-explore@0.2.3-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.2.3-next.1 + - @backstage/plugin-search-backend-node@1.3.3-next.1 + - @backstage/plugin-signals-backend@0.2.1-next.0 + - @backstage/plugin-techdocs-backend@1.10.14-next.1 + +## example-backend-legacy@0.2.103-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.26.0-next.1 + - @backstage/plugin-catalog-backend@1.26.2-next.1 + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/plugin-app-backend@0.3.75-next.0 + - @backstage/plugin-auth-backend@0.23.1-next.0 + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.1-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.1-next.0 + - @backstage/plugin-catalog-node@1.13.1-next.0 + - @backstage/plugin-devtools-backend@0.4.1-next.0 + - @backstage/plugin-events-backend@0.3.13-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + - @backstage/plugin-kubernetes-backend@0.18.7-next.0 + - @backstage/plugin-permission-backend@0.5.50-next.0 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.4-next.0 + - @backstage/plugin-proxy-backend@0.5.7-next.0 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.1-next.1 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.5.1-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.5.1-next.1 + - @backstage/plugin-search-backend@1.5.18-next.1 + - @backstage/plugin-search-backend-module-catalog@0.2.3-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.5.7-next.1 + - @backstage/plugin-search-backend-module-explore@0.2.3-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.36-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.2.3-next.1 + - @backstage/plugin-search-backend-node@1.3.3-next.1 + - @backstage/plugin-signals-backend@0.2.1-next.0 + - @backstage/plugin-signals-node@0.1.12-next.0 + - @backstage/plugin-techdocs-backend@1.10.14-next.1 + +## e2e-test@0.2.21-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.21-next.1 + - @backstage/cli-common@0.1.14 + - @backstage/errors@1.2.4 + +## @internal/frontend@0.0.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/version-bridge@1.0.10-next.0 + - @backstage/types@1.1.1 + +## @internal/scaffolder@0.0.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.13.0-next.1 + +## techdocs-cli-embedded-app@0.2.101-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/cli@0.28.0-next.1 + - @backstage/integration-react@1.2.0-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-techdocs-react@1.2.9-next.1 + - @backstage/app-defaults@1.5.12-next.1 + - @backstage/core-app-api@1.15.1-next.1 + - @backstage/test-utils@1.6.1-next.1 + - @backstage/plugin-techdocs@1.10.11-next.1 + - @backstage/plugin-catalog@1.24.0-next.1 + - @backstage/theme@0.5.8-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + +## @internal/plugin-todo-list@1.0.32-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 diff --git a/package.json b/package.json index a00c7fd721..425b1c1a38 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "root", - "version": "1.32.0-next.0", + "version": "1.32.0-next.1", "private": true, "repository": { "type": "git", diff --git a/packages/app-defaults/CHANGELOG.md b/packages/app-defaults/CHANGELOG.md index 70d5261e9a..281ac7d936 100644 --- a/packages/app-defaults/CHANGELOG.md +++ b/packages/app-defaults/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/app-defaults +## 1.5.12-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-permission-react@0.4.27-next.1 + - @backstage/core-app-api@1.15.1-next.1 + - @backstage/theme@0.5.8-next.0 + ## 1.5.12-next.0 ### Patch Changes diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json index 1865c856b7..6dfe1aaa49 100644 --- a/packages/app-defaults/package.json +++ b/packages/app-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/app-defaults", - "version": "1.5.12-next.0", + "version": "1.5.12-next.1", "description": "Provides the default wiring of a Backstage App", "backstage": { "role": "web-library" diff --git a/packages/app-next-example-plugin/CHANGELOG.md b/packages/app-next-example-plugin/CHANGELOG.md index e7e0d18b5e..c86731a467 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.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + ## 0.0.16-next.0 ### Patch Changes diff --git a/packages/app-next-example-plugin/package.json b/packages/app-next-example-plugin/package.json index 56374b384c..721779d1b5 100644 --- a/packages/app-next-example-plugin/package.json +++ b/packages/app-next-example-plugin/package.json @@ -1,6 +1,6 @@ { "name": "app-next-example-plugin", - "version": "0.0.16-next.0", + "version": "0.0.16-next.1", "description": "Backstage internal example plugin", "backstage": { "role": "frontend-plugin", diff --git a/packages/app-next/CHANGELOG.md b/packages/app-next/CHANGELOG.md index 7a02795402..a4d5c97a8e 100644 --- a/packages/app-next/CHANGELOG.md +++ b/packages/app-next/CHANGELOG.md @@ -1,5 +1,50 @@ # example-app-next +## 0.0.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/cli@0.28.0-next.1 + - @backstage/plugin-scaffolder@1.26.0-next.1 + - @backstage/plugin-signals@0.0.11-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.16-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.9-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/integration-react@1.2.0-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.17-next.1 + - @backstage/frontend-app-api@0.10.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-permission-react@0.4.27-next.1 + - @backstage/plugin-scaffolder-react@1.13.0-next.1 + - @backstage/plugin-app-visualizer@0.1.11-next.1 + - @backstage/plugin-catalog-import@0.12.5-next.1 + - @backstage/plugin-techdocs-react@1.2.9-next.1 + - @backstage/app-defaults@1.5.12-next.1 + - @backstage/core-app-api@1.15.1-next.1 + - @backstage/plugin-catalog-graph@0.4.11-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/plugin-notifications@0.3.2-next.1 + - @backstage/plugin-user-settings@0.8.14-next.1 + - @backstage/plugin-search-react@1.8.1-next.1 + - @backstage/plugin-auth-react@0.1.7-next.1 + - @backstage/plugin-kubernetes@0.11.16-next.1 + - @backstage/plugin-api-docs@0.11.11-next.1 + - @backstage/plugin-techdocs@1.10.11-next.1 + - @backstage/plugin-catalog@1.24.0-next.1 + - @backstage/theme@0.5.8-next.0 + - @backstage/plugin-search@1.4.18-next.1 + - @backstage/plugin-home@0.7.12-next.1 + - @backstage/plugin-org@0.6.31-next.1 + - @backstage/plugin-app@0.1.1-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/frontend-defaults@0.1.1-next.1 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-search-common@1.2.14 + ## 0.0.16-next.0 ### Patch Changes diff --git a/packages/app-next/package.json b/packages/app-next/package.json index 29f9105031..bff21c3b89 100644 --- a/packages/app-next/package.json +++ b/packages/app-next/package.json @@ -1,6 +1,6 @@ { "name": "example-app-next", - "version": "0.0.16-next.0", + "version": "0.0.16-next.1", "backstage": { "role": "frontend" }, diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index bc152199f3..f72e393af7 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,46 @@ # example-app +## 0.2.102-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/cli@0.28.0-next.1 + - @backstage/plugin-scaffolder@1.26.0-next.1 + - @backstage/plugin-signals@0.0.11-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.16-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.9-next.1 + - @backstage/integration-react@1.2.0-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.17-next.1 + - @backstage/frontend-app-api@0.10.0-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-permission-react@0.4.27-next.1 + - @backstage/plugin-scaffolder-react@1.13.0-next.1 + - @backstage/plugin-catalog-import@0.12.5-next.1 + - @backstage/plugin-techdocs-react@1.2.9-next.1 + - @backstage/app-defaults@1.5.12-next.1 + - @backstage/core-app-api@1.15.1-next.1 + - @backstage/plugin-catalog-graph@0.4.11-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/plugin-notifications@0.3.2-next.1 + - @backstage/plugin-user-settings@0.8.14-next.1 + - @backstage/plugin-search-react@1.8.1-next.1 + - @backstage/plugin-auth-react@0.1.7-next.1 + - @backstage/plugin-kubernetes@0.11.16-next.1 + - @backstage/plugin-api-docs@0.11.11-next.1 + - @backstage/plugin-devtools@0.1.19-next.1 + - @backstage/plugin-techdocs@1.10.11-next.1 + - @backstage/plugin-catalog@1.24.0-next.1 + - @backstage/theme@0.5.8-next.0 + - @backstage/plugin-search@1.4.18-next.1 + - @backstage/plugin-home@0.7.12-next.1 + - @backstage/plugin-org@0.6.31-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-search-common@1.2.14 + ## 0.2.102-next.0 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index 15cdd85d32..e6eb6b9f20 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "example-app", - "version": "0.2.102-next.0", + "version": "0.2.102-next.1", "backstage": { "role": "frontend" }, diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md index 1fe09ee8f8..05cc779bbf 100644 --- a/packages/backend-defaults/CHANGELOG.md +++ b/packages/backend-defaults/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/backend-defaults +## 0.5.1-next.1 + +### Patch Changes + +- 920004b: Updating error message for getProjectId when fetching Gitlab project from its url to be more accurate +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-app-api@1.0.1-next.0 + - @backstage/backend-dev-utils@0.1.5 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/cli-common@0.1.14 + - @backstage/cli-node@0.2.8 + - @backstage/config@1.2.0 + - @backstage/config-loader@1.9.1 + - @backstage/errors@1.2.4 + - @backstage/integration-aws-node@0.1.12 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + - @backstage/plugin-permission-node@0.8.4-next.0 + ## 0.5.1-next.0 ### Patch Changes diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 4437a4ff1f..b3375de9a5 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-defaults", - "version": "0.5.1-next.0", + "version": "0.5.1-next.1", "description": "Backend defaults used by Backstage backend apps", "backstage": { "role": "node-library" diff --git a/packages/backend-dynamic-feature-service/CHANGELOG.md b/packages/backend-dynamic-feature-service/CHANGELOG.md index 61501e48c8..ee2124a976 100644 --- a/packages/backend-dynamic-feature-service/CHANGELOG.md +++ b/packages/backend-dynamic-feature-service/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/backend-dynamic-feature-service +## 0.4.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.26.2-next.1 + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/backend-app-api@1.0.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/cli-common@0.1.14 + - @backstage/cli-node@0.2.8 + - @backstage/config@1.2.0 + - @backstage/config-loader@1.9.1 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-app-node@0.1.26-next.0 + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/plugin-events-backend@0.3.13-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.4-next.0 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + - @backstage/plugin-search-backend-node@1.3.3-next.1 + - @backstage/plugin-search-common@1.2.14 + ## 0.4.1-next.0 ### Patch Changes diff --git a/packages/backend-dynamic-feature-service/package.json b/packages/backend-dynamic-feature-service/package.json index d30395aa67..b1f6cf79e7 100644 --- a/packages/backend-dynamic-feature-service/package.json +++ b/packages/backend-dynamic-feature-service/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-dynamic-feature-service", - "version": "0.4.1-next.0", + "version": "0.4.2-next.1", "description": "Backstage dynamic feature service", "backstage": { "role": "node-library" diff --git a/packages/backend-legacy/CHANGELOG.md b/packages/backend-legacy/CHANGELOG.md index e19594aa65..b12f216273 100644 --- a/packages/backend-legacy/CHANGELOG.md +++ b/packages/backend-legacy/CHANGELOG.md @@ -1,5 +1,46 @@ # example-backend-legacy +## 0.2.103-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.26.0-next.1 + - @backstage/plugin-catalog-backend@1.26.2-next.1 + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/plugin-app-backend@0.3.75-next.0 + - @backstage/plugin-auth-backend@0.23.1-next.0 + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.1-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.1-next.0 + - @backstage/plugin-catalog-node@1.13.1-next.0 + - @backstage/plugin-devtools-backend@0.4.1-next.0 + - @backstage/plugin-events-backend@0.3.13-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + - @backstage/plugin-kubernetes-backend@0.18.7-next.0 + - @backstage/plugin-permission-backend@0.5.50-next.0 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.4-next.0 + - @backstage/plugin-proxy-backend@0.5.7-next.0 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.1-next.1 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.5.1-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.5.1-next.1 + - @backstage/plugin-search-backend@1.5.18-next.1 + - @backstage/plugin-search-backend-module-catalog@0.2.3-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.5.7-next.1 + - @backstage/plugin-search-backend-module-explore@0.2.3-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.36-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.2.3-next.1 + - @backstage/plugin-search-backend-node@1.3.3-next.1 + - @backstage/plugin-signals-backend@0.2.1-next.0 + - @backstage/plugin-signals-node@0.1.12-next.0 + - @backstage/plugin-techdocs-backend@1.10.14-next.1 + ## 0.2.103-next.0 ### Patch Changes diff --git a/packages/backend-legacy/package.json b/packages/backend-legacy/package.json index 12c8570616..d7d4a68b4a 100644 --- a/packages/backend-legacy/package.json +++ b/packages/backend-legacy/package.json @@ -1,6 +1,6 @@ { "name": "example-backend-legacy", - "version": "0.2.103-next.0", + "version": "0.2.103-next.1", "backstage": { "role": "backend" }, diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md index bf8b8bd92d..75a57ff4dd 100644 --- a/packages/backend-test-utils/CHANGELOG.md +++ b/packages/backend-test-utils/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/backend-test-utils +## 1.0.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/backend-app-api@1.0.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + ## 1.0.1-next.0 ### Patch Changes diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index aea4e2f94a..427eb7c7a2 100644 --- a/packages/backend-test-utils/package.json +++ b/packages/backend-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-test-utils", - "version": "1.0.1-next.0", + "version": "1.0.1-next.1", "description": "Test helpers library for Backstage backends", "backstage": { "role": "node-library" diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index 363b814ce8..3badfd2a9a 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,42 @@ # example-backend +## 0.0.31-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.26.0-next.1 + - @backstage/plugin-catalog-backend@1.26.2-next.1 + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/plugin-app-backend@0.3.75-next.0 + - @backstage/plugin-auth-backend@0.23.1-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.2.1-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.1-next.0 + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.1-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.2.2-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.1-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.1-next.0 + - @backstage/plugin-devtools-backend@0.4.1-next.0 + - @backstage/plugin-events-backend@0.3.13-next.0 + - @backstage/plugin-kubernetes-backend@0.18.7-next.0 + - @backstage/plugin-notifications-backend@0.4.1-next.0 + - @backstage/plugin-permission-backend@0.5.50-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.1-next.0 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.4-next.0 + - @backstage/plugin-proxy-backend@0.5.7-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.5.1-next.1 + - @backstage/plugin-search-backend@1.5.18-next.1 + - @backstage/plugin-search-backend-module-catalog@0.2.3-next.1 + - @backstage/plugin-search-backend-module-explore@0.2.3-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.2.3-next.1 + - @backstage/plugin-search-backend-node@1.3.3-next.1 + - @backstage/plugin-signals-backend@0.2.1-next.0 + - @backstage/plugin-techdocs-backend@1.10.14-next.1 + ## 0.0.31-next.0 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index 13de4407bb..e6f158c0d3 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "example-backend", - "version": "0.0.31-next.0", + "version": "0.0.31-next.1", "backstage": { "role": "backend" }, diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 7c4a46ad5a..341c8d1a2f 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/cli +## 0.28.0-next.1 + +### Minor Changes + +- 55b8b84: **BREAKING**: The Jest configuration defined at `@backstage/cli/config/jest` no longer collects configuration defined in the `"jest"` field from all parent `package.json` files. Instead, it will only read and merge configuration from the `package.json` in the monorepo root if it exists, as well as the target package. In addition, configuration defined in the root `package.json` will now only be merged into each package configuration if it is a valid project-level configuration key. + +### Patch Changes + +- 03810d2: Remove unknown dependency `diff` +- cebee4f: Added support for a new experimental `EXPERIMENTAL_TRIM_NEXT_ENTRY` flag which removes any `./next` entry points present in packages when building and publishing. +- 55b8b84: The Jest configuration will now search for a `src/setupTests.*` file with any valid script extension, not only `.ts`. +- Updated dependencies + - @backstage/eslint-plugin@0.1.10-next.0 + - @backstage/integration@1.15.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/cli-common@0.1.14 + - @backstage/cli-node@0.2.8 + - @backstage/config@1.2.0 + - @backstage/config-loader@1.9.1 + - @backstage/errors@1.2.4 + - @backstage/release-manifests@0.0.11 + - @backstage/types@1.1.1 + ## 0.28.0-next.0 ### Minor Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 2cbf7b8484..67f69c988c 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli", - "version": "0.28.0-next.0", + "version": "0.28.0-next.1", "description": "CLI for developing Backstage plugins and apps", "backstage": { "role": "cli" diff --git a/packages/core-app-api/CHANGELOG.md b/packages/core-app-api/CHANGELOG.md index fd86cbb918..c028e3c7bc 100644 --- a/packages/core-app-api/CHANGELOG.md +++ b/packages/core-app-api/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/core-app-api +## 1.15.1-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/version-bridge@1.0.10-next.0 + - @backstage/config@1.2.0 + - @backstage/types@1.1.1 + ## 1.15.1-next.0 ### Patch Changes diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json index 6d443606b0..10a7c913a4 100644 --- a/packages/core-app-api/package.json +++ b/packages/core-app-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/core-app-api", - "version": "1.15.1-next.0", + "version": "1.15.1-next.1", "description": "Core app API used by Backstage apps", "backstage": { "role": "web-library" diff --git a/packages/core-compat-api/CHANGELOG.md b/packages/core-compat-api/CHANGELOG.md index cd1154dbc8..91e51ce0ea 100644 --- a/packages/core-compat-api/CHANGELOG.md +++ b/packages/core-compat-api/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/core-compat-api +## 0.3.1-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/version-bridge@1.0.10-next.0 + ## 0.3.1-next.0 ### Patch Changes diff --git a/packages/core-compat-api/package.json b/packages/core-compat-api/package.json index 6863f65a0c..6379ed4ae2 100644 --- a/packages/core-compat-api/package.json +++ b/packages/core-compat-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/core-compat-api", - "version": "0.3.1-next.0", + "version": "0.3.1-next.1", "backstage": { "role": "web-library" }, diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md index 935c94a33b..fec8b746c8 100644 --- a/packages/core-components/CHANGELOG.md +++ b/packages/core-components/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/core-components +## 0.15.1-next.1 + +### Patch Changes + +- 3f76d0e: Correct size of FavoriteToggle and inherit non-starred color from parent +- e969dc7: Move `@types/react` to a peer dependency. +- 83e2887: Fixed a bug in the `SidebarSubmenu` core component that caused the nested menu to overlap with the sidebar when the user hovers over the pinned sidebar. +- Updated dependencies + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/version-bridge@1.0.10-next.0 + - @backstage/theme@0.5.8-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + ## 0.15.1-next.0 ### Patch Changes diff --git a/packages/core-components/package.json b/packages/core-components/package.json index 30699ad7a1..e38adfea7c 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/core-components", - "version": "0.15.1-next.0", + "version": "0.15.1-next.1", "description": "Core components used by Backstage plugins and apps", "backstage": { "role": "web-library" diff --git a/packages/core-plugin-api/CHANGELOG.md b/packages/core-plugin-api/CHANGELOG.md index e6244245be..614feda711 100644 --- a/packages/core-plugin-api/CHANGELOG.md +++ b/packages/core-plugin-api/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/core-plugin-api +## 1.10.0-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/version-bridge@1.0.10-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + ## 1.10.0-next.0 ### Minor Changes diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json index 876457b939..dc08e132c1 100644 --- a/packages/core-plugin-api/package.json +++ b/packages/core-plugin-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/core-plugin-api", - "version": "1.10.0-next.0", + "version": "1.10.0-next.1", "description": "Core API used by Backstage plugins", "backstage": { "role": "web-library" diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index de3a9a4392..8d55ec220c 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/create-app +## 0.5.21-next.1 + +### Patch Changes + +- Bumped create-app version. +- Updated dependencies + - @backstage/cli-common@0.1.14 + ## 0.5.21-next.0 ### Patch Changes diff --git a/packages/create-app/package.json b/packages/create-app/package.json index 68764acc0a..2d22249012 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/create-app", - "version": "0.5.21-next.0", + "version": "0.5.21-next.1", "description": "A CLI that helps you create your own Backstage app", "backstage": { "role": "cli" diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md index ada9df8b6e..a3e03f6663 100644 --- a/packages/dev-utils/CHANGELOG.md +++ b/packages/dev-utils/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/dev-utils +## 1.1.2-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/integration-react@1.2.0-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/app-defaults@1.5.12-next.1 + - @backstage/core-app-api@1.15.1-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/theme@0.5.8-next.0 + - @backstage/catalog-model@1.7.0 + ## 1.1.1-next.0 ### Patch Changes diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index a45f63324e..9952f72f4d 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/dev-utils", - "version": "1.1.1-next.0", + "version": "1.1.2-next.1", "description": "Utilities for developing Backstage plugins.", "backstage": { "role": "web-library" diff --git a/packages/e2e-test/CHANGELOG.md b/packages/e2e-test/CHANGELOG.md index 0ed5490a8b..07b36cf3b2 100644 --- a/packages/e2e-test/CHANGELOG.md +++ b/packages/e2e-test/CHANGELOG.md @@ -1,5 +1,14 @@ # e2e-test +## 0.2.21-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.21-next.1 + - @backstage/cli-common@0.1.14 + - @backstage/errors@1.2.4 + ## 0.2.21-next.0 ### Patch Changes diff --git a/packages/e2e-test/package.json b/packages/e2e-test/package.json index 606a30e363..dd7fc2c8e4 100644 --- a/packages/e2e-test/package.json +++ b/packages/e2e-test/package.json @@ -1,6 +1,6 @@ { "name": "e2e-test", - "version": "0.2.21-next.0", + "version": "0.2.21-next.1", "description": "E2E test for verifying Backstage packages", "backstage": { "role": "cli" diff --git a/packages/eslint-plugin/CHANGELOG.md b/packages/eslint-plugin/CHANGELOG.md index 8ad8a96255..f7073ce289 100644 --- a/packages/eslint-plugin/CHANGELOG.md +++ b/packages/eslint-plugin/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/eslint-plugin +## 0.1.10-next.0 + +### Patch Changes + +- 63963f6: Internal refactor to deal with `estree` upgrade + ## 0.1.9 ### Patch Changes diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index 69f36ee513..52438be2fb 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/eslint-plugin", - "version": "0.1.9", + "version": "0.1.10-next.0", "description": "Backstage ESLint plugin", "publishConfig": { "access": "public" diff --git a/packages/frontend-app-api/CHANGELOG.md b/packages/frontend-app-api/CHANGELOG.md index cbc4a2e361..5fea3c4cea 100644 --- a/packages/frontend-app-api/CHANGELOG.md +++ b/packages/frontend-app-api/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/frontend-app-api +## 0.10.0-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/version-bridge@1.0.10-next.0 + - @backstage/core-app-api@1.15.1-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/frontend-defaults@0.1.1-next.1 + - @backstage/types@1.1.1 + ## 0.10.0-next.0 ### Minor Changes diff --git a/packages/frontend-app-api/package.json b/packages/frontend-app-api/package.json index 674556d144..0f0535f522 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.10.0-next.0", + "version": "0.10.0-next.1", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-defaults/CHANGELOG.md b/packages/frontend-defaults/CHANGELOG.md index 7c85a116f4..0c4066f25c 100644 --- a/packages/frontend-defaults/CHANGELOG.md +++ b/packages/frontend-defaults/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/frontend-defaults +## 0.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/frontend-app-api@0.10.0-next.1 + - @backstage/plugin-app@0.1.1-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + ## 0.1.1-next.0 ### Patch Changes diff --git a/packages/frontend-defaults/package.json b/packages/frontend-defaults/package.json index 8f8abb0512..8f502274fa 100644 --- a/packages/frontend-defaults/package.json +++ b/packages/frontend-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-defaults", - "version": "0.1.1-next.0", + "version": "0.1.1-next.1", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-internal/CHANGELOG.md b/packages/frontend-internal/CHANGELOG.md index 44381cf70d..8c8025ae27 100644 --- a/packages/frontend-internal/CHANGELOG.md +++ b/packages/frontend-internal/CHANGELOG.md @@ -1,5 +1,14 @@ # @internal/frontend +## 0.0.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/version-bridge@1.0.10-next.0 + - @backstage/types@1.1.1 + ## 0.0.2-next.0 ### Patch Changes diff --git a/packages/frontend-internal/package.json b/packages/frontend-internal/package.json index b739f60e39..7abaee7b0d 100644 --- a/packages/frontend-internal/package.json +++ b/packages/frontend-internal/package.json @@ -1,6 +1,6 @@ { "name": "@internal/frontend", - "version": "0.0.2-next.0", + "version": "0.0.2-next.1", "backstage": { "role": "web-library", "inline": true diff --git a/packages/frontend-plugin-api/CHANGELOG.md b/packages/frontend-plugin-api/CHANGELOG.md index d2cef285d5..bb73a4ffd7 100644 --- a/packages/frontend-plugin-api/CHANGELOG.md +++ b/packages/frontend-plugin-api/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/frontend-plugin-api +## 0.9.0-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/version-bridge@1.0.10-next.0 + - @backstage/types@1.1.1 + ## 0.9.0-next.0 ### Minor Changes diff --git a/packages/frontend-plugin-api/package.json b/packages/frontend-plugin-api/package.json index 309ebacc04..834006a45c 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.9.0-next.0", + "version": "0.9.0-next.1", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-test-utils/CHANGELOG.md b/packages/frontend-test-utils/CHANGELOG.md index 72588c9526..37b14f0035 100644 --- a/packages/frontend-test-utils/CHANGELOG.md +++ b/packages/frontend-test-utils/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/frontend-test-utils +## 0.2.1-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/frontend-app-api@0.10.0-next.1 + - @backstage/version-bridge@1.0.10-next.0 + - @backstage/test-utils@1.6.1-next.1 + - @backstage/plugin-app@0.1.1-next.1 + - @backstage/config@1.2.0 + - @backstage/types@1.1.1 + ## 0.2.1-next.0 ### Patch Changes diff --git a/packages/frontend-test-utils/package.json b/packages/frontend-test-utils/package.json index b8973bc5bd..27bb592879 100644 --- a/packages/frontend-test-utils/package.json +++ b/packages/frontend-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-test-utils", - "version": "0.2.1-next.0", + "version": "0.2.1-next.1", "backstage": { "role": "web-library" }, diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md index efe55d1094..05e7d3e386 100644 --- a/packages/integration-react/CHANGELOG.md +++ b/packages/integration-react/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/integration-react +## 1.2.0-next.1 + +### Minor Changes + +- a11495a: Added new ScmAuth method `forBitbucketServer` that uses correct OAuth scopes by default. Also updated `forBitbucket` method to allow overriding the default OAuth scopes. + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- 3dbac17: Revert of change #26430 +- Updated dependencies + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/integration@1.15.1-next.0 + - @backstage/config@1.2.0 + ## 1.1.32-next.0 ### Patch Changes diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index 5911006c7e..878a44a3ec 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/integration-react", - "version": "1.1.32-next.0", + "version": "1.2.0-next.1", "description": "Frontend package for managing integrations towards external systems", "backstage": { "role": "web-library" diff --git a/packages/integration/CHANGELOG.md b/packages/integration/CHANGELOG.md index e01418aec9..9c3195d7f5 100644 --- a/packages/integration/CHANGELOG.md +++ b/packages/integration/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/integration +## 1.15.1-next.0 + +### Patch Changes + +- 920004b: Updating error message for getProjectId when fetching Gitlab project from its url to be more accurate +- 090e49a: Updated functions parseHarnessUrl, getHarnessLatestCommitUrl, getHarnessFileContentsUrl and getHarnessArchiveUrl to fix parsing of urls +- Updated dependencies + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + ## 1.15.0 ### Minor Changes diff --git a/packages/integration/package.json b/packages/integration/package.json index 4566c8efe2..7ca8c6f073 100644 --- a/packages/integration/package.json +++ b/packages/integration/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/integration", - "version": "1.15.0", + "version": "1.15.1-next.0", "description": "Helpers for managing integrations towards external systems", "backstage": { "role": "common-library" diff --git a/packages/repo-tools/CHANGELOG.md b/packages/repo-tools/CHANGELOG.md index 7e772a99c0..8d02431a0c 100644 --- a/packages/repo-tools/CHANGELOG.md +++ b/packages/repo-tools/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/repo-tools +## 0.10.0-next.1 + +### Minor Changes + +- 8eb3033: Adds a new command `backstage-repo-tools peer-deps` for validating your usage of peer dependencies in your plugins. It currently supports react related peer dependencies. It also has a `--fix` mode for quickly fixing any issues that it finds. + +### Patch Changes + +- 1f6706f: Properly log instructions when APIs do not match +- Updated dependencies + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/cli-common@0.1.14 + - @backstage/cli-node@0.2.8 + - @backstage/config-loader@1.9.1 + - @backstage/errors@1.2.4 + ## 0.10.0-next.0 ### Minor Changes diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json index 8e9f705671..71c1314c8e 100644 --- a/packages/repo-tools/package.json +++ b/packages/repo-tools/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/repo-tools", - "version": "0.10.0-next.0", + "version": "0.10.0-next.1", "description": "CLI for Backstage repo tooling ", "backstage": { "role": "cli" diff --git a/packages/scaffolder-internal/CHANGELOG.md b/packages/scaffolder-internal/CHANGELOG.md index f0f7a9767b..291f528607 100644 --- a/packages/scaffolder-internal/CHANGELOG.md +++ b/packages/scaffolder-internal/CHANGELOG.md @@ -1,5 +1,12 @@ # @internal/scaffolder +## 0.0.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.13.0-next.1 + ## 0.0.2-next.0 ### Patch Changes diff --git a/packages/scaffolder-internal/package.json b/packages/scaffolder-internal/package.json index 3df80f36ec..6ece1226de 100644 --- a/packages/scaffolder-internal/package.json +++ b/packages/scaffolder-internal/package.json @@ -1,6 +1,6 @@ { "name": "@internal/scaffolder", - "version": "0.0.2-next.0", + "version": "0.0.2-next.1", "backstage": { "role": "web-library", "inline": true diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md index 82cede0446..751e710c64 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.101-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/cli@0.28.0-next.1 + - @backstage/integration-react@1.2.0-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-techdocs-react@1.2.9-next.1 + - @backstage/app-defaults@1.5.12-next.1 + - @backstage/core-app-api@1.15.1-next.1 + - @backstage/test-utils@1.6.1-next.1 + - @backstage/plugin-techdocs@1.10.11-next.1 + - @backstage/plugin-catalog@1.24.0-next.1 + - @backstage/theme@0.5.8-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + ## 0.2.101-next.0 ### Patch Changes diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index 249ec2f062..383648365e 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.101-next.0", + "version": "0.2.101-next.1", "backstage": { "role": "frontend" }, diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md index fefd4d2513..917c448316 100644 --- a/packages/techdocs-cli/CHANGELOG.md +++ b/packages/techdocs-cli/CHANGELOG.md @@ -1,5 +1,16 @@ # @techdocs/cli +## 1.8.20-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/cli-common@0.1.14 + - @backstage/config@1.2.0 + - @backstage/plugin-techdocs-node@1.12.12-next.1 + ## 1.8.20-next.0 ### Patch Changes diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index 12ae968f2e..91e68447db 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -1,6 +1,6 @@ { "name": "@techdocs/cli", - "version": "1.8.20-next.0", + "version": "1.8.20-next.1", "description": "Utility CLI for managing TechDocs sites in Backstage.", "backstage": { "role": "cli" diff --git a/packages/test-utils/CHANGELOG.md b/packages/test-utils/CHANGELOG.md index b749d728f8..ef8b72951f 100644 --- a/packages/test-utils/CHANGELOG.md +++ b/packages/test-utils/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/test-utils +## 1.6.1-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-permission-react@0.4.27-next.1 + - @backstage/core-app-api@1.15.1-next.1 + - @backstage/theme@0.5.8-next.0 + - @backstage/config@1.2.0 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.8.1 + ## 1.6.1-next.0 ### Patch Changes diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index f31595084c..1c611fd584 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/test-utils", - "version": "1.6.1-next.0", + "version": "1.6.1-next.1", "description": "Utilities to test Backstage plugins and apps.", "backstage": { "role": "web-library" diff --git a/packages/theme/CHANGELOG.md b/packages/theme/CHANGELOG.md index 7eb197637c..db48fe9c40 100644 --- a/packages/theme/CHANGELOG.md +++ b/packages/theme/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/theme +## 0.5.8-next.0 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. + ## 0.5.7 ### Patch Changes diff --git a/packages/theme/package.json b/packages/theme/package.json index 17b655ca52..842fc242da 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/theme", - "version": "0.5.7", + "version": "0.5.8-next.0", "description": "material-ui theme for use with Backstage.", "backstage": { "role": "web-library" diff --git a/packages/version-bridge/CHANGELOG.md b/packages/version-bridge/CHANGELOG.md index d0333d57db..10a7aa5f60 100644 --- a/packages/version-bridge/CHANGELOG.md +++ b/packages/version-bridge/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/version-bridge +## 1.0.10-next.0 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. + ## 1.0.9 ### Patch Changes diff --git a/packages/version-bridge/package.json b/packages/version-bridge/package.json index aea9d122bf..4d00974baa 100644 --- a/packages/version-bridge/package.json +++ b/packages/version-bridge/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/version-bridge", - "version": "1.0.9", + "version": "1.0.10-next.0", "description": "Utilities used by @backstage packages to support multiple concurrent versions", "backstage": { "role": "web-library" diff --git a/plugins/api-docs-module-protoc-gen-doc/CHANGELOG.md b/plugins/api-docs-module-protoc-gen-doc/CHANGELOG.md index 7ce6311e1f..b3b852ea90 100644 --- a/plugins/api-docs-module-protoc-gen-doc/CHANGELOG.md +++ b/plugins/api-docs-module-protoc-gen-doc/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/plugin-api-docs-module-protoc-gen-doc +## 0.1.8-next.0 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. + ## 0.1.7 ### 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 1c533b7885..c3c38d7af9 100644 --- a/plugins/api-docs-module-protoc-gen-doc/package.json +++ b/plugins/api-docs-module-protoc-gen-doc/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-api-docs-module-protoc-gen-doc", - "version": "0.1.7", + "version": "0.1.8-next.0", "description": "Additional functionalities for the api-docs plugin that renders the output of the protoc-gen-doc", "backstage": { "role": "frontend-plugin-module", diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md index 4ad212412b..a0ff8b25ba 100644 --- a/plugins/api-docs/CHANGELOG.md +++ b/plugins/api-docs/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-api-docs +## 0.11.11-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-permission-react@0.4.27-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/plugin-catalog@1.24.0-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/plugin-catalog-common@1.1.0 + ## 0.11.10-next.0 ### Patch Changes diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index 79c2320563..994c8dac35 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-api-docs", - "version": "0.11.10-next.0", + "version": "0.11.11-next.1", "description": "A Backstage plugin that helps represent API entities in the frontend", "backstage": { "role": "frontend-plugin", diff --git a/plugins/app-visualizer/CHANGELOG.md b/plugins/app-visualizer/CHANGELOG.md index 239452185e..25eb942d52 100644 --- a/plugins/app-visualizer/CHANGELOG.md +++ b/plugins/app-visualizer/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-app-visualizer +## 0.1.11-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + ## 0.1.11-next.0 ### Patch Changes diff --git a/plugins/app-visualizer/package.json b/plugins/app-visualizer/package.json index e9e6568210..a23ca46189 100644 --- a/plugins/app-visualizer/package.json +++ b/plugins/app-visualizer/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app-visualizer", - "version": "0.1.11-next.0", + "version": "0.1.11-next.1", "description": "Visualizes the Backstage app structure", "backstage": { "role": "frontend-plugin", diff --git a/plugins/app/CHANGELOG.md b/plugins/app/CHANGELOG.md index 9d9775af86..ed72d7d1bc 100644 --- a/plugins/app/CHANGELOG.md +++ b/plugins/app/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-app +## 0.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-permission-react@0.4.27-next.1 + - @backstage/theme@0.5.8-next.0 + ## 0.1.1-next.0 ### Patch Changes diff --git a/plugins/app/package.json b/plugins/app/package.json index ed33051043..e135863867 100644 --- a/plugins/app/package.json +++ b/plugins/app/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app", - "version": "0.1.1-next.0", + "version": "0.1.1-next.1", "backstage": { "role": "frontend-plugin", "pluginId": "app", diff --git a/plugins/auth-react/CHANGELOG.md b/plugins/auth-react/CHANGELOG.md index f64b8fb26c..ed77363787 100644 --- a/plugins/auth-react/CHANGELOG.md +++ b/plugins/auth-react/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-auth-react +## 0.1.7-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/errors@1.2.4 + ## 0.1.7-next.0 ### Patch Changes diff --git a/plugins/auth-react/package.json b/plugins/auth-react/package.json index 5bb99f0c8d..010ae948e9 100644 --- a/plugins/auth-react/package.json +++ b/plugins/auth-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-react", - "version": "0.1.7-next.0", + "version": "0.1.7-next.1", "description": "Web library for the auth plugin", "backstage": { "role": "web-library", diff --git a/plugins/bitbucket-cloud-common/CHANGELOG.md b/plugins/bitbucket-cloud-common/CHANGELOG.md index 24884eed1a..55b3293b81 100644 --- a/plugins/bitbucket-cloud-common/CHANGELOG.md +++ b/plugins/bitbucket-cloud-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-bitbucket-cloud-common +## 0.2.24-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + ## 0.2.23 ### Patch Changes diff --git a/plugins/bitbucket-cloud-common/package.json b/plugins/bitbucket-cloud-common/package.json index 44d8f775ef..e75ce4daff 100644 --- a/plugins/bitbucket-cloud-common/package.json +++ b/plugins/bitbucket-cloud-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bitbucket-cloud-common", - "version": "0.2.23", + "version": "0.2.24-next.0", "description": "Common functionalities for bitbucket-cloud plugins", "backstage": { "role": "common-library", diff --git a/plugins/catalog-backend-module-aws/CHANGELOG.md b/plugins/catalog-backend-module-aws/CHANGELOG.md index 6a6ca89a9c..cb681f73cf 100644 --- a/plugins/catalog-backend-module-aws/CHANGELOG.md +++ b/plugins/catalog-backend-module-aws/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-backend-module-aws +## 0.4.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/integration-aws-node@0.1.12 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-node@1.13.1-next.0 + - @backstage/plugin-kubernetes-common@0.8.3 + ## 0.4.3-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json index 79257f9acd..4fc13c978f 100644 --- a/plugins/catalog-backend-module-aws/package.json +++ b/plugins/catalog-backend-module-aws/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-aws", - "version": "0.4.3-next.0", + "version": "0.4.3-next.1", "description": "A Backstage catalog backend module that helps integrate towards AWS", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-azure/CHANGELOG.md b/plugins/catalog-backend-module-azure/CHANGELOG.md index 215c06eab2..13ae485a4c 100644 --- a/plugins/catalog-backend-module-azure/CHANGELOG.md +++ b/plugins/catalog-backend-module-azure/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-azure +## 0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-node@1.13.1-next.0 + ## 0.2.3-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-azure/package.json b/plugins/catalog-backend-module-azure/package.json index 6a28c8ae81..f9079e4416 100644 --- a/plugins/catalog-backend-module-azure/package.json +++ b/plugins/catalog-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-azure", - "version": "0.2.3-next.0", + "version": "0.2.3-next.1", "description": "A Backstage catalog backend module that helps integrate towards Azure", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md index 344fda6c2a..0a55e9351a 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-catalog-backend-module-bitbucket-cloud +## 0.3.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.24-next.0 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-node@1.13.1-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + ## 0.3.3-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-cloud/package.json b/plugins/catalog-backend-module-bitbucket-cloud/package.json index 9abd0703dc..008e7c5311 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/package.json +++ b/plugins/catalog-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-cloud", - "version": "0.3.3-next.0", + "version": "0.3.3-next.1", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket Cloud", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md index dd4c51cf86..cd9972ef25 100644 --- a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-bitbucket-server +## 0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-catalog-node@1.13.1-next.0 + ## 0.2.3-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-server/package.json b/plugins/catalog-backend-module-bitbucket-server/package.json index bf4d7954a7..a8f570ae40 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.2.3-next.0", + "version": "0.2.3-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "catalog", diff --git a/plugins/catalog-backend-module-gerrit/CHANGELOG.md b/plugins/catalog-backend-module-gerrit/CHANGELOG.md index dd3555a6ee..eaf5df883d 100644 --- a/plugins/catalog-backend-module-gerrit/CHANGELOG.md +++ b/plugins/catalog-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-gerrit +## 0.2.3-next.1 + +### Patch Changes + +- 5b6edf1: Fixed an issue preventing the provider's `schedule` config from being applied." +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-catalog-node@1.13.1-next.0 + ## 0.2.3-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json index 723e7f9836..82e196278d 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.2.3-next.0", + "version": "0.2.3-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "catalog", diff --git a/plugins/catalog-backend-module-github-org/CHANGELOG.md b/plugins/catalog-backend-module-github-org/CHANGELOG.md index c39c744677..ed7fb5cd38 100644 --- a/plugins/catalog-backend-module-github-org/CHANGELOG.md +++ b/plugins/catalog-backend-module-github-org/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-github-org +## 0.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/plugin-catalog-backend-module-github@0.7.5-next.1 + - @backstage/plugin-catalog-node@1.13.1-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + ## 0.3.1-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-github-org/package.json b/plugins/catalog-backend-module-github-org/package.json index 6ee5584748..51653d6f0e 100644 --- a/plugins/catalog-backend-module-github-org/package.json +++ b/plugins/catalog-backend-module-github-org/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-github-org", - "version": "0.3.1-next.0", + "version": "0.3.2-next.1", "description": "The github-org backend module for the catalog plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-github/CHANGELOG.md b/plugins/catalog-backend-module-github/CHANGELOG.md index b2c7d359a6..b03dda2a7e 100644 --- a/plugins/catalog-backend-module-github/CHANGELOG.md +++ b/plugins/catalog-backend-module-github/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-catalog-backend-module-github +## 0.7.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.26.2-next.1 + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-node@1.13.1-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + ## 0.7.4-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json index 876deb2db8..502d35f7cb 100644 --- a/plugins/catalog-backend-module-github/package.json +++ b/plugins/catalog-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-github", - "version": "0.7.4-next.0", + "version": "0.7.5-next.1", "description": "A Backstage catalog backend module that helps integrate towards GitHub", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md b/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md index 873043659b..f65f81aee0 100644 --- a/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-backend-module-gitlab-org +## 0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/plugin-catalog-backend-module-gitlab@0.4.3-next.1 + - @backstage/plugin-catalog-node@1.13.1-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + ## 0.2.1-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitlab-org/package.json b/plugins/catalog-backend-module-gitlab-org/package.json index ac03c3f267..0bd5a5b358 100644 --- a/plugins/catalog-backend-module-gitlab-org/package.json +++ b/plugins/catalog-backend-module-gitlab-org/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gitlab-org", - "version": "0.2.1-next.0", + "version": "0.2.1-next.1", "description": "The gitlab-org backend module for the catalog plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-gitlab/CHANGELOG.md b/plugins/catalog-backend-module-gitlab/CHANGELOG.md index 97d8126847..cc9c370f78 100644 --- a/plugins/catalog-backend-module-gitlab/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-gitlab +## 0.4.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-node@1.13.1-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + ## 0.4.3-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json index ddad638848..e2238986aa 100644 --- a/plugins/catalog-backend-module-gitlab/package.json +++ b/plugins/catalog-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gitlab", - "version": "0.4.3-next.0", + "version": "0.4.3-next.1", "description": "A Backstage catalog backend module that helps integrate towards GitLab", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md index 755ec20fa2..767b059e01 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md +++ b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-incremental-ingestion +## 0.5.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.26.2-next.1 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-catalog-node@1.13.1-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + - @backstage/plugin-permission-common@0.8.1 + ## 0.5.4-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-incremental-ingestion/package.json b/plugins/catalog-backend-module-incremental-ingestion/package.json index 971f76cfef..a22819e786 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/package.json +++ b/plugins/catalog-backend-module-incremental-ingestion/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-incremental-ingestion", - "version": "0.5.4-next.0", + "version": "0.5.5-next.1", "description": "An entity provider for streaming large asset sources into the catalog", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-logs/CHANGELOG.md b/plugins/catalog-backend-module-logs/CHANGELOG.md index e546bea60f..9b5244ac2c 100644 --- a/plugins/catalog-backend-module-logs/CHANGELOG.md +++ b/plugins/catalog-backend-module-logs/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-backend-module-logs +## 0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.26.2-next.1 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + ## 0.1.1-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-logs/package.json b/plugins/catalog-backend-module-logs/package.json index af90a57ad6..2c55c62db5 100644 --- a/plugins/catalog-backend-module-logs/package.json +++ b/plugins/catalog-backend-module-logs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-logs", - "version": "0.1.1-next.0", + "version": "0.1.2-next.1", "description": "A module that subscribes to catalog releated events and logs them.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-openapi/CHANGELOG.md b/plugins/catalog-backend-module-openapi/CHANGELOG.md index 42e9d911ad..ce4b51707f 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.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.26.2-next.1 + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-node@1.13.1-next.0 + ## 0.2.1-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-openapi/package.json b/plugins/catalog-backend-module-openapi/package.json index 132496ad60..c6a22326fb 100644 --- a/plugins/catalog-backend-module-openapi/package.json +++ b/plugins/catalog-backend-module-openapi/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-openapi", - "version": "0.2.1-next.0", + "version": "0.2.2-next.1", "description": "A Backstage catalog backend module that helps with OpenAPI specifications", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend/CHANGELOG.md b/plugins/catalog-backend/CHANGELOG.md index 050b972d07..6cfef6f9f9 100644 --- a/plugins/catalog-backend/CHANGELOG.md +++ b/plugins/catalog-backend/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-catalog-backend +## 1.26.2-next.1 + +### Patch Changes + +- 62747f8: Fixed a bug where the concurrency limiter for URL reading was not honored +- 8206f49: Fix a bug where etags were expiring too soon in the URL reader +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-openapi-utils@0.1.19-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-node@1.13.1-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.4-next.0 + - @backstage/plugin-search-backend-module-catalog@0.2.3-next.1 + ## 1.26.1-next.0 ### Patch Changes diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index 1a18bfdebc..59b922b308 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend", - "version": "1.26.1-next.0", + "version": "1.26.2-next.1", "description": "The Backstage backend plugin that provides the Backstage catalog", "backstage": { "role": "backend-plugin", diff --git a/plugins/catalog-graph/CHANGELOG.md b/plugins/catalog-graph/CHANGELOG.md index 893e899b5f..37fc6c8a47 100644 --- a/plugins/catalog-graph/CHANGELOG.md +++ b/plugins/catalog-graph/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-catalog-graph +## 0.4.11-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/types@1.1.1 + ## 0.4.10-next.0 ### Patch Changes diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index c444cd755f..32f7898e2b 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-graph", - "version": "0.4.10-next.0", + "version": "0.4.11-next.1", "backstage": { "role": "frontend-plugin", "pluginId": "catalog-graph", diff --git a/plugins/catalog-import/CHANGELOG.md b/plugins/catalog-import/CHANGELOG.md index 94779c3090..e23c35845e 100644 --- a/plugins/catalog-import/CHANGELOG.md +++ b/plugins/catalog-import/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-catalog-import +## 0.12.5-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/integration-react@1.2.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/integration@1.15.1-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-catalog-common@1.1.0 + ## 0.12.4-next.0 ### Patch Changes diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index 277e259458..689055d9a2 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-import", - "version": "0.12.4-next.0", + "version": "0.12.5-next.1", "description": "A Backstage plugin the helps you import entities into your catalog", "backstage": { "role": "frontend-plugin", diff --git a/plugins/catalog-react/CHANGELOG.md b/plugins/catalog-react/CHANGELOG.md index 0a8a508060..6a68c053ab 100644 --- a/plugins/catalog-react/CHANGELOG.md +++ b/plugins/catalog-react/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-catalog-react +## 1.14.0-next.1 + +### Minor Changes + +- 6812980: Added a new prop, `disableTooltip` to the `EntityRefLink` component + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/integration-react@1.2.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-permission-react@0.4.27-next.1 + - @backstage/version-bridge@1.0.10-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-permission-common@0.8.1 + ## 1.13.1-next.0 ### Patch Changes diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index 34728f38a0..c959e22b9e 100644 --- a/plugins/catalog-react/package.json +++ b/plugins/catalog-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-react", - "version": "1.13.1-next.0", + "version": "1.14.0-next.1", "description": "A frontend library that helps other Backstage plugins interact with the catalog", "backstage": { "role": "web-library", diff --git a/plugins/catalog-unprocessed-entities/CHANGELOG.md b/plugins/catalog-unprocessed-entities/CHANGELOG.md index b55177a209..583596b119 100644 --- a/plugins/catalog-unprocessed-entities/CHANGELOG.md +++ b/plugins/catalog-unprocessed-entities/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-unprocessed-entities +## 0.2.9-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/errors@1.2.4 + ## 0.2.9-next.0 ### Patch Changes diff --git a/plugins/catalog-unprocessed-entities/package.json b/plugins/catalog-unprocessed-entities/package.json index fe7857091a..a6e034c894 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.2.9-next.0", + "version": "0.2.9-next.1", "backstage": { "role": "frontend-plugin", "pluginId": "catalog-unprocessed-entities", diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md index 8279dc3879..c11a203b84 100644 --- a/plugins/catalog/CHANGELOG.md +++ b/plugins/catalog/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-catalog +## 1.24.0-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/integration-react@1.2.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-permission-react@0.4.27-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/plugin-search-react@1.8.1-next.1 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-scaffolder-common@1.5.6 + - @backstage/plugin-search-common@1.2.14 + ## 1.24.0-next.0 ### Minor Changes diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index 1c159af6ce..e85ce75182 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog", - "version": "1.24.0-next.0", + "version": "1.24.0-next.1", "description": "The Backstage plugin for browsing the Backstage catalog", "backstage": { "role": "frontend-plugin", diff --git a/plugins/config-schema/CHANGELOG.md b/plugins/config-schema/CHANGELOG.md index a201962de3..5106f6071d 100644 --- a/plugins/config-schema/CHANGELOG.md +++ b/plugins/config-schema/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-config-schema +## 0.1.60-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + ## 0.1.60-next.0 ### Patch Changes diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json index bd29c74543..40af57c006 100644 --- a/plugins/config-schema/package.json +++ b/plugins/config-schema/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-config-schema", - "version": "0.1.60-next.0", + "version": "0.1.60-next.1", "description": "A Backstage plugin that lets you browse the configuration schema of your app", "backstage": { "role": "frontend-plugin", diff --git a/plugins/devtools/CHANGELOG.md b/plugins/devtools/CHANGELOG.md index 85011bebbb..55541f4629 100644 --- a/plugins/devtools/CHANGELOG.md +++ b/plugins/devtools/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-devtools +## 0.1.19-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-permission-react@0.4.27-next.1 + - @backstage/errors@1.2.4 + - @backstage/plugin-devtools-common@0.1.12 + ## 0.1.19-next.0 ### Patch Changes diff --git a/plugins/devtools/package.json b/plugins/devtools/package.json index 66679a712d..f5bf285ed7 100644 --- a/plugins/devtools/package.json +++ b/plugins/devtools/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools", - "version": "0.1.19-next.0", + "version": "0.1.19-next.1", "backstage": { "role": "frontend-plugin", "pluginId": "devtools", diff --git a/plugins/example-todo-list/CHANGELOG.md b/plugins/example-todo-list/CHANGELOG.md index 401fb64dc3..299d517295 100644 --- a/plugins/example-todo-list/CHANGELOG.md +++ b/plugins/example-todo-list/CHANGELOG.md @@ -1,5 +1,13 @@ # @internal/plugin-todo-list +## 1.0.32-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + ## 1.0.32-next.0 ### Patch Changes diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json index feda571385..f595447a9a 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.32-next.0", + "version": "1.0.32-next.1", "backstage": { "role": "frontend-plugin", "pluginId": "todo-list", diff --git a/plugins/home-react/CHANGELOG.md b/plugins/home-react/CHANGELOG.md index 0599b80264..e056be694e 100644 --- a/plugins/home-react/CHANGELOG.md +++ b/plugins/home-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-home-react +## 0.1.18-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + ## 0.1.18-next.0 ### Patch Changes diff --git a/plugins/home-react/package.json b/plugins/home-react/package.json index e68f20c51e..41eb8c53ec 100644 --- a/plugins/home-react/package.json +++ b/plugins/home-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-home-react", - "version": "0.1.18-next.0", + "version": "0.1.18-next.1", "description": "A Backstage plugin that contains react components helps you build a home page", "backstage": { "role": "web-library", diff --git a/plugins/home/CHANGELOG.md b/plugins/home/CHANGELOG.md index f53548001d..70af140344 100644 --- a/plugins/home/CHANGELOG.md +++ b/plugins/home/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-home +## 0.7.12-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/core-app-api@1.15.1-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/plugin-home-react@0.1.18-next.1 + - @backstage/theme@0.5.8-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + ## 0.7.11-next.0 ### Patch Changes diff --git a/plugins/home/package.json b/plugins/home/package.json index 38a12f7fcc..79147cbc5c 100644 --- a/plugins/home/package.json +++ b/plugins/home/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-home", - "version": "0.7.11-next.0", + "version": "0.7.12-next.1", "description": "A Backstage plugin that helps you build a home page", "backstage": { "role": "frontend-plugin", diff --git a/plugins/kubernetes-cluster/CHANGELOG.md b/plugins/kubernetes-cluster/CHANGELOG.md index 61ca156c8d..3ab3ed62b2 100644 --- a/plugins/kubernetes-cluster/CHANGELOG.md +++ b/plugins/kubernetes-cluster/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-kubernetes-cluster +## 0.0.17-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- 605e0bb: Updated dependency `@kubernetes-models/base` to `^5.0.0`. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-kubernetes-react@0.4.4-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/plugin-kubernetes-common@0.8.3 + ## 0.0.16-next.0 ### Patch Changes diff --git a/plugins/kubernetes-cluster/package.json b/plugins/kubernetes-cluster/package.json index 05c4bba2ed..b96abdabda 100644 --- a/plugins/kubernetes-cluster/package.json +++ b/plugins/kubernetes-cluster/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-cluster", - "version": "0.0.16-next.0", + "version": "0.0.17-next.1", "description": "A Backstage plugin that shows details of Kubernetes clusters", "backstage": { "role": "frontend-plugin", diff --git a/plugins/kubernetes-react/CHANGELOG.md b/plugins/kubernetes-react/CHANGELOG.md index bd812ce393..c42c2a5864 100644 --- a/plugins/kubernetes-react/CHANGELOG.md +++ b/plugins/kubernetes-react/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-kubernetes-react +## 0.4.4-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- 605e0bb: Updated dependency `@kubernetes-models/base` to `^5.0.0`. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-kubernetes-common@0.8.3 + ## 0.4.4-next.0 ### Patch Changes diff --git a/plugins/kubernetes-react/package.json b/plugins/kubernetes-react/package.json index 6b8f911c49..910e371d1a 100644 --- a/plugins/kubernetes-react/package.json +++ b/plugins/kubernetes-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-react", - "version": "0.4.4-next.0", + "version": "0.4.4-next.1", "description": "Web library for the kubernetes-react plugin", "backstage": { "role": "web-library", diff --git a/plugins/kubernetes/CHANGELOG.md b/plugins/kubernetes/CHANGELOG.md index 3d19fd1cb4..8d073d852e 100644 --- a/plugins/kubernetes/CHANGELOG.md +++ b/plugins/kubernetes/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-kubernetes +## 0.11.16-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- 605e0bb: Updated dependency `@kubernetes-models/base` to `^5.0.0`. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-kubernetes-react@0.4.4-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/plugin-kubernetes-common@0.8.3 + ## 0.11.15-next.0 ### Patch Changes diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index 4275db7c89..4230172199 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes", - "version": "0.11.15-next.0", + "version": "0.11.16-next.1", "description": "A Backstage plugin that integrates towards Kubernetes", "backstage": { "role": "frontend-plugin", diff --git a/plugins/notifications/CHANGELOG.md b/plugins/notifications/CHANGELOG.md index 5c70937ec8..c1cb9ee881 100644 --- a/plugins/notifications/CHANGELOG.md +++ b/plugins/notifications/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-notifications +## 0.3.2-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/plugin-signals-react@0.0.6-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/theme@0.5.8-next.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-notifications-common@0.0.5 + ## 0.3.2-next.0 ### Patch Changes diff --git a/plugins/notifications/package.json b/plugins/notifications/package.json index cb16e1cb96..9f2110afa6 100644 --- a/plugins/notifications/package.json +++ b/plugins/notifications/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications", - "version": "0.3.2-next.0", + "version": "0.3.2-next.1", "backstage": { "role": "frontend-plugin", "pluginId": "notifications", diff --git a/plugins/org-react/CHANGELOG.md b/plugins/org-react/CHANGELOG.md index 7e718f77b1..f7a00552a5 100644 --- a/plugins/org-react/CHANGELOG.md +++ b/plugins/org-react/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-org-react +## 0.1.30-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + ## 0.1.29-next.0 ### Patch Changes diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json index b96a6f8e27..17f1167e62 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.29-next.0", + "version": "0.1.30-next.1", "backstage": { "role": "web-library", "pluginId": "org", diff --git a/plugins/org/CHANGELOG.md b/plugins/org/CHANGELOG.md index cfb24ea351..675f06aaef 100644 --- a/plugins/org/CHANGELOG.md +++ b/plugins/org/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-org +## 0.6.31-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/plugin-catalog-common@1.1.0 + ## 0.6.30-next.0 ### Patch Changes diff --git a/plugins/org/package.json b/plugins/org/package.json index f44b6900da..5696ba3049 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-org", - "version": "0.6.30-next.0", + "version": "0.6.31-next.1", "description": "A Backstage plugin that helps you create entity pages for your organization", "backstage": { "role": "frontend-plugin", diff --git a/plugins/permission-react/CHANGELOG.md b/plugins/permission-react/CHANGELOG.md index 19d993863b..62990d5aba 100644 --- a/plugins/permission-react/CHANGELOG.md +++ b/plugins/permission-react/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-permission-react +## 0.4.27-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/config@1.2.0 + - @backstage/plugin-permission-common@0.8.1 + ## 0.4.27-next.0 ### Patch Changes diff --git a/plugins/permission-react/package.json b/plugins/permission-react/package.json index cf012d1ead..6eadca6553 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.27-next.0", + "version": "0.4.27-next.1", "backstage": { "role": "web-library", "pluginId": "permission", diff --git a/plugins/scaffolder-backend-module-azure/CHANGELOG.md b/plugins/scaffolder-backend-module-azure/CHANGELOG.md index e52f6fa57b..d2d429dfa6 100644 --- a/plugins/scaffolder-backend-module-azure/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-azure/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-azure +## 0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + ## 0.2.1-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-azure/package.json b/plugins/scaffolder-backend-module-azure/package.json index 4490a28fe9..25b8040455 100644 --- a/plugins/scaffolder-backend-module-azure/package.json +++ b/plugins/scaffolder-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-azure", - "version": "0.2.1-next.0", + "version": "0.2.1-next.1", "description": "The azure module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md index dc19b0d486..c05e12268e 100644 --- a/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket-cloud +## 0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-bitbucket-cloud-common@0.2.24-next.0 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + ## 0.2.1-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket-cloud/package.json b/plugins/scaffolder-backend-module-bitbucket-cloud/package.json index a75dedfdac..f4ad209a55 100644 --- a/plugins/scaffolder-backend-module-bitbucket-cloud/package.json +++ b/plugins/scaffolder-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-bitbucket-cloud", - "version": "0.2.1-next.0", + "version": "0.2.1-next.1", "description": "The Bitbucket Cloud module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md index 7c5811f46f..6fa3203732 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket-server +## 0.2.1-next.1 + +### Patch Changes + +- 66a6b45: Use protocol from Bitbucket Server apiBaseUrl config parameter instead of hard-coded https +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + ## 0.2.1-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket-server/package.json b/plugins/scaffolder-backend-module-bitbucket-server/package.json index 0773caee07..d6280041b0 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/package.json +++ b/plugins/scaffolder-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-bitbucket-server", - "version": "0.2.1-next.0", + "version": "0.2.1-next.1", "description": "The Bitbucket Server module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md index 6aa69d3d2f..eaf07be962 100644 --- a/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket +## 0.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.1-next.1 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.1-next.1 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + ## 0.3.1-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket/package.json b/plugins/scaffolder-backend-module-bitbucket/package.json index a901ca6b43..e9a4783ca7 100644 --- a/plugins/scaffolder-backend-module-bitbucket/package.json +++ b/plugins/scaffolder-backend-module-bitbucket/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-bitbucket", - "version": "0.3.1-next.0", + "version": "0.3.1-next.1", "description": "The bitbucket module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md index 5a13196f53..5c85fb8348 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-confluence-to-markdown +## 0.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + ## 0.3.1-next.0 ### 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 17a4b22d70..5f384112c5 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown", - "version": "0.3.1-next.0", + "version": "0.3.1-next.1", "description": "The confluence-to-markdown module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md index d17094098b..798839471a 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-scaffolder-backend-module-cookiecutter +## 0.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + ## 0.3.1-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index d29f2c5816..6483a7126b 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/package.json +++ b/plugins/scaffolder-backend-module-cookiecutter/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-cookiecutter", - "version": "0.3.1-next.0", + "version": "0.3.1-next.1", "description": "A module for the scaffolder backend that lets you template projects using cookiecutter", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gcp/CHANGELOG.md b/plugins/scaffolder-backend-module-gcp/CHANGELOG.md index eb55df680c..738f882067 100644 --- a/plugins/scaffolder-backend-module-gcp/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gcp/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-gcp +## 0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + ## 0.2.1-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gcp/package.json b/plugins/scaffolder-backend-module-gcp/package.json index fa14277842..d9a9dc5c25 100644 --- a/plugins/scaffolder-backend-module-gcp/package.json +++ b/plugins/scaffolder-backend-module-gcp/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gcp", - "version": "0.2.1-next.0", + "version": "0.2.1-next.1", "description": "The GCP Bucket module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md b/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md index ec7c952034..7bd80f4a73 100644 --- a/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-gerrit +## 0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + ## 0.2.1-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gerrit/package.json b/plugins/scaffolder-backend-module-gerrit/package.json index d11693405c..babb904949 100644 --- a/plugins/scaffolder-backend-module-gerrit/package.json +++ b/plugins/scaffolder-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gerrit", - "version": "0.2.1-next.0", + "version": "0.2.1-next.1", "description": "The gerrit module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gitea/CHANGELOG.md b/plugins/scaffolder-backend-module-gitea/CHANGELOG.md index c6bfad9a7d..33ad63d471 100644 --- a/plugins/scaffolder-backend-module-gitea/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gitea/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-gitea +## 0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + ## 0.2.1-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gitea/package.json b/plugins/scaffolder-backend-module-gitea/package.json index f9592cea31..03407210ec 100644 --- a/plugins/scaffolder-backend-module-gitea/package.json +++ b/plugins/scaffolder-backend-module-gitea/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gitea", - "version": "0.2.1-next.0", + "version": "0.2.1-next.1", "description": "The gitea module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-github/CHANGELOG.md b/plugins/scaffolder-backend-module-github/CHANGELOG.md index e2c84aa901..ebb3b02eb3 100644 --- a/plugins/scaffolder-backend-module-github/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-github/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-scaffolder-backend-module-github +## 0.5.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + ## 0.5.1-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-github/package.json b/plugins/scaffolder-backend-module-github/package.json index 1fd5adc05e..8cd925606a 100644 --- a/plugins/scaffolder-backend-module-github/package.json +++ b/plugins/scaffolder-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-github", - "version": "0.5.1-next.0", + "version": "0.5.1-next.1", "description": "The github module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md index c806280e50..b0b7ab2507 100644 --- a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-gitlab +## 0.5.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + ## 0.5.1-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gitlab/package.json b/plugins/scaffolder-backend-module-gitlab/package.json index 6c904c9c22..ce81ffab06 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.5.1-next.0", + "version": "0.5.1-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-backend-module-notifications/CHANGELOG.md b/plugins/scaffolder-backend-module-notifications/CHANGELOG.md index 321e730e00..3e6dc76b70 100644 --- a/plugins/scaffolder-backend-module-notifications/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-notifications/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-notifications +## 0.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/plugin-notifications-common@0.0.5 + - @backstage/plugin-notifications-node@0.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + ## 0.1.1-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-notifications/package.json b/plugins/scaffolder-backend-module-notifications/package.json index fcc270c08d..fb64c38ab4 100644 --- a/plugins/scaffolder-backend-module-notifications/package.json +++ b/plugins/scaffolder-backend-module-notifications/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-notifications", - "version": "0.1.1-next.0", + "version": "0.1.1-next.1", "description": "The notifications backend module for the scaffolder plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-rails/CHANGELOG.md b/plugins/scaffolder-backend-module-rails/CHANGELOG.md index 5cb11291bc..f8dc528377 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.5.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + ## 0.5.1-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index 972214ddaf..56cd2c0451 100644 --- a/plugins/scaffolder-backend-module-rails/package.json +++ b/plugins/scaffolder-backend-module-rails/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-rails", - "version": "0.5.1-next.0", + "version": "0.5.1-next.1", "description": "A module for the scaffolder backend that lets you template projects using Rails", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md index 67b8e75c31..b957bf620b 100644 --- a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-sentry +## 0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + ## 0.2.1-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-sentry/package.json b/plugins/scaffolder-backend-module-sentry/package.json index 85c01039ea..742e65fea1 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.2.1-next.0", + "version": "0.2.1-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md index 59fe0c8ea2..93a74ac035 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.4.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node-test-utils@0.1.13-next.1 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + ## 0.4.1-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-yeoman/package.json b/plugins/scaffolder-backend-module-yeoman/package.json index 2b9a787dee..88abb75594 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.4.1-next.0", + "version": "0.4.1-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-backend/CHANGELOG.md b/plugins/scaffolder-backend/CHANGELOG.md index ddf1bb1a8e..53d6778c45 100644 --- a/plugins/scaffolder-backend/CHANGELOG.md +++ b/plugins/scaffolder-backend/CHANGELOG.md @@ -1,5 +1,36 @@ # @backstage/plugin-scaffolder-backend +## 1.26.0-next.1 + +### Patch Changes + +- 2f90932: Include step name and step id to checkpoint key +- Updated dependencies + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/integration@1.15.1-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.1-next.1 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.24-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.1-next.0 + - @backstage/plugin-catalog-node@1.13.1-next.0 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.4-next.0 + - @backstage/plugin-scaffolder-backend-module-azure@0.2.1-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.1-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.1-next.1 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.1-next.1 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.1-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.5.1-next.1 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.5.1-next.1 + - @backstage/plugin-scaffolder-common@1.5.6 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + ## 1.26.0-next.0 ### Minor Changes diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index cc748e4e5b..16215b9519 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend", - "version": "1.26.0-next.0", + "version": "1.26.0-next.1", "description": "The Backstage backend plugin that helps you create new things", "backstage": { "role": "backend-plugin", diff --git a/plugins/scaffolder-node-test-utils/CHANGELOG.md b/plugins/scaffolder-node-test-utils/CHANGELOG.md index 18d10de230..e69db86ff6 100644 --- a/plugins/scaffolder-node-test-utils/CHANGELOG.md +++ b/plugins/scaffolder-node-test-utils/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-node-test-utils +## 0.1.13-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/backend-test-utils@1.0.1-next.1 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-node@0.5.0-next.1 + ## 0.1.13-next.0 ### Patch Changes diff --git a/plugins/scaffolder-node-test-utils/package.json b/plugins/scaffolder-node-test-utils/package.json index a372dbc317..4fa6505b01 100644 --- a/plugins/scaffolder-node-test-utils/package.json +++ b/plugins/scaffolder-node-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-node-test-utils", - "version": "0.1.13-next.0", + "version": "0.1.13-next.1", "backstage": { "role": "node-library", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-node/CHANGELOG.md b/plugins/scaffolder-node/CHANGELOG.md index 7a2ef1ab8e..bea5425aa6 100644 --- a/plugins/scaffolder-node/CHANGELOG.md +++ b/plugins/scaffolder-node/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-scaffolder-node +## 0.5.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-common@1.5.6 + ## 0.5.0-next.0 ### Minor Changes diff --git a/plugins/scaffolder-node/package.json b/plugins/scaffolder-node/package.json index 590d178beb..6b2e884443 100644 --- a/plugins/scaffolder-node/package.json +++ b/plugins/scaffolder-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-node", - "version": "0.5.0-next.0", + "version": "0.5.0-next.1", "description": "The plugin-scaffolder-node module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "node-library", diff --git a/plugins/scaffolder-react/CHANGELOG.md b/plugins/scaffolder-react/CHANGELOG.md index a18a9ae471..b74a324974 100644 --- a/plugins/scaffolder-react/CHANGELOG.md +++ b/plugins/scaffolder-react/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-scaffolder-react +## 1.13.0-next.1 + +### Minor Changes + +- d851b5b: Renamed Template Editor to Manage Templates. + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- 785d68f: Add support for pagination in scaffolder tasks list +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-permission-react@0.4.27-next.1 + - @backstage/version-bridge@1.0.10-next.0 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/theme@0.5.8-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-common@1.5.6 + ## 1.13.0-next.0 ### Minor Changes diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index 96c3907c46..7cb40529a9 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-react", - "version": "1.13.0-next.0", + "version": "1.13.0-next.1", "description": "A frontend library that helps other Backstage plugins interact with the Scaffolder", "backstage": { "role": "web-library", diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md index 2ba6b7e94a..dd7e14654d 100644 --- a/plugins/scaffolder/CHANGELOG.md +++ b/plugins/scaffolder/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-scaffolder +## 1.26.0-next.1 + +### Minor Changes + +- c433ae9: Improved the layout of the manage templates page (`/edit`) by adding icons and descriptions that better describe what each page is for. Updated the header menu to link back to the scaffolder create page. +- 7bfaf23: Text field content of the `EntityPicker` is now more readable as it uses entity title instead of entity reference. + +### Patch Changes + +- f6c15d8: Apply `defaultValue` props in `MultiEntityPicker` +- e969dc7: Move `@types/react` to a peer dependency. +- 785d68f: Add support for pagination in scaffolder tasks list +- 94a7bcd: Change "Register Existing Component" CTA to outlined as it's not a primary action on the scaffolder pages +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/integration-react@1.2.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-permission-react@0.4.27-next.1 + - @backstage/plugin-scaffolder-react@1.13.0-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/integration@1.15.1-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-scaffolder-common@1.5.6 + ## 1.26.0-next.0 ### Minor Changes diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index 01c7dacf66..ebebe9c305 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder", - "version": "1.26.0-next.0", + "version": "1.26.0-next.1", "description": "The Backstage plugin that helps you create new things", "backstage": { "role": "frontend-plugin", diff --git a/plugins/search-backend-module-catalog/CHANGELOG.md b/plugins/search-backend-module-catalog/CHANGELOG.md index d00e1d9335..45aed99219 100644 --- a/plugins/search-backend-module-catalog/CHANGELOG.md +++ b/plugins/search-backend-module-catalog/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-search-backend-module-catalog +## 0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-node@1.13.1-next.0 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-search-backend-node@1.3.3-next.1 + - @backstage/plugin-search-common@1.2.14 + ## 0.2.3-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-catalog/package.json b/plugins/search-backend-module-catalog/package.json index ff6fed6987..1909760bfc 100644 --- a/plugins/search-backend-module-catalog/package.json +++ b/plugins/search-backend-module-catalog/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-catalog", - "version": "0.2.3-next.0", + "version": "0.2.3-next.1", "description": "A module for the search backend that exports catalog modules", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-elasticsearch/CHANGELOG.md b/plugins/search-backend-module-elasticsearch/CHANGELOG.md index 5c360d54d3..392f16c6f3 100644 --- a/plugins/search-backend-module-elasticsearch/CHANGELOG.md +++ b/plugins/search-backend-module-elasticsearch/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-search-backend-module-elasticsearch +## 1.5.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/integration-aws-node@0.1.12 + - @backstage/plugin-search-backend-node@1.3.3-next.1 + - @backstage/plugin-search-common@1.2.14 + ## 1.5.7-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-elasticsearch/package.json b/plugins/search-backend-module-elasticsearch/package.json index a54779d766..45d2b9e2f0 100644 --- a/plugins/search-backend-module-elasticsearch/package.json +++ b/plugins/search-backend-module-elasticsearch/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-elasticsearch", - "version": "1.5.7-next.0", + "version": "1.5.7-next.1", "description": "A module for the search backend that implements search using ElasticSearch", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-explore/CHANGELOG.md b/plugins/search-backend-module-explore/CHANGELOG.md index 5abe14369a..7eb3293914 100644 --- a/plugins/search-backend-module-explore/CHANGELOG.md +++ b/plugins/search-backend-module-explore/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-search-backend-module-explore +## 0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/plugin-search-backend-node@1.3.3-next.1 + - @backstage/plugin-search-common@1.2.14 + ## 0.2.3-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-explore/package.json b/plugins/search-backend-module-explore/package.json index 695d86a688..937d8db489 100644 --- a/plugins/search-backend-module-explore/package.json +++ b/plugins/search-backend-module-explore/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-explore", - "version": "0.2.3-next.0", + "version": "0.2.3-next.1", "description": "A module for the search backend that exports explore modules", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-pg/CHANGELOG.md b/plugins/search-backend-module-pg/CHANGELOG.md index 25f1cd1430..72e290b251 100644 --- a/plugins/search-backend-module-pg/CHANGELOG.md +++ b/plugins/search-backend-module-pg/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-search-backend-module-pg +## 0.5.36-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/plugin-search-backend-node@1.3.3-next.1 + - @backstage/plugin-search-common@1.2.14 + ## 0.5.36-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-pg/package.json b/plugins/search-backend-module-pg/package.json index 4665bda3d4..d7c6e13699 100644 --- a/plugins/search-backend-module-pg/package.json +++ b/plugins/search-backend-module-pg/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-pg", - "version": "0.5.36-next.0", + "version": "0.5.36-next.1", "description": "A module for the search backend that implements search using PostgreSQL", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md b/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md index 781292337b..4925b66a7c 100644 --- a/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md +++ b/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-search-backend-module-stack-overflow-collator +## 0.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/plugin-search-backend-node@1.3.3-next.1 + - @backstage/plugin-search-common@1.2.14 + ## 0.3.1-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-stack-overflow-collator/package.json b/plugins/search-backend-module-stack-overflow-collator/package.json index f164f9f391..3a17add368 100644 --- a/plugins/search-backend-module-stack-overflow-collator/package.json +++ b/plugins/search-backend-module-stack-overflow-collator/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-stack-overflow-collator", - "version": "0.3.1-next.0", + "version": "0.3.1-next.1", "description": "A module for the search backend that exports stack overflow modules", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-techdocs/CHANGELOG.md b/plugins/search-backend-module-techdocs/CHANGELOG.md index 3ceae39057..869aabb60b 100644 --- a/plugins/search-backend-module-techdocs/CHANGELOG.md +++ b/plugins/search-backend-module-techdocs/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-search-backend-module-techdocs +## 0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-node@1.13.1-next.0 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-search-backend-node@1.3.3-next.1 + - @backstage/plugin-search-common@1.2.14 + - @backstage/plugin-techdocs-node@1.12.12-next.1 + ## 0.2.3-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-techdocs/package.json b/plugins/search-backend-module-techdocs/package.json index 078ab1e11f..2a2f36acb1 100644 --- a/plugins/search-backend-module-techdocs/package.json +++ b/plugins/search-backend-module-techdocs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-techdocs", - "version": "0.2.3-next.0", + "version": "0.2.3-next.1", "description": "A module for the search backend that exports techdocs modules", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-node/CHANGELOG.md b/plugins/search-backend-node/CHANGELOG.md index a27e703815..5f60cfbc96 100644 --- a/plugins/search-backend-node/CHANGELOG.md +++ b/plugins/search-backend-node/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-search-backend-node +## 1.3.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-search-common@1.2.14 + ## 1.3.3-next.0 ### Patch Changes diff --git a/plugins/search-backend-node/package.json b/plugins/search-backend-node/package.json index e6ecdf1f4e..d1f3103f1f 100644 --- a/plugins/search-backend-node/package.json +++ b/plugins/search-backend-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-node", - "version": "1.3.3-next.0", + "version": "1.3.3-next.1", "description": "A library for Backstage backend plugins that want to interact with the search backend plugin", "backstage": { "role": "node-library", diff --git a/plugins/search-backend/CHANGELOG.md b/plugins/search-backend/CHANGELOG.md index deb3409a23..91fa3998b9 100644 --- a/plugins/search-backend/CHANGELOG.md +++ b/plugins/search-backend/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-search-backend +## 1.5.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/backend-openapi-utils@0.1.19-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.4-next.0 + - @backstage/plugin-search-backend-node@1.3.3-next.1 + - @backstage/plugin-search-common@1.2.14 + ## 1.5.18-next.0 ### Patch Changes diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index d4c2e51da6..ce9fe235cd 100644 --- a/plugins/search-backend/package.json +++ b/plugins/search-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend", - "version": "1.5.18-next.0", + "version": "1.5.18-next.1", "description": "The Backstage backend plugin that provides your backstage app with search", "backstage": { "role": "backend-plugin", diff --git a/plugins/search-react/CHANGELOG.md b/plugins/search-react/CHANGELOG.md index 76e2c40e8f..06342cf847 100644 --- a/plugins/search-react/CHANGELOG.md +++ b/plugins/search-react/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-search-react +## 1.8.1-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/version-bridge@1.0.10-next.0 + - @backstage/theme@0.5.8-next.0 + - @backstage/types@1.1.1 + - @backstage/plugin-search-common@1.2.14 + ## 1.8.1-next.0 ### Patch Changes diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json index 6e942e1dbb..2bd237537c 100644 --- a/plugins/search-react/package.json +++ b/plugins/search-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-react", - "version": "1.8.1-next.0", + "version": "1.8.1-next.1", "backstage": { "role": "web-library", "pluginId": "search", diff --git a/plugins/search/CHANGELOG.md b/plugins/search/CHANGELOG.md index b0e9c1f9d6..f2caf39be2 100644 --- a/plugins/search/CHANGELOG.md +++ b/plugins/search/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-search +## 1.4.18-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/version-bridge@1.0.10-next.0 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/plugin-search-react@1.8.1-next.1 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-search-common@1.2.14 + ## 1.4.17-next.0 ### Patch Changes diff --git a/plugins/search/package.json b/plugins/search/package.json index 657ea72def..cd5a6c4d8d 100644 --- a/plugins/search/package.json +++ b/plugins/search/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search", - "version": "1.4.17-next.0", + "version": "1.4.18-next.1", "description": "The Backstage plugin that provides your backstage app with search", "backstage": { "role": "frontend-plugin", diff --git a/plugins/signals-react/CHANGELOG.md b/plugins/signals-react/CHANGELOG.md index 3cb505e301..005bc89b9b 100644 --- a/plugins/signals-react/CHANGELOG.md +++ b/plugins/signals-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-signals-react +## 0.0.6-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/types@1.1.1 + ## 0.0.6-next.0 ### Patch Changes diff --git a/plugins/signals-react/package.json b/plugins/signals-react/package.json index bd9d862fd4..94eaad39b5 100644 --- a/plugins/signals-react/package.json +++ b/plugins/signals-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-signals-react", - "version": "0.0.6-next.0", + "version": "0.0.6-next.1", "description": "Web library for the signals plugin", "backstage": { "role": "web-library", diff --git a/plugins/signals/CHANGELOG.md b/plugins/signals/CHANGELOG.md index 1e7578288d..170d241df3 100644 --- a/plugins/signals/CHANGELOG.md +++ b/plugins/signals/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-signals +## 0.0.11-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/plugin-signals-react@0.0.6-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/theme@0.5.8-next.0 + - @backstage/types@1.1.1 + ## 0.0.11-next.0 ### Patch Changes diff --git a/plugins/signals/package.json b/plugins/signals/package.json index 51913117a2..1cb2f08675 100644 --- a/plugins/signals/package.json +++ b/plugins/signals/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-signals", - "version": "0.0.11-next.0", + "version": "0.0.11-next.1", "backstage": { "role": "frontend-plugin", "pluginId": "signals", diff --git a/plugins/techdocs-addons-test-utils/CHANGELOG.md b/plugins/techdocs-addons-test-utils/CHANGELOG.md index 94323cea16..7dc37d4268 100644 --- a/plugins/techdocs-addons-test-utils/CHANGELOG.md +++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-techdocs-addons-test-utils +## 1.0.40-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/integration-react@1.2.0-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-techdocs-react@1.2.9-next.1 + - @backstage/core-app-api@1.15.1-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/plugin-search-react@1.8.1-next.1 + - @backstage/test-utils@1.6.1-next.1 + - @backstage/plugin-techdocs@1.10.11-next.1 + - @backstage/plugin-catalog@1.24.0-next.1 + ## 1.0.39-next.0 ### Patch Changes diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index 949c9addf3..d1ad8e1aa4 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.39-next.0", + "version": "1.0.40-next.1", "backstage": { "role": "web-library", "pluginId": "techdocs-addons", diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md index 53b4e27a5e..1877e692d1 100644 --- a/plugins/techdocs-backend/CHANGELOG.md +++ b/plugins/techdocs-backend/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-techdocs-backend +## 1.10.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-node@1.13.1-next.0 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-search-backend-module-techdocs@0.2.3-next.1 + - @backstage/plugin-techdocs-common@0.1.0 + - @backstage/plugin-techdocs-node@1.12.12-next.1 + ## 1.10.14-next.0 ### Patch Changes diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index d941f84e2d..8ada345404 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-backend", - "version": "1.10.14-next.0", + "version": "1.10.14-next.1", "description": "The Backstage backend plugin that renders technical documentation for your components", "backstage": { "role": "backend-plugin", diff --git a/plugins/techdocs-module-addons-contrib/CHANGELOG.md b/plugins/techdocs-module-addons-contrib/CHANGELOG.md index 603a91278e..cfea67be77 100644 --- a/plugins/techdocs-module-addons-contrib/CHANGELOG.md +++ b/plugins/techdocs-module-addons-contrib/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-techdocs-module-addons-contrib +## 1.1.16-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/integration-react@1.2.0-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-techdocs-react@1.2.9-next.1 + - @backstage/integration@1.15.1-next.0 + ## 1.1.15-next.0 ### Patch Changes diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index 951bd8f432..2d239014dc 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-module-addons-contrib", - "version": "1.1.15-next.0", + "version": "1.1.16-next.1", "description": "Plugin module for contributed TechDocs Addons", "backstage": { "role": "frontend-plugin-module", diff --git a/plugins/techdocs-node/CHANGELOG.md b/plugins/techdocs-node/CHANGELOG.md index 4f68e735f8..a6a928f533 100644 --- a/plugins/techdocs-node/CHANGELOG.md +++ b/plugins/techdocs-node/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-techdocs-node +## 1.12.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/integration-aws-node@0.1.12 + - @backstage/plugin-search-common@1.2.14 + - @backstage/plugin-techdocs-common@0.1.0 + ## 1.12.12-next.0 ### Patch Changes diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index e807b7abb0..a66c34935e 100644 --- a/plugins/techdocs-node/package.json +++ b/plugins/techdocs-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-node", - "version": "1.12.12-next.0", + "version": "1.12.12-next.1", "description": "Common node.js functionalities for TechDocs, to be shared between techdocs-backend plugin and techdocs-cli", "backstage": { "role": "node-library", diff --git a/plugins/techdocs-react/CHANGELOG.md b/plugins/techdocs-react/CHANGELOG.md index 88e73fd070..b82b929f5b 100644 --- a/plugins/techdocs-react/CHANGELOG.md +++ b/plugins/techdocs-react/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-techdocs-react +## 1.2.9-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/version-bridge@1.0.10-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + ## 1.2.9-next.0 ### Patch Changes diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json index 370c1ff110..2f4e7ea31b 100644 --- a/plugins/techdocs-react/package.json +++ b/plugins/techdocs-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-react", - "version": "1.2.9-next.0", + "version": "1.2.9-next.1", "description": "Shared frontend utilities for TechDocs and Addons", "backstage": { "role": "web-library", diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md index 044ede047d..e828503443 100644 --- a/plugins/techdocs/CHANGELOG.md +++ b/plugins/techdocs/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-techdocs +## 1.10.11-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/integration-react@1.2.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-techdocs-react@1.2.9-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/plugin-search-react@1.8.1-next.1 + - @backstage/plugin-auth-react@0.1.7-next.1 + - @backstage/theme@0.5.8-next.0 + - @backstage/integration@1.15.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-search-common@1.2.14 + - @backstage/plugin-techdocs-common@0.1.0 + ## 1.10.10-next.0 ### Patch Changes diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index 8fe9b71c1c..64945f6796 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs", - "version": "1.10.10-next.0", + "version": "1.10.11-next.1", "description": "The Backstage plugin that renders technical documentation for your components", "backstage": { "role": "frontend-plugin", diff --git a/plugins/user-settings-backend/CHANGELOG.md b/plugins/user-settings-backend/CHANGELOG.md index 813b94a21a..611b67ad38 100644 --- a/plugins/user-settings-backend/CHANGELOG.md +++ b/plugins/user-settings-backend/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-user-settings-backend +## 0.2.25-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/plugin-signals-node@0.1.12-next.0 + - @backstage/plugin-user-settings-common@0.0.1 + ## 0.2.25-next.0 ### Patch Changes diff --git a/plugins/user-settings-backend/package.json b/plugins/user-settings-backend/package.json index 88c7533b11..595ec64f53 100644 --- a/plugins/user-settings-backend/package.json +++ b/plugins/user-settings-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-user-settings-backend", - "version": "0.2.25-next.0", + "version": "0.2.25-next.1", "description": "The Backstage backend plugin to manage user settings", "backstage": { "role": "backend-plugin", diff --git a/plugins/user-settings/CHANGELOG.md b/plugins/user-settings/CHANGELOG.md index de1d1b4210..43501258d2 100644 --- a/plugins/user-settings/CHANGELOG.md +++ b/plugins/user-settings/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-user-settings +## 0.8.14-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/plugin-signals-react@0.0.6-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/core-app-api@1.15.1-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/theme@0.5.8-next.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-user-settings-common@0.0.1 + ## 0.8.13-next.0 ### Patch Changes diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index 5322e813fa..842ea63d19 100644 --- a/plugins/user-settings/package.json +++ b/plugins/user-settings/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-user-settings", - "version": "0.8.13-next.0", + "version": "0.8.14-next.1", "description": "A Backstage plugin that provides a settings page", "backstage": { "role": "frontend-plugin", diff --git a/yarn.lock b/yarn.lock index 11bbcb2240..93d7efa51d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4752,7 +4752,24 @@ __metadata: languageName: unknown linkType: soft -"@backstage/integration@^1.15.0, @backstage/integration@workspace:^, @backstage/integration@workspace:packages/integration": +"@backstage/integration@npm:^1.15.0": + version: 1.15.0 + resolution: "@backstage/integration@npm:1.15.0" + dependencies: + "@azure/identity": ^4.0.0 + "@backstage/config": ^1.2.0 + "@backstage/errors": ^1.2.4 + "@octokit/auth-app": ^4.0.0 + "@octokit/rest": ^19.0.3 + cross-fetch: ^4.0.0 + git-url-parse: ^14.0.0 + lodash: ^4.17.21 + luxon: ^3.0.0 + checksum: a2c5b51b1403341f56fe91bd53a1105875855642927b95277c3e8ea29d604b718c39984fd2b8cd298d6206d1f23718da10dbbb53f4ec6eb74b296e6621fc4b7e + languageName: node + linkType: hard + +"@backstage/integration@workspace:^, @backstage/integration@workspace:packages/integration": version: 0.0.0-use.local resolution: "@backstage/integration@workspace:packages/integration" dependencies: @@ -8556,7 +8573,23 @@ __metadata: languageName: unknown linkType: soft -"@backstage/theme@^0.5.0, @backstage/theme@^0.5.7, @backstage/theme@workspace:^, @backstage/theme@workspace:packages/theme": +"@backstage/theme@npm:^0.5.0, @backstage/theme@npm:^0.5.7": + version: 0.5.7 + resolution: "@backstage/theme@npm:0.5.7" + 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 || ^18.0.0 + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 + checksum: 5a315a198481f7b0c6f1a11bc102c36d2976cae25184ce6e28e6e44ce4a742e4d4416f19c71ac44f574a2745e30d13508a6c152f00e1facdef9c9d12dc3d0449 + languageName: node + linkType: hard + +"@backstage/theme@workspace:^, @backstage/theme@workspace:packages/theme": version: 0.0.0-use.local resolution: "@backstage/theme@workspace:packages/theme" dependencies: @@ -8594,7 +8627,20 @@ __metadata: languageName: unknown linkType: soft -"@backstage/version-bridge@^1.0.7, @backstage/version-bridge@^1.0.9, @backstage/version-bridge@workspace:^, @backstage/version-bridge@workspace:packages/version-bridge": +"@backstage/version-bridge@npm:^1.0.7, @backstage/version-bridge@npm:^1.0.9": + version: 1.0.9 + resolution: "@backstage/version-bridge@npm:1.0.9" + dependencies: + "@types/react": ^16.13.1 || ^17.0.0 + peerDependencies: + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 + checksum: eb805a747c66a9c78654109d6774d5a7c16175240fe9441c71800d7b2b9965e6e04960af902cbaf4fc9eb15e9c665888cf6e1b7c4e4f157c8617873999545c0f + languageName: node + linkType: hard + +"@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: From b1c2a2dbafa955f0f169b4a916f2ea1cb8b2d17c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 1 Oct 2024 11:41:51 +0200 Subject: [PATCH 084/217] exclude the data-grid package from the imports rule MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/eight-clocks-complain.md | 5 +++++ .../rules/no-top-level-material-ui-4-imports.js | 2 ++ .../src/no-top-level-material-ui-4-imports.test.ts | 3 +++ 3 files changed, 10 insertions(+) create mode 100644 .changeset/eight-clocks-complain.md diff --git a/.changeset/eight-clocks-complain.md b/.changeset/eight-clocks-complain.md new file mode 100644 index 0000000000..b7044481ac --- /dev/null +++ b/.changeset/eight-clocks-complain.md @@ -0,0 +1,5 @@ +--- +'@backstage/eslint-plugin': patch +--- + +Exclude `@material-ui/data-grid` diff --git a/packages/eslint-plugin/rules/no-top-level-material-ui-4-imports.js b/packages/eslint-plugin/rules/no-top-level-material-ui-4-imports.js index 78fd3d63e9..d8e7ff35fe 100644 --- a/packages/eslint-plugin/rules/no-top-level-material-ui-4-imports.js +++ b/packages/eslint-plugin/rules/no-top-level-material-ui-4-imports.js @@ -132,6 +132,8 @@ module.exports = { if (!node.source.value.startsWith('@material-ui/')) return; // Return if import is from '@material-ui/core/styles', as it's valid already if (node.source.value === '@material-ui/core/styles') return; + // Ignore the @material-ui/data-grid library which shares this namespace + if (node.source.value === '@material-ui/data-grid') return; // Return if proper import eg. `import Box from '@material-ui/core/Box'` // Or if third level or deeper imports if (node.source.value?.split('/').length >= 3) return; diff --git a/packages/eslint-plugin/src/no-top-level-material-ui-4-imports.test.ts b/packages/eslint-plugin/src/no-top-level-material-ui-4-imports.test.ts index 4b675bd038..cbd9f918e4 100644 --- a/packages/eslint-plugin/src/no-top-level-material-ui-4-imports.test.ts +++ b/packages/eslint-plugin/src/no-top-level-material-ui-4-imports.test.ts @@ -47,6 +47,9 @@ ruleTester.run('path-imports-rule', rule, { { code: `import { CreateCSSProperties, StyledComponentProps } from '@material-ui/core/styles/withStyles';`, }, + { + code: `import { DataGrid, GridColDef, GridValueGetterParams } from '@material-ui/data-grid';`, + }, ], invalid: [ { From b1254b40a8b78782acc4ecace2e118b8362f3b75 Mon Sep 17 00:00:00 2001 From: Eric Peterson Date: Tue, 1 Oct 2024 12:57:15 +0200 Subject: [PATCH 085/217] Add root lifecycle shutdown hook to clean up DB connections Signed-off-by: Eric Peterson --- .../entrypoints/database/DatabaseManager.ts | 28 +++++++++++++++++++ .../database/databaseServiceFactory.ts | 12 ++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/packages/backend-defaults/src/entrypoints/database/DatabaseManager.ts b/packages/backend-defaults/src/entrypoints/database/DatabaseManager.ts index 46d4ee8cf7..6ed5545d35 100644 --- a/packages/backend-defaults/src/entrypoints/database/DatabaseManager.ts +++ b/packages/backend-defaults/src/entrypoints/database/DatabaseManager.ts @@ -89,6 +89,27 @@ export class DatabaseManagerImpl { return { getClient, migrations: { skip } }; } + /** + * Method to be called during shutdown to destroy all known connections. + */ + async shutdown(deps: { logger: LoggerService }): Promise { + const pluginIds = Array.from(this.databaseCache.keys()); + await Promise.all( + pluginIds.map(async pluginId => { + const connection = await this.databaseCache.get(pluginId); + if (connection) { + await connection.destroy().catch((error: unknown) => { + deps.logger.error( + `Problem closing database connection for ${pluginId}: ${stringifyError( + error, + )}`, + ); + }); + } + }), + ); + } + /** * Provides the client type which should be used for a given plugin. * @@ -236,4 +257,11 @@ export class DatabaseManager { ): PluginDatabaseManager { return this.impl.forPlugin(pluginId, deps); } + + /** + * Method to be called during shutdown to destroy all known connections. + */ + async shutdown(deps: { logger: LoggerService }): Promise { + return this.impl.shutdown(deps); + } } diff --git a/packages/backend-defaults/src/entrypoints/database/databaseServiceFactory.ts b/packages/backend-defaults/src/entrypoints/database/databaseServiceFactory.ts index 167779e807..5e23e6ac4c 100644 --- a/packages/backend-defaults/src/entrypoints/database/databaseServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/database/databaseServiceFactory.ts @@ -37,9 +37,11 @@ export const databaseServiceFactory = createServiceFactory({ lifecycle: coreServices.lifecycle, logger: coreServices.logger, pluginMetadata: coreServices.pluginMetadata, + rootLifecycle: coreServices.rootLifecycle, + rootLogger: coreServices.rootLogger, }, - async createRootContext({ config }) { - return config.getOptional('backend.database') + async createRootContext({ config, rootLifecycle, rootLogger }) { + const databaseManager = config.getOptional('backend.database') ? DatabaseManager.fromConfig(config) : DatabaseManager.fromConfig( new ConfigReader({ @@ -48,6 +50,12 @@ export const databaseServiceFactory = createServiceFactory({ }, }), ); + + rootLifecycle.addShutdownHook(async () => { + await databaseManager.shutdown({ logger: rootLogger }); + }); + + return databaseManager; }, async factory({ pluginMetadata, lifecycle, logger }, databaseManager) { return databaseManager.forPlugin(pluginMetadata.getId(), { From 8bfe9f0f61aad548b6d129610b05b56aa9f93f2b Mon Sep 17 00:00:00 2001 From: Eric Peterson Date: Tue, 1 Oct 2024 12:57:43 +0200 Subject: [PATCH 086/217] Ensure root lifecycle shutdown hooks happen after plugins' Signed-off-by: Eric Peterson --- .../src/wiring/BackendInitializer.ts | 24 ++++++++- .../lifecycle/lifecycleServiceFactory.ts | 51 +++++++++++++++---- 2 files changed, 63 insertions(+), 12 deletions(-) diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.ts b/packages/backend-app-api/src/wiring/BackendInitializer.ts index 86771fbb74..e580109987 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.ts @@ -407,6 +407,26 @@ export class BackendInitializer { // The startup failed, but we may still want to do cleanup so we continue silently } + // Get all plugins. + const pluginMap = new Map(); + for (const feature of this.#registrations) { + for (const r of feature.getRegistrations()) { + if (r.type === 'plugin') { + pluginMap.set(r.pluginId, true); + } + } + } + const allPluginIds = Array.from(pluginMap.keys()); + + // Iterate through all plugins and run their shutdown hooks. + await Promise.allSettled( + allPluginIds.map(async pluginId => { + const lifecycleService = await this.#getPluginLifecycleImpl(pluginId); + await lifecycleService.shutdown(); + }), + ); + + // Once all plugin shutdown hooks are done, run root shutdown hooks. const lifecycleService = await this.#getRootLifecycleImpl(); await lifecycleService.shutdown(); } @@ -437,7 +457,9 @@ export class BackendInitializer { async #getPluginLifecycleImpl( pluginId: string, - ): Promise }> { + ): Promise< + LifecycleService & { startup(): Promise; shutdown(): Promise } + > { const lifecycleService = await this.#serviceRegistry.get( coreServices.lifecycle, pluginId, diff --git a/packages/backend-defaults/src/entrypoints/lifecycle/lifecycleServiceFactory.ts b/packages/backend-defaults/src/entrypoints/lifecycle/lifecycleServiceFactory.ts index 192886ca61..02195d0cd0 100644 --- a/packages/backend-defaults/src/entrypoints/lifecycle/lifecycleServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/lifecycle/lifecycleServiceFactory.ts @@ -22,7 +22,6 @@ import { LifecycleServiceStartupOptions, LoggerService, PluginMetadataService, - RootLifecycleService, coreServices, createServiceFactory, } from '@backstage/backend-plugin-api'; @@ -31,15 +30,19 @@ import { export class BackendPluginLifecycleImpl implements LifecycleService { constructor( private readonly logger: LoggerService, - private readonly rootLifecycle: RootLifecycleService, private readonly pluginMetadata: PluginMetadataService, ) {} #hasStarted = false; + #hasShutdown = false; #startupTasks: Array<{ hook: LifecycleServiceStartupHook; options?: LifecycleServiceStartupOptions; }> = []; + #shutdownTasks: Array<{ + hook: LifecycleServiceShutdownHook; + options?: LifecycleServiceShutdownOptions; + }> = []; addStartupHook( hook: LifecycleServiceStartupHook, @@ -77,11 +80,42 @@ export class BackendPluginLifecycleImpl implements LifecycleService { hook: LifecycleServiceShutdownHook, options?: LifecycleServiceShutdownOptions, ): void { + if (this.#hasShutdown) { + throw new Error('Attempted to add shutdown hook after shutdown'); + } const plugin = this.pluginMetadata.getId(); - this.rootLifecycle.addShutdownHook(hook, { - logger: options?.logger?.child({ plugin }) ?? this.logger, + const logger = options?.logger?.child({ plugin }) ?? this.logger; + this.#shutdownTasks.push({ + hook, + options: { + ...options, + logger, + }, }); } + + async shutdown(): Promise { + if (this.#hasShutdown) { + return; + } + this.#hasShutdown = true; + + this.logger.debug( + `Running ${this.#shutdownTasks.length} plugin shutdown tasks...`, + ); + + await Promise.all( + this.#shutdownTasks.map(async ({ hook, options }) => { + const logger = options?.logger ?? this.logger; + try { + await hook(); + logger.debug(`Plugin shutdown hook succeeded`); + } catch (error) { + logger.error(`Plugin shutdown hook failed, ${error}`); + } + }), + ); + } } /** @@ -97,14 +131,9 @@ export const lifecycleServiceFactory = createServiceFactory({ service: coreServices.lifecycle, deps: { logger: coreServices.logger, - rootLifecycle: coreServices.rootLifecycle, pluginMetadata: coreServices.pluginMetadata, }, - async factory({ rootLifecycle, logger, pluginMetadata }) { - return new BackendPluginLifecycleImpl( - logger, - rootLifecycle, - pluginMetadata, - ); + async factory({ logger, pluginMetadata }) { + return new BackendPluginLifecycleImpl(logger, pluginMetadata); }, }); From 1aaaf7033705b1199be90f3b3c9586a412171e49 Mon Sep 17 00:00:00 2001 From: Eric Peterson Date: Tue, 1 Oct 2024 14:10:16 +0200 Subject: [PATCH 087/217] Minor cleanup based on feedback. Signed-off-by: Eric Peterson --- .../src/wiring/BackendInitializer.ts | 13 ++++++++----- .../src/entrypoints/database/DatabaseManager.ts | 2 +- .../lifecycle/lifecycleServiceFactory.ts | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.ts b/packages/backend-app-api/src/wiring/BackendInitializer.ts index e580109987..3ea1200898 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.ts @@ -408,19 +408,18 @@ export class BackendInitializer { } // Get all plugins. - const pluginMap = new Map(); + const allPlugins = new Set(); for (const feature of this.#registrations) { for (const r of feature.getRegistrations()) { if (r.type === 'plugin') { - pluginMap.set(r.pluginId, true); + allPlugins.add(r.pluginId); } } } - const allPluginIds = Array.from(pluginMap.keys()); // Iterate through all plugins and run their shutdown hooks. await Promise.allSettled( - allPluginIds.map(async pluginId => { + [...allPlugins].map(async pluginId => { const lifecycleService = await this.#getPluginLifecycleImpl(pluginId); await lifecycleService.shutdown(); }), @@ -466,7 +465,11 @@ export class BackendInitializer { ); const service = lifecycleService as any; - if (service && typeof service.startup === 'function') { + if ( + service && + typeof service.startup === 'function' && + typeof service.shutdown === 'function' + ) { return service; } diff --git a/packages/backend-defaults/src/entrypoints/database/DatabaseManager.ts b/packages/backend-defaults/src/entrypoints/database/DatabaseManager.ts index 6ed5545d35..ff95c0562a 100644 --- a/packages/backend-defaults/src/entrypoints/database/DatabaseManager.ts +++ b/packages/backend-defaults/src/entrypoints/database/DatabaseManager.ts @@ -94,7 +94,7 @@ export class DatabaseManagerImpl { */ async shutdown(deps: { logger: LoggerService }): Promise { const pluginIds = Array.from(this.databaseCache.keys()); - await Promise.all( + await Promise.allSettled( pluginIds.map(async pluginId => { const connection = await this.databaseCache.get(pluginId); if (connection) { diff --git a/packages/backend-defaults/src/entrypoints/lifecycle/lifecycleServiceFactory.ts b/packages/backend-defaults/src/entrypoints/lifecycle/lifecycleServiceFactory.ts index 02195d0cd0..0ba812f5b4 100644 --- a/packages/backend-defaults/src/entrypoints/lifecycle/lifecycleServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/lifecycle/lifecycleServiceFactory.ts @@ -111,7 +111,7 @@ export class BackendPluginLifecycleImpl implements LifecycleService { await hook(); logger.debug(`Plugin shutdown hook succeeded`); } catch (error) { - logger.error(`Plugin shutdown hook failed, ${error}`); + logger.error('Plugin shutdown hook failed', error); } }), ); From 8fa3ec895fd6d6d6c8bb5eca73b9f4a87791caaf Mon Sep 17 00:00:00 2001 From: Eric Peterson Date: Tue, 1 Oct 2024 14:23:22 +0200 Subject: [PATCH 088/217] Refactor DB Manager shutdown to be private Signed-off-by: Eric Peterson --- .../entrypoints/database/DatabaseManager.ts | 27 +++++++++++-------- .../database/databaseServiceFactory.ts | 11 +++----- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/backend-defaults/src/entrypoints/database/DatabaseManager.ts b/packages/backend-defaults/src/entrypoints/database/DatabaseManager.ts index ff95c0562a..9441c8bca9 100644 --- a/packages/backend-defaults/src/entrypoints/database/DatabaseManager.ts +++ b/packages/backend-defaults/src/entrypoints/database/DatabaseManager.ts @@ -19,6 +19,8 @@ import { LifecycleService, LoggerService, RootConfigService, + RootLifecycleService, + RootLoggerService, } from '@backstage/backend-plugin-api'; import { Config } from '@backstage/config'; import { stringifyError } from '@backstage/errors'; @@ -42,6 +44,8 @@ function pluginPath(pluginId: string): string { */ export type DatabaseManagerOptions = { migrations?: DatabaseService['migrations']; + rootLogger?: RootLoggerService; + rootLifecycle?: RootLifecycleService; }; /** @@ -53,7 +57,15 @@ export class DatabaseManagerImpl { private readonly connectors: Record, private readonly options?: DatabaseManagerOptions, private readonly databaseCache: Map> = new Map(), - ) {} + ) { + // If a rootLifecycle service was provided, register a shutdown hook to + // clean up any database connections. + if (options?.rootLifecycle !== undefined) { + options.rootLifecycle.addShutdownHook(async () => { + await this.shutdown({ logger: options.rootLogger }); + }); + } + } /** * Generates a PluginDatabaseManager for consumption by plugins. @@ -90,16 +102,16 @@ export class DatabaseManagerImpl { } /** - * Method to be called during shutdown to destroy all known connections. + * Destroys all known connections. */ - async shutdown(deps: { logger: LoggerService }): Promise { + private async shutdown(deps?: { logger?: LoggerService }): Promise { const pluginIds = Array.from(this.databaseCache.keys()); await Promise.allSettled( pluginIds.map(async pluginId => { const connection = await this.databaseCache.get(pluginId); if (connection) { await connection.destroy().catch((error: unknown) => { - deps.logger.error( + deps?.logger?.error( `Problem closing database connection for ${pluginId}: ${stringifyError( error, )}`, @@ -257,11 +269,4 @@ export class DatabaseManager { ): PluginDatabaseManager { return this.impl.forPlugin(pluginId, deps); } - - /** - * Method to be called during shutdown to destroy all known connections. - */ - async shutdown(deps: { logger: LoggerService }): Promise { - return this.impl.shutdown(deps); - } } diff --git a/packages/backend-defaults/src/entrypoints/database/databaseServiceFactory.ts b/packages/backend-defaults/src/entrypoints/database/databaseServiceFactory.ts index 5e23e6ac4c..525830471b 100644 --- a/packages/backend-defaults/src/entrypoints/database/databaseServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/database/databaseServiceFactory.ts @@ -41,21 +41,16 @@ export const databaseServiceFactory = createServiceFactory({ rootLogger: coreServices.rootLogger, }, async createRootContext({ config, rootLifecycle, rootLogger }) { - const databaseManager = config.getOptional('backend.database') - ? DatabaseManager.fromConfig(config) + return config.getOptional('backend.database') + ? DatabaseManager.fromConfig(config, { rootLifecycle, rootLogger }) : DatabaseManager.fromConfig( new ConfigReader({ backend: { database: { client: 'better-sqlite3', connection: ':memory:' }, }, }), + { rootLifecycle, rootLogger }, ); - - rootLifecycle.addShutdownHook(async () => { - await databaseManager.shutdown({ logger: rootLogger }); - }); - - return databaseManager; }, async factory({ pluginMetadata, lifecycle, logger }, databaseManager) { return databaseManager.forPlugin(pluginMetadata.getId(), { From f989c47e633a938ab742f3ae3ff0ca0ac0560b8c Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Fri, 27 Sep 2024 15:39:33 +0200 Subject: [PATCH 089/217] feat: add translation to editor toolbar Signed-off-by: Camila Belo --- .changeset/poor-dodos-wait.md | 5 +++ plugins/scaffolder/report-alpha.api.md | 10 +++++ .../TemplateEditorToolbar.tsx | 44 +++++++++++++------ plugins/scaffolder/src/translation.ts | 19 ++++++++ 4 files changed, 64 insertions(+), 14 deletions(-) create mode 100644 .changeset/poor-dodos-wait.md diff --git a/.changeset/poor-dodos-wait.md b/.changeset/poor-dodos-wait.md new file mode 100644 index 0000000000..f1d0b4e941 --- /dev/null +++ b/.changeset/poor-dodos-wait.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': patch +--- + +Add translation to the editor toolbar component. diff --git a/plugins/scaffolder/report-alpha.api.md b/plugins/scaffolder/report-alpha.api.md index 2a90efc0ba..4abaab2898 100644 --- a/plugins/scaffolder/report-alpha.api.md +++ b/plugins/scaffolder/report-alpha.api.md @@ -321,6 +321,16 @@ export const scaffolderTranslationRef: TranslationRef< readonly 'templateWizardPage.subtitle': 'Create new software components using standard templates in your organization'; readonly 'templateWizardPage.pageTitle': 'Create a new component'; readonly 'templateWizardPage.pageContextMenu.editConfigurationTitle': 'Edit Configuration'; + readonly 'templateEditorToolbar.customFieldExplorerTooltip': 'Custom Fields Explorer'; + readonly 'templateEditorToolbar.installedActionsDocumentationTooltip': 'Installed Actions Documentation'; + readonly 'templateEditorToolbar.addToCatalogButton': 'Publish'; + readonly 'templateEditorToolbar.addToCatalogDialogTitle': 'Publish changes'; + readonly 'templateEditorToolbar.addToCatalogDialogContent.introduction': 'Follow the instructions below to create or update a template:'; + readonly 'templateEditorToolbar.addToCatalogDialogContent.step1': 'Save the template files in a local directory'; + readonly 'templateEditorToolbar.addToCatalogDialogContent.step2': 'Create a pull request to a new or existing git repository'; + readonly 'templateEditorToolbar.addToCatalogDialogContent.step3': 'If the template already exists, the changes will be reflected in the software catalog once the pull request gets merged'; + readonly 'templateEditorToolbar.addToCatalogDialogContent.step4': 'But if you are creating a new template, follow the documentation linked below to register the new template repository in software catalog'; + readonly 'templateEditorToolbar.addToCatalogDialogActions.closeButton': 'Close'; } >; diff --git a/plugins/scaffolder/src/alpha/components/TemplateEditorPage/TemplateEditorToolbar.tsx b/plugins/scaffolder/src/alpha/components/TemplateEditorPage/TemplateEditorToolbar.tsx index a33915ae01..0d78bd675c 100644 --- a/plugins/scaffolder/src/alpha/components/TemplateEditorPage/TemplateEditorToolbar.tsx +++ b/plugins/scaffolder/src/alpha/components/TemplateEditorPage/TemplateEditorToolbar.tsx @@ -36,6 +36,8 @@ import { FieldExtensionOptions } from '@backstage/plugin-scaffolder-react'; import { ActionPageContent } from '../../../components/ActionsPage/ActionsPage'; import { CustomFieldPlaygroud } from './CustomFieldPlaygroud'; +import { useTranslationRef } from '@backstage/frontend-plugin-api'; +import { scaffolderTranslationRef } from '../../../translation'; const useStyles = makeStyles( theme => ({ @@ -73,6 +75,7 @@ export function TemplateEditorToolbar(props: { }) { const { children, fieldExtensions } = props; const classes = useStyles(); + const { t } = useTranslationRef(scaffolderTranslationRef); const [showFieldsDrawer, setShowFieldsDrawer] = useState(false); const [showActionsDrawer, setShowActionsDrawer] = useState(false); const [showPublishModal, setShowPublishModal] = useState(false); @@ -86,17 +89,25 @@ export function TemplateEditorToolbar(props: { variant="outlined" color="primary" > - + - + - + - Publish changes + + {t('templateEditorToolbar.addToCatalogDialogTitle')} + - Follow the instructions below to create or update a template: + {t( + 'templateEditorToolbar.addToCatalogDialogContent.introduction', + )}
      -
    1. Save the template files in a local directory
    2. - Create a pull request to a new or existing git repository + {t('templateEditorToolbar.addToCatalogDialogContent.step1')}
    3. - If the template already exists, the changes will be reflected - in the software catalog once the pull request gets merged + {t('templateEditorToolbar.addToCatalogDialogContent.step2')}
    4. - But if you are creating a new template, follow this{' '} + {t('templateEditorToolbar.addToCatalogDialogContent.step3')} +
    5. +
    6. + {t('templateEditorToolbar.addToCatalogDialogContent.step4')} +
      - documentation - {' '} - to register the new template repository in software catalog + https://backstage.io/docs/features/software-templates/adding-templates/ +
    diff --git a/plugins/scaffolder/src/translation.ts b/plugins/scaffolder/src/translation.ts index 11c13194ce..72fc76e497 100644 --- a/plugins/scaffolder/src/translation.ts +++ b/plugins/scaffolder/src/translation.ts @@ -298,5 +298,24 @@ export const scaffolderTranslationRef = createTranslationRef({ editConfigurationTitle: 'Edit Configuration', }, }, + templateEditorToolbar: { + customFieldExplorerTooltip: 'Custom Fields Explorer', + installedActionsDocumentationTooltip: 'Installed Actions Documentation', + addToCatalogButton: 'Publish', + addToCatalogDialogTitle: 'Publish changes', + addToCatalogDialogContent: { + introduction: + 'Follow the instructions below to create or update a template:', + step1: 'Save the template files in a local directory', + step2: 'Create a pull request to a new or existing git repository', + step3: + 'If the template already exists, the changes will be reflected in the software catalog once the pull request gets merged', + step4: + 'But if you are creating a new template, follow the documentation linked below to register the new template repository in software catalog', + }, + addToCatalogDialogActions: { + closeButton: 'Close', + }, + }, }, }); From 8f52640e5423c62bb1105a2a8816aeb5545126ff Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Tue, 1 Oct 2024 14:25:59 +0200 Subject: [PATCH 090/217] refactor: apply review suggestions Signed-off-by: Camila Belo --- plugins/scaffolder/report-alpha.api.md | 10 ++--- .../TemplateEditorToolbar.tsx | 42 +++++++++---------- plugins/scaffolder/src/translation.ts | 14 +++---- 3 files changed, 30 insertions(+), 36 deletions(-) diff --git a/plugins/scaffolder/report-alpha.api.md b/plugins/scaffolder/report-alpha.api.md index 4abaab2898..8d0abc262f 100644 --- a/plugins/scaffolder/report-alpha.api.md +++ b/plugins/scaffolder/report-alpha.api.md @@ -325,12 +325,10 @@ export const scaffolderTranslationRef: TranslationRef< readonly 'templateEditorToolbar.installedActionsDocumentationTooltip': 'Installed Actions Documentation'; readonly 'templateEditorToolbar.addToCatalogButton': 'Publish'; readonly 'templateEditorToolbar.addToCatalogDialogTitle': 'Publish changes'; - readonly 'templateEditorToolbar.addToCatalogDialogContent.introduction': 'Follow the instructions below to create or update a template:'; - readonly 'templateEditorToolbar.addToCatalogDialogContent.step1': 'Save the template files in a local directory'; - readonly 'templateEditorToolbar.addToCatalogDialogContent.step2': 'Create a pull request to a new or existing git repository'; - readonly 'templateEditorToolbar.addToCatalogDialogContent.step3': 'If the template already exists, the changes will be reflected in the software catalog once the pull request gets merged'; - readonly 'templateEditorToolbar.addToCatalogDialogContent.step4': 'But if you are creating a new template, follow the documentation linked below to register the new template repository in software catalog'; - readonly 'templateEditorToolbar.addToCatalogDialogActions.closeButton': 'Close'; + readonly 'templateEditorToolbar.addToCatalogDialogContent.stepsIntroduction': 'Follow the instructions below to create or update a template:'; + readonly 'templateEditorToolbar.addToCatalogDialogContent.stepsListItems': 'Save the template files in a local directory\nCreate a pull request to a new or existing git repository\nIf the template already exists, the changes will be reflected in the software catalog once the pull request gets merged\nBut if you are creating a new template, follow the documentation linked below to register the new template repository in software catalog'; + readonly 'templateEditorToolbar.addToCatalogDialogActions.documentationUrl': 'https://backstage.io/docs/features/software-templates/adding-templates/'; + readonly 'templateEditorToolbar.addToCatalogDialogActions.documentationButton': 'Go to the documentation'; } >; diff --git a/plugins/scaffolder/src/alpha/components/TemplateEditorPage/TemplateEditorToolbar.tsx b/plugins/scaffolder/src/alpha/components/TemplateEditorPage/TemplateEditorToolbar.tsx index 0d78bd675c..8e3124f833 100644 --- a/plugins/scaffolder/src/alpha/components/TemplateEditorPage/TemplateEditorToolbar.tsx +++ b/plugins/scaffolder/src/alpha/components/TemplateEditorPage/TemplateEditorToolbar.tsx @@ -31,7 +31,6 @@ import DialogActions from '@material-ui/core/DialogActions'; import ExtensionIcon from '@material-ui/icons/Extension'; import DescriptionIcon from '@material-ui/icons/Description'; -import { Link } from '@backstage/core-components'; import { FieldExtensionOptions } from '@backstage/plugin-scaffolder-react'; import { ActionPageContent } from '../../../components/ActionsPage/ActionsPage'; @@ -137,31 +136,30 @@ export function TemplateEditorToolbar(props: { {t( - 'templateEditorToolbar.addToCatalogDialogContent.introduction', + 'templateEditorToolbar.addToCatalogDialogContent.stepsIntroduction', )} -
      -
    1. - {t('templateEditorToolbar.addToCatalogDialogContent.step1')} -
    2. -
    3. - {t('templateEditorToolbar.addToCatalogDialogContent.step2')} -
    4. -
    5. - {t('templateEditorToolbar.addToCatalogDialogContent.step3')} -
    6. -
    7. - {t('templateEditorToolbar.addToCatalogDialogContent.step4')} -
      - - https://backstage.io/docs/features/software-templates/adding-templates/ - -
    8. -
    +
      + {t( + 'templateEditorToolbar.addToCatalogDialogContent.stepsListItems', + ) + .split('\n') + .map((step, index) => ( +
    • {step}
    • + ))} +
    - diff --git a/plugins/scaffolder/src/translation.ts b/plugins/scaffolder/src/translation.ts index 72fc76e497..4399678948 100644 --- a/plugins/scaffolder/src/translation.ts +++ b/plugins/scaffolder/src/translation.ts @@ -304,17 +304,15 @@ export const scaffolderTranslationRef = createTranslationRef({ addToCatalogButton: 'Publish', addToCatalogDialogTitle: 'Publish changes', addToCatalogDialogContent: { - introduction: + stepsIntroduction: 'Follow the instructions below to create or update a template:', - step1: 'Save the template files in a local directory', - step2: 'Create a pull request to a new or existing git repository', - step3: - 'If the template already exists, the changes will be reflected in the software catalog once the pull request gets merged', - step4: - 'But if you are creating a new template, follow the documentation linked below to register the new template repository in software catalog', + stepsListItems: + 'Save the template files in a local directory\nCreate a pull request to a new or existing git repository\nIf the template already exists, the changes will be reflected in the software catalog once the pull request gets merged\nBut if you are creating a new template, follow the documentation linked below to register the new template repository in software catalog', }, addToCatalogDialogActions: { - closeButton: 'Close', + documentationButton: 'Go to the documentation', + documentationUrl: + 'https://backstage.io/docs/features/software-templates/adding-templates/', }, }, }, From db54c57cdc9efc762557cef82247fd64582b94e6 Mon Sep 17 00:00:00 2001 From: RedlineTriad <39059512+RedlineTriad@users.noreply.github.com> Date: Mon, 30 Sep 2024 10:46:05 +0200 Subject: [PATCH 091/217] feat: add reviewers input for bitbucket server pr This doesn't include default-reviewers because those require a separate semi-official API call to get, which I didn't want to implement for now. Signed-off-by: RedlineTriad <39059512+RedlineTriad@users.noreply.github.com> --- .changeset/healthy-shoes-judge.md | 5 +++++ .../report.api.md | 1 + .../bitbucketServerPullRequest.examples.test.ts | 7 ++++++- .../bitbucketServerPullRequest.examples.ts | 1 + .../src/actions/bitbucketServerPullRequest.ts | 15 +++++++++++++++ 5 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 .changeset/healthy-shoes-judge.md diff --git a/.changeset/healthy-shoes-judge.md b/.changeset/healthy-shoes-judge.md new file mode 100644 index 0000000000..4392bffdd6 --- /dev/null +++ b/.changeset/healthy-shoes-judge.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-bitbucket-server': minor +--- + +Add `reviewers` input parameter to `publish:bitbucketServer:pull-request` diff --git a/plugins/scaffolder-backend-module-bitbucket-server/report.api.md b/plugins/scaffolder-backend-module-bitbucket-server/report.api.md index d103743b91..546a2d3834 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/report.api.md +++ b/plugins/scaffolder-backend-module-bitbucket-server/report.api.md @@ -44,6 +44,7 @@ export function createPublishBitbucketServerPullRequestAction(options: { description?: string | undefined; targetBranch?: string | undefined; sourceBranch: string; + reviewers?: string[] | undefined; token?: string | undefined; gitAuthorName?: string | undefined; gitAuthorEmail?: string | undefined; diff --git a/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.examples.test.ts b/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.examples.test.ts index b83ba2be55..9cb27eb4be 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.examples.test.ts +++ b/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.examples.test.ts @@ -366,7 +366,7 @@ describe('publish:bitbucketServer:pull-request', () => { }); it(`should ${examples[4].description}`, async () => { - expect.assertions(7); + expect.assertions(8); server.use( rest.get( 'https://no-credentials.bitbucket.com/rest/api/1.0/projects/project/repos/repo/branches', @@ -389,6 +389,7 @@ describe('publish:bitbucketServer:pull-request', () => { toRef: { displayId: string }; fromRef: { displayId: string }; description: string; + reviewers: [{ user: { name: string } }]; }; expect(requestBody.title).toBe('My pull request'); expect(requestBody.fromRef.displayId).toBe('my-feature-branch'); @@ -396,6 +397,10 @@ describe('publish:bitbucketServer:pull-request', () => { expect(requestBody.description).toBe( 'This is a detailed description of my pull request', ); + expect(requestBody.reviewers).toEqual([ + { user: { name: 'reviewer1' } }, + { user: { name: 'reviewer2' } }, + ]); expect(req.headers.get('Authorization')).toBe( `Bearer ${yaml.parse(examples[4].example).steps[0].input.token}`, ); diff --git a/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.examples.ts b/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.examples.ts index 77287e64e1..2859a2b051 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.examples.ts +++ b/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.examples.ts @@ -107,6 +107,7 @@ export const examples: TemplateExample[] = [ sourceBranch: 'my-feature-branch', targetBranch: 'development', description: 'This is a detailed description of my pull request', + reviewers: ['reviewer1', 'reviewer2'], token: 'my-auth-token', gitAuthorName: 'test-user', gitAuthorEmail: 'test-user@sample.com', diff --git a/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts b/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts index 440e402764..e061d0fef1 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts +++ b/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts @@ -54,6 +54,7 @@ const createPullRequest = async (opts: { latestChangeset: string; isDefault: boolean; }; + reviewers?: string[]; authorization: string; apiBaseUrl: string; }) => { @@ -64,6 +65,7 @@ const createPullRequest = async (opts: { description, toRef, fromRef, + reviewers, authorization, apiBaseUrl, } = opts; @@ -80,6 +82,7 @@ const createPullRequest = async (opts: { locked: true, toRef: toRef, fromRef: fromRef, + reviewers: reviewers?.map(reviewer => ({ user: { name: reviewer } })), }), headers: { Authorization: authorization, @@ -253,6 +256,7 @@ export function createPublishBitbucketServerPullRequestAction(options: { description?: string; targetBranch?: string; sourceBranch: string; + reviewers?: string[]; token?: string; gitAuthorName?: string; gitAuthorEmail?: string; @@ -288,6 +292,15 @@ export function createPublishBitbucketServerPullRequestAction(options: { type: 'string', description: 'Branch of repository to copy changes from', }, + reviewers: { + title: 'Pull Request Reviewers', + type: 'array', + items: { + type: 'string', + }, + description: + 'The usernames of reviewers that will be added to the pull request', + }, token: { title: 'Authorization Token', type: 'string', @@ -323,6 +336,7 @@ export function createPublishBitbucketServerPullRequestAction(options: { description, targetBranch, sourceBranch, + reviewers, gitAuthorName, gitAuthorEmail, } = ctx.input; @@ -473,6 +487,7 @@ export function createPublishBitbucketServerPullRequestAction(options: { description, toRef, fromRef, + reviewers, authorization, apiBaseUrl, }); From daa02d6e642e6ff8e0cccb9518755cf623158670 Mon Sep 17 00:00:00 2001 From: Jordan Slott Date: Fri, 27 Sep 2024 16:16:30 -0400 Subject: [PATCH 092/217] Fixes #26503 Add skipUserProfile flag to Microsoft authenticator Signed-off-by: Jordan Slott --- .changeset/heavy-ties-tell.md | 5 +++ docs/auth/microsoft/provider.md | 1 + .../config.d.ts | 1 + .../src/authenticator.test.ts | 26 ++++++++++- .../src/authenticator.ts | 43 +++++++++---------- .../src/strategy.ts | 8 +++- 6 files changed, 60 insertions(+), 24 deletions(-) create mode 100644 .changeset/heavy-ties-tell.md diff --git a/.changeset/heavy-ties-tell.md b/.changeset/heavy-ties-tell.md new file mode 100644 index 0000000000..7e7afdb6e7 --- /dev/null +++ b/.changeset/heavy-ties-tell.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-auth-backend-module-microsoft-provider': patch +--- + +Add skipUserProfile config flag to Microsoft authenticator diff --git a/docs/auth/microsoft/provider.md b/docs/auth/microsoft/provider.md index eb4fc833fd..5285aea3cd 100644 --- a/docs/auth/microsoft/provider.md +++ b/docs/auth/microsoft/provider.md @@ -86,6 +86,7 @@ The Microsoft provider is a structure with three mandatory configuration keys: When specified, this reduces login friction for users with accounts in multiple tenants by automatically filtering away accounts from other tenants. For more details, see [Home Realm Discovery](https://learn.microsoft.com/en-us/azure/active-directory/manage-apps/home-realm-discovery-policy) - `additionalScopes` (optional): List of scopes for the App Registration, to be requested in addition to the required ones. +- `skipUserProfile` (optional): If true, skips loading the user profile even if the `User.Read` scope is present. This is a performance optmization during login and can be used with resolvers that only needs the email address in `spec.profile.email` obtained when the `email` OAuth2 scope is present. ### Resolvers diff --git a/plugins/auth-backend-module-microsoft-provider/config.d.ts b/plugins/auth-backend-module-microsoft-provider/config.d.ts index b1ed2d5766..f8b5f0355d 100644 --- a/plugins/auth-backend-module-microsoft-provider/config.d.ts +++ b/plugins/auth-backend-module-microsoft-provider/config.d.ts @@ -29,6 +29,7 @@ export interface Config { domainHint?: string; callbackUrl?: string; additionalScopes?: string | string[]; + skipUserProfile?: boolean; signIn?: { resolvers: Array< | { resolver: 'emailMatchingUserEntityAnnotation' } diff --git a/plugins/auth-backend-module-microsoft-provider/src/authenticator.test.ts b/plugins/auth-backend-module-microsoft-provider/src/authenticator.test.ts index 74a7ab9974..0f39aed526 100644 --- a/plugins/auth-backend-module-microsoft-provider/src/authenticator.test.ts +++ b/plugins/auth-backend-module-microsoft-provider/src/authenticator.test.ts @@ -262,7 +262,7 @@ describe('microsoftAuthenticator', () => { expect(profile.photos).toStrictEqual([{ value: photo }]); }); - it('returns access token for non-microsoft graph scope', async () => { + it('returns access token for non-microsoft graph scope', async () => { const foreignScope = 'aks-audience/user.read'; const refreshResponse = await microsoftAuthenticator.refresh( createRefreshRequest(foreignScope), @@ -274,5 +274,29 @@ describe('microsoftAuthenticator', () => { microsoftApi.generateAccessToken(foreignScope), ); }); + + it('returns access token when skipping user profile load', async () => { + // Replace implementation to set skipUserProfile config + implementation = microsoftAuthenticator.initialize({ + callbackUrl: 'https://backstage.test/callback', + config: new ConfigReader({ + tenantId: 'tenantId', + clientId: 'clientId', + clientSecret: 'clientSecret', + additionalScopes: ['User.Read.All'], + skipUserProfile: true, + }), + }); + + const refreshResponse = await microsoftAuthenticator.refresh( + createRefreshRequest(scope), + implementation, + ); + + expect(refreshResponse.fullProfile).toBeUndefined(); + expect(refreshResponse.session.accessToken).toBe( + microsoftApi.generateAccessToken(scope), + ); + }); }); }); diff --git a/plugins/auth-backend-module-microsoft-provider/src/authenticator.ts b/plugins/auth-backend-module-microsoft-provider/src/authenticator.ts index fe7dc8f7e1..5767abaaf7 100644 --- a/plugins/auth-backend-module-microsoft-provider/src/authenticator.ts +++ b/plugins/auth-backend-module-microsoft-provider/src/authenticator.ts @@ -45,31 +45,30 @@ export const microsoftAuthenticator = createOAuthAuthenticator({ const clientSecret = config.getString('clientSecret'); const tenantId = config.getString('tenantId'); const domainHint = config.getOptionalString('domainHint'); + const skipUserProfile = + config.getOptionalBoolean('skipUserProfile') ?? false; - const helper = PassportOAuthAuthenticatorHelper.from( - new ExtendedMicrosoftStrategy( - { - clientID: clientId, - clientSecret: clientSecret, - callbackURL: callbackUrl, - tenant: tenantId, - }, - ( - accessToken: string, - refreshToken: string, - params: any, - fullProfile: PassportProfile, - done: PassportOAuthDoneCallback, - ) => { - done( - undefined, - { fullProfile, params, accessToken }, - { refreshToken }, - ); - }, - ), + const strategy = new ExtendedMicrosoftStrategy( + { + clientID: clientId, + clientSecret: clientSecret, + callbackURL: callbackUrl, + tenant: tenantId, + }, + ( + accessToken: string, + refreshToken: string, + params: any, + fullProfile: PassportProfile, + done: PassportOAuthDoneCallback, + ) => { + done(undefined, { fullProfile, params, accessToken }, { refreshToken }); + }, ); + strategy.setSkipUserProfile(skipUserProfile); + const helper = PassportOAuthAuthenticatorHelper.from(strategy); + return { helper, domainHint, diff --git a/plugins/auth-backend-module-microsoft-provider/src/strategy.ts b/plugins/auth-backend-module-microsoft-provider/src/strategy.ts index d5a1aa31fe..910bd85d1d 100644 --- a/plugins/auth-backend-module-microsoft-provider/src/strategy.ts +++ b/plugins/auth-backend-module-microsoft-provider/src/strategy.ts @@ -20,6 +20,12 @@ import fetch from 'node-fetch'; import { Strategy as MicrosoftStrategy } from 'passport-microsoft'; export class ExtendedMicrosoftStrategy extends MicrosoftStrategy { + private shouldSkipUserProfile = false; + + public setSkipUserProfile(shouldSkipUserProfile: boolean): void { + this.shouldSkipUserProfile = shouldSkipUserProfile; + } + userProfile( accessToken: string, done: (err?: unknown, profile?: PassportProfile) => void, @@ -66,7 +72,7 @@ export class ExtendedMicrosoftStrategy extends MicrosoftStrategy { private skipUserProfile(accessToken: string): boolean { try { - return !this.hasGraphReadScope(accessToken); + return this.shouldSkipUserProfile || !this.hasGraphReadScope(accessToken); } catch { // If there is any error with checking the scope // we fall back to not skipping the user profile From 2bc52ff8bb9ba032971baa0bdbf054b909b30415 Mon Sep 17 00:00:00 2001 From: Eric Peterson Date: Tue, 1 Oct 2024 16:13:22 +0200 Subject: [PATCH 093/217] Update API report for backend defaults Signed-off-by: Eric Peterson --- packages/backend-defaults/report-database.api.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/backend-defaults/report-database.api.md b/packages/backend-defaults/report-database.api.md index d9e9e9e287..9c07338264 100644 --- a/packages/backend-defaults/report-database.api.md +++ b/packages/backend-defaults/report-database.api.md @@ -7,6 +7,8 @@ import { DatabaseService } from '@backstage/backend-plugin-api'; import { LifecycleService } from '@backstage/backend-plugin-api'; import { LoggerService } from '@backstage/backend-plugin-api'; import { RootConfigService } from '@backstage/backend-plugin-api'; +import { RootLifecycleService } from '@backstage/backend-plugin-api'; +import { RootLoggerService } from '@backstage/backend-plugin-api'; import { ServiceFactory } from '@backstage/backend-plugin-api'; // @public @@ -27,6 +29,8 @@ export class DatabaseManager { // @public export type DatabaseManagerOptions = { migrations?: DatabaseService['migrations']; + rootLogger?: RootLoggerService; + rootLifecycle?: RootLifecycleService; }; // @public From ffd1f4ab74707b3c76177bae2781dbd2beb29759 Mon Sep 17 00:00:00 2001 From: Eric Peterson Date: Tue, 1 Oct 2024 16:20:18 +0200 Subject: [PATCH 094/217] Add changesets Signed-off-by: Eric Peterson --- .changeset/crash-loop-baby.md | 6 ++++++ .changeset/crash-loop-honey.md | 5 +++++ 2 files changed, 11 insertions(+) create mode 100644 .changeset/crash-loop-baby.md create mode 100644 .changeset/crash-loop-honey.md diff --git a/.changeset/crash-loop-baby.md b/.changeset/crash-loop-baby.md new file mode 100644 index 0000000000..4f629c7f92 --- /dev/null +++ b/.changeset/crash-loop-baby.md @@ -0,0 +1,6 @@ +--- +'@backstage/backend-app-api': patch +'@backstage/backend-defaults': patch +--- + +Plugin lifecycle shutdown hooks are now performed before root lifecycle shutdown hooks. diff --git a/.changeset/crash-loop-honey.md b/.changeset/crash-loop-honey.md new file mode 100644 index 0000000000..60f9f04600 --- /dev/null +++ b/.changeset/crash-loop-honey.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-defaults': patch +--- + +The database manager now attempts to close any database connections in a root lifecycle shutdown hook. From 8374f0ca17e00d93115b55db0f09947624aac294 Mon Sep 17 00:00:00 2001 From: Eric Peterson Date: Tue, 1 Oct 2024 16:43:03 +0200 Subject: [PATCH 095/217] Test the database manager shutdown hook Signed-off-by: Eric Peterson --- .../database/DatabaseManager.test.ts | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/packages/backend-defaults/src/entrypoints/database/DatabaseManager.test.ts b/packages/backend-defaults/src/entrypoints/database/DatabaseManager.test.ts index 26c2d54231..c7e739c7c7 100644 --- a/packages/backend-defaults/src/entrypoints/database/DatabaseManager.test.ts +++ b/packages/backend-defaults/src/entrypoints/database/DatabaseManager.test.ts @@ -176,4 +176,35 @@ describe('DatabaseManagerImpl', () => { skip: true, }); }); + + it('registers a shutdown hook if root lifecycle service is provided', async () => { + // Given a database manager that is provided a rootLifecycle service + const rootLifecycle = { addShutdownHook: jest.fn() } as unknown as any; + const destroy = jest.fn(); + const connector1 = { + getClient: jest.fn().mockResolvedValue({ destroy }), + } satisfies Connector; + const impl = new DatabaseManagerImpl( + new ConfigReader({ + client: 'pg', + }), + { + pg: connector1, + }, + { rootLifecycle }, + ); + + // Then a shutdown hook should have been added + expect(rootLifecycle.addShutdownHook).toHaveBeenCalled(); + const shutdownHook = rootLifecycle.addShutdownHook.mock.calls[0][0]; + + // When a database client for a plugin is retrieved + await impl.forPlugin('plugin1', deps).getClient(); + + // And the shutdownhook is called + await shutdownHook(); + + // Then the destroy method should have been called on the resolved client + expect(destroy).toHaveBeenCalled(); + }); }); From fbdc63116c9bf982f30f9f33fbc3c00b49e5a4be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Kosi=C5=84ski?= Date: Tue, 1 Oct 2024 19:40:47 +0200 Subject: [PATCH 096/217] feat(techdocs): Allow to pass options to GCS publisher (#26836) * feat(techdocs): Allow to pass options to GCS publisher Signed-off-by: Adrian Kosinski --------- Signed-off-by: Adrian Kosinski --- .changeset/tough-fireants-itch.md | 6 ++++ docs/features/techdocs/using-cloud-storage.md | 30 +++++++++++++++++++ plugins/techdocs-backend/src/plugin.ts | 9 ++++++ plugins/techdocs-node/report.api.md | 25 ++++++++++++---- plugins/techdocs-node/src/extensions.ts | 5 ++++ .../src/stages/publish/googleStorage.test.ts | 24 ++++++++++++++- .../src/stages/publish/googleStorage.ts | 8 +++-- .../techdocs-node/src/stages/publish/index.ts | 1 + .../src/stages/publish/publish.ts | 6 +++- .../techdocs-node/src/stages/publish/types.ts | 10 +++++++ 10 files changed, 115 insertions(+), 9 deletions(-) create mode 100644 .changeset/tough-fireants-itch.md diff --git a/.changeset/tough-fireants-itch.md b/.changeset/tough-fireants-itch.md new file mode 100644 index 0000000000..3567ac82d0 --- /dev/null +++ b/.changeset/tough-fireants-itch.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-techdocs-backend': patch +'@backstage/plugin-techdocs-node': patch +--- + +Allow to pass StorageOptions to GCS Publisher diff --git a/docs/features/techdocs/using-cloud-storage.md b/docs/features/techdocs/using-cloud-storage.md index 6ba826ea62..bdafb3532c 100644 --- a/docs/features/techdocs/using-cloud-storage.md +++ b/docs/features/techdocs/using-cloud-storage.md @@ -120,6 +120,36 @@ techdocs: Your Backstage app is now ready to use Google Cloud Storage for TechDocs, to store and read the static generated documentation files. +### Extending default Storage configuration + +If you need a non-standard configuration of Google Cloud Storage client, +`TechdocsPublisherExtensionPoint` is something you should look at. +You can register custom `StorageOptions` that will be used to configure the client. To do so, you +need to register publisher settings inside your module init, like in the following example: + +```typescript +export const gcsPublisherCustomizer = createBackendModule({ + pluginId: 'techdocs', + moduleId: 'gcs-publisher-customizer', + register(reg) { + reg.registerInit({ + deps: { + techdocsExtensionPoint: techdocsPublisherExtensionPoint, + }, + async init({ techdocsExtensionPoint }) { + const customOptions: StorageOptions = { + userAgent: 'my-custom-user-agent', + }; + techdocsExtensionPoint.registerPublisherSettings( + 'googleGcs', + customOptions, + ); + }, + }); + }, +}); +``` + ## Configuring AWS S3 Bucket with TechDocs **1. Set `techdocs.publisher.type` config in your `app-config.yaml`** diff --git a/plugins/techdocs-backend/src/plugin.ts b/plugins/techdocs-backend/src/plugin.ts index 0f3def79b1..9b5ae21a52 100644 --- a/plugins/techdocs-backend/src/plugin.ts +++ b/plugins/techdocs-backend/src/plugin.ts @@ -29,6 +29,7 @@ import { Preparers, Publisher, PublisherBase, + PublisherSettings, PublisherType, RemoteProtocol, techdocsBuildsExtensionPoint, @@ -89,6 +90,7 @@ export const techdocsPlugin = createBackendPlugin({ }); let customTechdocsPublisher: PublisherBase | undefined; + const publisherSettings: PublisherSettings = {}; env.registerExtensionPoint(techdocsPublisherExtensionPoint, { registerPublisher(type: PublisherType, publisher: PublisherBase) { if (customTechdocsPublisher) { @@ -96,6 +98,12 @@ export const techdocsPlugin = createBackendPlugin({ } customTechdocsPublisher = publisher; }, + registerPublisherSettings( + publisher: T, + settings: PublisherSettings[T], + ) { + publisherSettings[publisher] = settings; + }, }); env.registerInit({ @@ -144,6 +152,7 @@ export const techdocsPlugin = createBackendPlugin({ logger: winstonLogger, discovery: discovery, customPublisher: customTechdocsPublisher, + publisherSettings, }); // checks if the publisher is working and logs the result diff --git a/plugins/techdocs-node/report.api.md b/plugins/techdocs-node/report.api.md index ad6e01636f..1bd93d1b57 100644 --- a/plugins/techdocs-node/report.api.md +++ b/plugins/techdocs-node/report.api.md @@ -15,6 +15,7 @@ import { IndexableDocument } from '@backstage/plugin-search-common'; import { Logger } from 'winston'; import { LoggerService } from '@backstage/backend-plugin-api'; import { ScmIntegrationRegistry } from '@backstage/integration'; +import { StorageOptions } from '@google-cloud/storage'; import { UrlReaderService } from '@backstage/backend-plugin-api'; import * as winston from 'winston'; import { Writable } from 'stream'; @@ -217,8 +218,15 @@ export type PublisherFactory = { logger: LoggerService; discovery: DiscoveryService; customPublisher?: PublisherBase | undefined; + publisherSettings?: PublisherSettings; }; +// @public +export interface PublisherSettings { + // (undocumented) + googleGcs?: StorageOptions; +} + // @public export type PublisherType = | 'local' @@ -344,6 +352,11 @@ export const techdocsPreparerExtensionPoint: ExtensionPoint( + publisher: T, + settings: PublisherSettings[T], + ): void; } // @public @@ -368,13 +381,15 @@ export class UrlPreparer implements PreparerBase { // Warnings were encountered during analysis: // -// src/extensions.d.ts:10:5 - (ae-undocumented) Missing documentation for "setBuildStrategy". -// src/extensions.d.ts:11:5 - (ae-undocumented) Missing documentation for "setBuildLogTransport". -// src/extensions.d.ts:25:5 - (ae-undocumented) Missing documentation for "setTechdocsGenerator". -// src/extensions.d.ts:39:5 - (ae-undocumented) Missing documentation for "registerPreparer". -// src/extensions.d.ts:53:5 - (ae-undocumented) Missing documentation for "registerPublisher". +// src/extensions.d.ts:11:5 - (ae-undocumented) Missing documentation for "setBuildStrategy". +// src/extensions.d.ts:12:5 - (ae-undocumented) Missing documentation for "setBuildLogTransport". +// src/extensions.d.ts:26:5 - (ae-undocumented) Missing documentation for "setTechdocsGenerator". +// src/extensions.d.ts:40:5 - (ae-undocumented) Missing documentation for "registerPreparer". +// src/extensions.d.ts:54:5 - (ae-undocumented) Missing documentation for "registerPublisher". +// src/extensions.d.ts:55:5 - (ae-undocumented) Missing documentation for "registerPublisherSettings". // src/stages/generate/index.d.ts:10:22 - (ae-undocumented) Missing documentation for "getMkDocsYml". // src/stages/publish/publish.d.ts:10:5 - (ae-undocumented) Missing documentation for "register". // src/stages/publish/publish.d.ts:11:5 - (ae-undocumented) Missing documentation for "get". +// src/stages/publish/types.d.ts:21:5 - (ae-undocumented) Missing documentation for "googleGcs". // src/techdocsTypes.d.ts:39:5 - (ae-undocumented) Missing documentation for "shouldBuild". ``` diff --git a/plugins/techdocs-node/src/extensions.ts b/plugins/techdocs-node/src/extensions.ts index e9a9b1d731..60498746ad 100644 --- a/plugins/techdocs-node/src/extensions.ts +++ b/plugins/techdocs-node/src/extensions.ts @@ -23,6 +23,7 @@ import { TechdocsGenerator, } from './stages'; import * as winston from 'winston'; +import { PublisherSettings } from './stages/publish/types'; /** * Extension point type for configuring TechDocs builds. @@ -89,6 +90,10 @@ export const techdocsPreparerExtensionPoint = */ export interface TechdocsPublisherExtensionPoint { registerPublisher(type: PublisherType, publisher: PublisherBase): void; + registerPublisherSettings( + publisher: T, + settings: PublisherSettings[T], + ): void; } /** diff --git a/plugins/techdocs-node/src/stages/publish/googleStorage.test.ts b/plugins/techdocs-node/src/stages/publish/googleStorage.test.ts index f09ba160d9..322149660e 100644 --- a/plugins/techdocs-node/src/stages/publish/googleStorage.test.ts +++ b/plugins/techdocs-node/src/stages/publish/googleStorage.test.ts @@ -26,9 +26,12 @@ import { createMockDirectory, mockServices, } from '@backstage/backend-test-utils'; +import { StorageOptions } from '@google-cloud/storage'; const mockDir = createMockDirectory(); +let createdStorageOptions: Array = []; + jest.mock('@google-cloud/storage', () => { class GCSFile { constructor(private readonly filePath: string) {} @@ -118,6 +121,10 @@ jest.mock('@google-cloud/storage', () => { } class Storage { + constructor(readonly options?: StorageOptions) { + createdStorageOptions.push(options); + } + bucket(bucketName: string) { return new Bucket(bucketName); } @@ -144,10 +151,12 @@ const createPublisherFromConfig = ({ bucketName = 'bucketName', bucketRootPath = '/', legacyUseCaseSensitiveTripletPaths = false, + storageOptions = {}, }: { bucketName?: string; bucketRootPath?: string; legacyUseCaseSensitiveTripletPaths?: boolean; + storageOptions?: StorageOptions; } = {}) => { const config = new ConfigReader({ techdocs: { @@ -162,7 +171,7 @@ const createPublisherFromConfig = ({ legacyUseCaseSensitiveTripletPaths, }, }); - return GoogleGCSPublish.fromConfig(config, logger); + return GoogleGCSPublish.fromConfig(config, logger, storageOptions); }; describe('GoogleGCSPublish', () => { @@ -211,11 +220,24 @@ describe('GoogleGCSPublish', () => { }; beforeEach(() => { + createdStorageOptions = []; mockDir.setContent({ [directory]: files, }); }); + it('should pass options to storage', () => { + createPublisherFromConfig({ + storageOptions: { + userAgent: 'Test-UA', + }, + }); + + expect(createdStorageOptions.map(opt => opt?.userAgent)).toContain( + 'Test-UA', + ); + }); + describe('getReadiness', () => { it('should validate correct config', async () => { const publisher = createPublisherFromConfig(); diff --git a/plugins/techdocs-node/src/stages/publish/googleStorage.ts b/plugins/techdocs-node/src/stages/publish/googleStorage.ts index 519b0f8c6b..3eac9834d2 100644 --- a/plugins/techdocs-node/src/stages/publish/googleStorage.ts +++ b/plugins/techdocs-node/src/stages/publish/googleStorage.ts @@ -68,7 +68,11 @@ export class GoogleGCSPublish implements PublisherBase { this.bucketRootPath = options.bucketRootPath; } - static fromConfig(config: Config, logger: LoggerService): PublisherBase { + static fromConfig( + config: Config, + logger: LoggerService, + options?: StorageOptions, + ): PublisherBase { let bucketName = ''; try { bucketName = config.getString('techdocs.publisher.googleGcs.bucketName'); @@ -103,7 +107,7 @@ export class GoogleGCSPublish implements PublisherBase { } } - const clientOpts: StorageOptions = {}; + const clientOpts: StorageOptions = options ?? {}; if (projectId) { clientOpts.projectId = projectId; } diff --git a/plugins/techdocs-node/src/stages/publish/index.ts b/plugins/techdocs-node/src/stages/publish/index.ts index 7f6859367f..8d528b4db6 100644 --- a/plugins/techdocs-node/src/stages/publish/index.ts +++ b/plugins/techdocs-node/src/stages/publish/index.ts @@ -24,4 +24,5 @@ export type { MigrateRequest, ReadinessResponse, TechDocsMetadata, + PublisherSettings, } from './types'; diff --git a/plugins/techdocs-node/src/stages/publish/publish.ts b/plugins/techdocs-node/src/stages/publish/publish.ts index 09a6d9b375..67315165a9 100644 --- a/plugins/techdocs-node/src/stages/publish/publish.ts +++ b/plugins/techdocs-node/src/stages/publish/publish.ts @@ -86,7 +86,11 @@ export class Publisher implements PublisherBuilder { logger.info('Creating Google Storage Bucket publisher for TechDocs'); publishers.register( publisherType, - GoogleGCSPublish.fromConfig(config, logger), + GoogleGCSPublish.fromConfig( + config, + logger, + options.publisherSettings?.googleGcs, + ), ); break; case 'awsS3': diff --git a/plugins/techdocs-node/src/stages/publish/types.ts b/plugins/techdocs-node/src/stages/publish/types.ts index 720f1b218a..b5b65c8e08 100644 --- a/plugins/techdocs-node/src/stages/publish/types.ts +++ b/plugins/techdocs-node/src/stages/publish/types.ts @@ -17,6 +17,7 @@ import express from 'express'; import { Config } from '@backstage/config'; import { DiscoveryService, LoggerService } from '@backstage/backend-plugin-api'; import { Entity, CompoundEntityRef } from '@backstage/catalog-model'; +import { StorageOptions } from '@google-cloud/storage'; /** * Options for building publishers @@ -26,8 +27,17 @@ export type PublisherFactory = { logger: LoggerService; discovery: DiscoveryService; customPublisher?: PublisherBase | undefined; + publisherSettings?: PublisherSettings; }; +/** + * Additional configurations for publishers. + * @public + */ +export interface PublisherSettings { + googleGcs?: StorageOptions; +} + /** * Key for all the different types of TechDocs publishers that are supported. * @public From 6343c8d9154e30193b5004d4325ff5b0a96ecd35 Mon Sep 17 00:00:00 2001 From: Patrick Jungermann Date: Tue, 1 Oct 2024 21:18:23 +0200 Subject: [PATCH 097/217] fix!: fix event support for Bitbucket Cloud Fixes the event-based updates at `BitbucketCloudEntityProvider`. Previously, this entity provider had optional event support for legacy backends that could be enabled by passing `catalogApi`, `events`, and `tokenManager`. For the new/current backend system, the `catalogModuleBitbucketCloudEntityProvider` (`catalog.bitbucket-cloud-entity-provider`), event support was enabled by default. A recent change removed `tokenManager` as a dependency from the module as well as removed it as input. While this didn't break the instantiation of the module, it broke the event-based updates and led to a runtime misbehavior, accompanied by an info log message. This change will replace the use of `tokenManager` with the use of `auth` (`AuthService`). Additionally, it will make `catalogApi` and `events` required dependencies. For the current backend system, this change is transparent and doesn't require any action. For the legacy backend system, this change will require you to pass those dependencies if you didn't do it already. **BREAKING CHANGES:** > _(For legacy backend users only.)_ > > Previously optional `catalogApi`, and `events` are required now. > A new required dependency `auth` was added. Fixes: #26925 Relates-to: PR #26141 Signed-off-by: Patrick Jungermann --- .changeset/rare-rabbits-flow.md | 29 ++++++ docs/integrations/bitbucketCloud/discovery.md | 31 +------ .../package.json | 1 - .../report.api.md | 14 +-- ...talogModuleBitbucketCloudEntityProvider.ts | 12 ++- .../BitbucketCloudEntityProvider.test.ts | 60 ++++++++++-- .../providers/BitbucketCloudEntityProvider.ts | 92 ++++++++----------- yarn.lock | 1 - 8 files changed, 135 insertions(+), 105 deletions(-) create mode 100644 .changeset/rare-rabbits-flow.md diff --git a/.changeset/rare-rabbits-flow.md b/.changeset/rare-rabbits-flow.md new file mode 100644 index 0000000000..6b64957d59 --- /dev/null +++ b/.changeset/rare-rabbits-flow.md @@ -0,0 +1,29 @@ +--- +'@backstage/plugin-catalog-backend-module-bitbucket-cloud': minor +--- + +Fixes the event-based updates at `BitbucketCloudEntityProvider`. + +Previously, this entity provider had optional event support for legacy backends +that could be enabled by passing `catalogApi`, `events`, and `tokenManager`. + +For the new/current backend system, the `catalogModuleBitbucketCloudEntityProvider` +(`catalog.bitbucket-cloud-entity-provider`), event support was enabled by default. + +A recent change removed `tokenManager` as a dependency from the module as well as removed it as input. +While this didn't break the instantiation of the module, it broke the event-based updates, +and led to a runtime misbehavior, accompanied by an info log message. + +This change will replace the use of `tokenManager` with the use of `auth` (`AuthService`). + +Additionally, to simplify, it will make `catalogApi` and `events` required dependencies. +For the current backend system, this change is transparent and doesn't require any action. +For the legacy backend system, this change will require you to pass those dependencies +if you didn't do it already. + +BREAKING CHANGES: + +_(For legacy backend users only.)_ + +Previously optional `catalogApi`, and `events` are required now. +A new required dependency `auth` was added. diff --git a/docs/integrations/bitbucketCloud/discovery.md b/docs/integrations/bitbucketCloud/discovery.md index 6ba9c0aa1f..102feb46d7 100644 --- a/docs/integrations/bitbucketCloud/discovery.md +++ b/docs/integrations/bitbucketCloud/discovery.md @@ -51,33 +51,6 @@ Further documentation: ### Installation with Legacy Backend System -#### Installation without Events Support - -And then add the entity provider to your catalog builder: - -```ts title="packages/backend/src/plugins/catalog.ts" -/* highlight-add-next-line */ -import { BitbucketCloudEntityProvider } from '@backstage/plugin-catalog-backend-module-bitbucket-cloud'; - -export default async function createPlugin( - env: PluginEnvironment, -): Promise { - const builder = await CatalogBuilder.create(env); - /* highlight-add-start */ - builder.addEntityProvider( - BitbucketCloudEntityProvider.fromConfig(env.config, { - logger: env.logger, - scheduler: env.scheduler, - }), - ); - /* highlight-add-end */ - - // .. -} -``` - -#### Installation with Events Support - Please follow the installation instructions at - @@ -104,19 +77,17 @@ export default async function createPlugin( env: PluginEnvironment, ): Promise { const builder = await CatalogBuilder.create(env); - builder.addProcessor(new ScaffolderEntitiesProcessor()); /* highlight-add-start */ const bitbucketCloudProvider = BitbucketCloudEntityProvider.fromConfig( env.config, { + auth: env.auth, catalogApi: new CatalogClient({ discoveryApi: env.discovery }), events: env.events, logger: env.logger, scheduler: env.scheduler, - tokenManager: env.tokenManager, }, ); - env.eventBroker.subscribe(bitbucketCloudProvider); builder.addEntityProvider(bitbucketCloudProvider); /* highlight-add-end */ const { processingEngine, router } = await builder.build(); diff --git a/plugins/catalog-backend-module-bitbucket-cloud/package.json b/plugins/catalog-backend-module-bitbucket-cloud/package.json index 008e7c5311..eecb4011d5 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/package.json +++ b/plugins/catalog-backend-module-bitbucket-cloud/package.json @@ -51,7 +51,6 @@ "test": "backstage-cli package test" }, "dependencies": { - "@backstage/backend-common": "^0.25.0", "@backstage/backend-plugin-api": "workspace:^", "@backstage/catalog-client": "workspace:^", "@backstage/catalog-model": "workspace:^", diff --git a/plugins/catalog-backend-module-bitbucket-cloud/report.api.md b/plugins/catalog-backend-module-bitbucket-cloud/report.api.md index d6c1977ce8..d0248b3973 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/report.api.md +++ b/plugins/catalog-backend-module-bitbucket-cloud/report.api.md @@ -3,6 +3,7 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts +import { AuthService } from '@backstage/backend-plugin-api'; import { CatalogApi } from '@backstage/catalog-client'; import { Config } from '@backstage/config'; import { EntityProvider } from '@backstage/plugin-catalog-node'; @@ -12,7 +13,6 @@ import { EventsService } from '@backstage/plugin-events-node'; import { LoggerService } from '@backstage/backend-plugin-api'; import { SchedulerService } from '@backstage/backend-plugin-api'; import { SchedulerServiceTaskRunner } from '@backstage/backend-plugin-api'; -import { TokenManager } from '@backstage/backend-common'; // @public export class BitbucketCloudEntityProvider implements EntityProvider { @@ -21,12 +21,12 @@ export class BitbucketCloudEntityProvider implements EntityProvider { static fromConfig( config: Config, options: { - catalogApi?: CatalogApi; - events?: EventsService; + auth: AuthService; + catalogApi: CatalogApi; + events: EventsService; logger: LoggerService; schedule?: SchedulerServiceTaskRunner; scheduler?: SchedulerService; - tokenManager?: TokenManager; }, ): BitbucketCloudEntityProvider[]; getProviderName(): string; @@ -39,7 +39,7 @@ export class BitbucketCloudEntityProvider implements EntityProvider { // Warnings were encountered during analysis: // -// src/providers/BitbucketCloudEntityProvider.d.ts:28:5 - (ae-undocumented) Missing documentation for "fromConfig". -// src/providers/BitbucketCloudEntityProvider.d.ts:44:5 - (ae-undocumented) Missing documentation for "refresh". -// src/providers/BitbucketCloudEntityProvider.d.ts:47:5 - (ae-undocumented) Missing documentation for "onRepoPush". +// src/providers/BitbucketCloudEntityProvider.d.ts:26:5 - (ae-undocumented) Missing documentation for "fromConfig". +// src/providers/BitbucketCloudEntityProvider.d.ts:42:5 - (ae-undocumented) Missing documentation for "refresh". +// src/providers/BitbucketCloudEntityProvider.d.ts:44:5 - (ae-undocumented) Missing documentation for "onRepoPush". ``` diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/module/catalogModuleBitbucketCloudEntityProvider.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/module/catalogModuleBitbucketCloudEntityProvider.ts index 179e74b8c0..8cc8f50d5b 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/src/module/catalogModuleBitbucketCloudEntityProvider.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/src/module/catalogModuleBitbucketCloudEntityProvider.ts @@ -34,6 +34,7 @@ export const catalogModuleBitbucketCloudEntityProvider = createBackendModule({ register(env) { env.registerInit({ deps: { + auth: coreServices.auth, catalog: catalogProcessingExtensionPoint, catalogApi: catalogServiceRef, config: coreServices.rootConfig, @@ -41,8 +42,17 @@ export const catalogModuleBitbucketCloudEntityProvider = createBackendModule({ logger: coreServices.logger, scheduler: coreServices.scheduler, }, - async init({ catalog, catalogApi, config, events, logger, scheduler }) { + async init({ + auth, + catalog, + catalogApi, + config, + events, + logger, + scheduler, + }) { const providers = BitbucketCloudEntityProvider.fromConfig(config, { + auth, catalogApi, events, logger, diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.test.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.test.ts index 262582b99a..baea86715c 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.test.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.test.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import { TokenManager } from '@backstage/backend-common'; import { SchedulerServiceTaskInvocationDefinition, SchedulerServiceTaskRunner, @@ -92,11 +91,6 @@ describe('BitbucketCloudEntityProvider', () => { applyMutation: jest.fn(), refresh: jest.fn(), }; - const tokenManager = { - getToken: async () => { - return { token: 'fake-token' }; - }, - } as any as TokenManager; const repoPushEvent: Events.RepoPushEvent = { actor: { type: 'user', @@ -158,8 +152,14 @@ describe('BitbucketCloudEntityProvider', () => { }); it('no provider config', () => { + const auth = mockServices.auth.mock(); + const catalogApi = catalogServiceMock.mock(); const config = new ConfigReader({}); + const events = DefaultEventsService.create({ logger }); const providers = BitbucketCloudEntityProvider.fromConfig(config, { + auth, + catalogApi, + events, logger, schedule, }); @@ -168,7 +168,13 @@ describe('BitbucketCloudEntityProvider', () => { }); it('single simple provider config', () => { + const auth = mockServices.auth.mock(); + const catalogApi = catalogServiceMock.mock(); + const events = DefaultEventsService.create({ logger }); const providers = BitbucketCloudEntityProvider.fromConfig(simpleConfig, { + auth, + catalogApi, + events, logger, schedule, }); @@ -180,14 +186,24 @@ describe('BitbucketCloudEntityProvider', () => { }); it('fail without schedule and scheduler', () => { + const auth = mockServices.auth.mock(); + const catalogApi = catalogServiceMock.mock(); + const events = DefaultEventsService.create({ logger }); + expect(() => BitbucketCloudEntityProvider.fromConfig(simpleConfig, { + auth, + catalogApi, + events, logger, }), ).toThrow('Either schedule or scheduler must be provided.'); }); it('fail with scheduler but no schedule config', () => { + const auth = mockServices.auth.mock(); + const catalogApi = catalogServiceMock.mock(); + const events = DefaultEventsService.create({ logger }); const scheduler = mockServices.scheduler.mock(); const config = new ConfigReader({ catalog: { @@ -201,6 +217,9 @@ describe('BitbucketCloudEntityProvider', () => { expect(() => BitbucketCloudEntityProvider.fromConfig(config, { + auth, + catalogApi, + events, logger, scheduler, }), @@ -210,6 +229,9 @@ describe('BitbucketCloudEntityProvider', () => { }); it('single simple provider config with schedule in config', () => { + const auth = mockServices.auth.mock(); + const catalogApi = catalogServiceMock.mock(); + const events = DefaultEventsService.create({ logger }); const scheduler = mockServices.scheduler.mock(); const config = new ConfigReader({ catalog: { @@ -226,6 +248,9 @@ describe('BitbucketCloudEntityProvider', () => { }); const providers = BitbucketCloudEntityProvider.fromConfig(config, { + auth, + catalogApi, + events, logger, scheduler, }); @@ -237,6 +262,8 @@ describe('BitbucketCloudEntityProvider', () => { }); it('multiple provider configs', () => { + const auth = mockServices.auth.mock(); + const catalogApi = catalogServiceMock.mock(); const config = new ConfigReader({ catalog: { providers: { @@ -251,7 +278,11 @@ describe('BitbucketCloudEntityProvider', () => { }, }, }); + const events = DefaultEventsService.create({ logger }); const providers = BitbucketCloudEntityProvider.fromConfig(config, { + auth, + catalogApi, + events, logger, schedule, }); @@ -266,7 +297,13 @@ describe('BitbucketCloudEntityProvider', () => { }); it('apply full update on scheduled execution', async () => { + const auth = mockServices.auth.mock(); + const catalogApi = catalogServiceMock.mock(); + const events = DefaultEventsService.create({ logger }); const provider = BitbucketCloudEntityProvider.fromConfig(defaultConfig, { + auth, + catalogApi, + events, logger, schedule, })[0]; @@ -436,6 +473,9 @@ describe('BitbucketCloudEntityProvider', () => { 'added-module/catalog-custom.yaml', ); + const auth = mockServices.auth.mock({ + getPluginRequestToken: async () => ({ token: 'fake-token' }), + }); const events = DefaultEventsService.create({ logger }); const catalogApi = catalogServiceMock.mock({ getEntities: async ( @@ -457,11 +497,11 @@ describe('BitbucketCloudEntityProvider', () => { }, }); const provider = BitbucketCloudEntityProvider.fromConfig(defaultConfig, { + auth, catalogApi, events, logger, schedule, - tokenManager, })[0]; server.use( @@ -569,14 +609,15 @@ describe('BitbucketCloudEntityProvider', () => { }); it('no onRepoPush update on non-matching workspace slug', async () => { + const auth = mockServices.auth.mock(); const catalogApi = catalogServiceMock.mock(); const events = DefaultEventsService.create({ logger }); const provider = BitbucketCloudEntityProvider.fromConfig(defaultConfig, { + auth, catalogApi, events, logger, schedule, - tokenManager, })[0]; await provider.connect(entityProviderConnection); @@ -599,14 +640,15 @@ describe('BitbucketCloudEntityProvider', () => { }); it('no onRepoPush update on non-matching repo slug', async () => { + const auth = mockServices.auth.mock(); const catalogApi = catalogServiceMock.mock(); const events = DefaultEventsService.create({ logger }); const provider = BitbucketCloudEntityProvider.fromConfig(defaultConfig, { + auth, catalogApi, events, logger, schedule, - tokenManager, })[0]; await provider.connect(entityProviderConnection); diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts index 6b19bea4f2..b439f391ca 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import { TokenManager } from '@backstage/backend-common'; import { + AuthService, LoggerService, SchedulerService, SchedulerServiceTaskRunner, @@ -66,26 +66,25 @@ interface IngestionTarget { * @public */ export class BitbucketCloudEntityProvider implements EntityProvider { + private readonly auth: AuthService; + private readonly catalogApi: CatalogApi; private readonly client: BitbucketCloudClient; private readonly config: BitbucketCloudEntityProviderConfig; + private readonly events: EventsService; private readonly logger: LoggerService; private readonly scheduleFn: () => Promise; - private readonly catalogApi?: CatalogApi; - private readonly events?: EventsService; - private readonly tokenManager?: TokenManager; - private connection?: EntityProviderConnection; - private eventConfigErrorThrown = false; + private connection?: EntityProviderConnection; static fromConfig( config: Config, options: { - catalogApi?: CatalogApi; - events?: EventsService; + auth: AuthService; + catalogApi: CatalogApi; + events: EventsService; logger: LoggerService; schedule?: SchedulerServiceTaskRunner; scheduler?: SchedulerService; - tokenManager?: TokenManager; }, ): BitbucketCloudEntityProvider[] { const integrations = ScmIntegrations.fromConfig(config); @@ -112,35 +111,35 @@ export class BitbucketCloudEntityProvider implements EntityProvider { options.scheduler!.createScheduledTaskRunner(providerConfig.schedule!); return new BitbucketCloudEntityProvider( + options.auth, + options.catalogApi, providerConfig, + options.events, integration, options.logger, taskRunner, - options.catalogApi, - options.events, - options.tokenManager, ); }); } private constructor( + auth: AuthService, + catalogApi: CatalogApi, config: BitbucketCloudEntityProviderConfig, + events: EventsService, integration: BitbucketCloudIntegration, logger: LoggerService, taskRunner: SchedulerServiceTaskRunner, - catalogApi?: CatalogApi, - events?: EventsService, - tokenManager?: TokenManager, ) { + this.auth = auth; + this.catalogApi = catalogApi; this.client = BitbucketCloudClient.fromConfig(integration.config); this.config = config; + this.events = events; this.logger = logger.child({ target: this.getProviderName(), }); this.scheduleFn = this.createScheduleFn(taskRunner); - this.catalogApi = catalogApi; - this.events = events; - this.tokenManager = tokenManager; } private createScheduleFn( @@ -185,19 +184,17 @@ export class BitbucketCloudEntityProvider implements EntityProvider { this.connection = connection; await this.scheduleFn(); - if (this.events) { - await this.events.subscribe({ - id: this.getProviderName(), - topics: [TOPIC_REPO_PUSH], - onEvent: async params => { - if (params.topic !== TOPIC_REPO_PUSH) { - return; - } + await this.events.subscribe({ + id: this.getProviderName(), + topics: [TOPIC_REPO_PUSH], + onEvent: async params => { + if (params.topic !== TOPIC_REPO_PUSH) { + return; + } - await this.onRepoPush(params.eventPayload as Events.RepoPushEvent); - }, - }); - } + await this.onRepoPush(params.eventPayload as Events.RepoPushEvent); + }, + }); } async refresh(logger: LoggerService) { @@ -220,32 +217,12 @@ export class BitbucketCloudEntityProvider implements EntityProvider { ); } - private canHandleEvents(): boolean { - if (this.catalogApi && this.tokenManager) { - return true; - } - - // throw only once - if (!this.eventConfigErrorThrown) { - this.eventConfigErrorThrown = true; - throw new Error( - `${this.getProviderName()} not well configured to handle repo:push. Missing CatalogApi and/or TokenManager.`, - ); - } - - return false; - } - private enhanceEvent(event: Events.RepoPushEvent): void { // add missing slug event.repository.slug = event.repository.full_name!.split('/', 2)[1]; } async onRepoPush(event: Events.RepoPushEvent): Promise { - if (!this.canHandleEvents()) { - return; - } - if (!this.connection) { throw new Error('Not initialized'); } @@ -273,8 +250,7 @@ export class BitbucketCloudEntityProvider implements EntityProvider { const targets = await this.findCatalogFiles(repoSlug); - const { token } = await this.tokenManager!.getToken(); - const existing = await this.findExistingLocations(repoUrl, token); + const existing = await this.findExistingLocations(repoUrl); const added: DeferredEntity[] = this.toDeferredEntities( targets.filter( @@ -321,16 +297,20 @@ export class BitbucketCloudEntityProvider implements EntityProvider { private async findExistingLocations( repoUrl: string, - token: string, ): Promise { const filter: Record = {}; filter.kind = 'Location'; filter[`metadata.annotations.${ANNOTATION_BITBUCKET_CLOUD_REPO_URL}`] = repoUrl; - return this.catalogApi!.getEntities({ filter }, { token }).then( - result => result.items, - ) as Promise; + const { token } = await this.auth.getPluginRequestToken({ + onBehalfOf: await this.auth.getOwnServiceCredentials(), + targetPluginId: 'catalog', + }); + + return this.catalogApi + .getEntities({ filter }, { token }) + .then(result => result.items) as Promise; } private async findCatalogFiles( diff --git a/yarn.lock b/yarn.lock index 93d7efa51d..6189cb8e21 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5581,7 +5581,6 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-backend-module-bitbucket-cloud@workspace:plugins/catalog-backend-module-bitbucket-cloud" dependencies: - "@backstage/backend-common": ^0.25.0 "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" "@backstage/catalog-client": "workspace:^" From e918061043de19b40162ea099b2c63dc1514bce8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Kosi=C5=84ski?= Date: Tue, 1 Oct 2024 21:53:24 +0200 Subject: [PATCH 098/217] feat(techdocs): Add support for mkdocs material palette conditional hashes (#26821) Signed-off-by: Adrian Kosinski --- .changeset/rare-crabs-cheat.md | 5 +++ .../transformers/styles/rules/palette.ts | 38 +++++++++++++++++++ .../reader/transformers/styles/rules/rules.ts | 2 + .../transformers/styles/transformer.test.tsx | 3 ++ 4 files changed, 48 insertions(+) create mode 100644 .changeset/rare-crabs-cheat.md create mode 100644 plugins/techdocs/src/reader/transformers/styles/rules/palette.ts diff --git a/.changeset/rare-crabs-cheat.md b/.changeset/rare-crabs-cheat.md new file mode 100644 index 0000000000..6b4fd37ed7 --- /dev/null +++ b/.changeset/rare-crabs-cheat.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs': patch +--- + +Add support for mkdocs material palette conditional hashes. diff --git a/plugins/techdocs/src/reader/transformers/styles/rules/palette.ts b/plugins/techdocs/src/reader/transformers/styles/rules/palette.ts new file mode 100644 index 0000000000..fa1f69ac88 --- /dev/null +++ b/plugins/techdocs/src/reader/transformers/styles/rules/palette.ts @@ -0,0 +1,38 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { RuleOptions } from './types'; +import { Theme } from '@material-ui/core/styles'; + +const themeHashes: Record> = { + dark: ['#only-light', '#gh-light-mode-only'], + light: ['#only-dark', '#gh-dark-mode-only'], +}; + +export default ({ theme }: RuleOptions) => ` +/*================== Palette ==================*/ +/* + When color palette toggle is enabled in material theme for Mkdocs, there is a possibility to show conditionally + images by adding #only-dark or #only-light to resource hash. Backstage doesn't use mkdocs color palette mechanism, + so there is a need to add css rules from palette*.css manually. +*/ + +${themeHashes[theme.palette.type] + .map(hash => `img[src$="${hash}"]`) + .join(', ')} { + display: none; +} +`; diff --git a/plugins/techdocs/src/reader/transformers/styles/rules/rules.ts b/plugins/techdocs/src/reader/transformers/styles/rules/rules.ts index 917793733e..9341fd6e3e 100644 --- a/plugins/techdocs/src/reader/transformers/styles/rules/rules.ts +++ b/plugins/techdocs/src/reader/transformers/styles/rules/rules.ts @@ -20,6 +20,7 @@ import { default as layout } from './layout'; import { default as typeset } from './typeset'; import { default as animations } from './animations'; import { default as extensions } from './extensions'; +import palette from './palette'; /** * A list of style rules that will be applied to an element in the order they were added. @@ -35,4 +36,5 @@ export const rules = [ typeset, animations, extensions, + palette, ]; diff --git a/plugins/techdocs/src/reader/transformers/styles/transformer.test.tsx b/plugins/techdocs/src/reader/transformers/styles/transformer.test.tsx index b55e372212..6cfde4f09d 100644 --- a/plugins/techdocs/src/reader/transformers/styles/transformer.test.tsx +++ b/plugins/techdocs/src/reader/transformers/styles/transformer.test.tsx @@ -47,6 +47,9 @@ describe('Transformers > Styles', () => { expect(style).toHaveTextContent( '/*================== Extensions ==================*/', ); + expect(style).toHaveTextContent( + '/*================== Palette ==================*/', + ); }); it('should use headers relative font-size value as the factor for the md-typeset variable', () => { From 12250a63a4b9c6b7fc801e80354eb2eac87639a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20Br=C3=A4uer?= Date: Wed, 2 Oct 2024 07:45:09 +0200 Subject: [PATCH 099/217] Added hero image and fixed reference to external sources MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Johannes Bräuer --- .../2024-09-24-dynatrace-adopter-spotlight.mdx | 6 +++++- .../2024-09-24/com0027.Dynatrace.Adopter.png | Bin 0 -> 52134 bytes 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 microsite/blog/assets/2024-09-24/com0027.Dynatrace.Adopter.png diff --git a/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx b/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx index 24f751f07c..cd4458ed9e 100644 --- a/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx +++ b/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx @@ -11,16 +11,20 @@ To enhance the developer experience, Dynatrace adopted Backstage as its central - First, centralizing all development-related artifacts and democratizing ownership have reduced onboarding time for our teams. - Second, we enhanced the developer experience by integrating observability and security data into Backstage, offering seamless entry points to Dynatrace for in-depth analysis. +![Dynatrace adopting Backstage](assets/2024-09-24/com0027.Dynatrace.Adopter.png) + {/* truncate */} ## Why and how Dynatrace rolled out Backstage A few years ago, Dynatrace developers worked with large monolithic repositories to develop functionality for our platform’s agent and server sides. The server component was particularly large, consisting of 260 Gradle projects in a single repository. This setup centralized development processes for the developers, making it easier for them to push the code while versioning, delivery, and hotfixes were handled automatically. However, maintaining the speed and manageability of these processes required a lot of effort. -Dynatrace decided to move towards the current Dynatrace platform model as the next evolutionary step of our product. This decision led to an architectural change of splitting the monolithic repository into multiple projects. The platform is designed to enable the development of apps on top of platform capabilities to unlock faster innovations and decouple them from the release cycles of other components. Based on this decision, it became apparent that the number of platform components and individual apps would increase significantly, eliminating the option of a single repository to unify all processes. Besides, the risk of increasing cognitive load in software development was high due to development being spread across multiple touchpoints, a challenge discussed in research for years. Consequently, the need to standardize project creation became crucial to ensure corporate governance and compliance even before the first commit was pushed. [^1, ^2] +Dynatrace decided to move towards the current Dynatrace platform model as the next evolutionary step of our product. This decision led to an architectural change of splitting the monolithic repository into multiple projects. The platform is designed to enable the development of apps on top of platform capabilities to unlock faster innovations and decouple them from the release cycles of other components. Based on this decision, it became apparent that the number of platform components and individual apps would increase significantly, eliminating the option of a single repository to unify all processes. Besides, the risk of increasing cognitive load in software development was high due to development being spread across multiple touchpoints, a challenge discussed in research for years ([Sweller, 1988](https://doi.org/10.1016/0364-0213(88)90023-7), [Robert, 2008](https://dl.acm.org/doi/10.5555/1388398)). Consequently, the need to standardize project creation became crucial to ensure corporate governance and compliance even before the first commit was pushed. + Therefore, the Dynatrace Platform Engineering team initiated a project to standardize and simplify the process for starting service or application development. This effort was initially named “project initializer” and launched around the same time Backstage joined the CNCF. Although the platform engineering team saw initial success with the project initializer, we quickly realized that there was a greater demand for centralizing development activities and providing appropriate guidelines. For example, we noted that the complexity of integrating new code had shifted from the build phase to the deployment phase, transferring relatively complex integration tasks from continuous integration to continuous deployment. Overall, the main requirements and focal points were: diff --git a/microsite/blog/assets/2024-09-24/com0027.Dynatrace.Adopter.png b/microsite/blog/assets/2024-09-24/com0027.Dynatrace.Adopter.png new file mode 100644 index 0000000000000000000000000000000000000000..b5a3c4c72058c95cca6179ec45e5533830a01343 GIT binary patch literal 52134 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 Date: Wed, 2 Oct 2024 07:58:03 +0200 Subject: [PATCH 100/217] Fixed issue with yarn prettier MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Johannes Bräuer --- microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx b/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx index cd4458ed9e..7e029e0aab 100644 --- a/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx +++ b/microsite/blog/2024-09-24-dynatrace-adopter-spotlight.mdx @@ -19,7 +19,7 @@ To enhance the developer experience, Dynatrace adopted Backstage as its central A few years ago, Dynatrace developers worked with large monolithic repositories to develop functionality for our platform’s agent and server sides. The server component was particularly large, consisting of 260 Gradle projects in a single repository. This setup centralized development processes for the developers, making it easier for them to push the code while versioning, delivery, and hotfixes were handled automatically. However, maintaining the speed and manageability of these processes required a lot of effort. -Dynatrace decided to move towards the current Dynatrace platform model as the next evolutionary step of our product. This decision led to an architectural change of splitting the monolithic repository into multiple projects. The platform is designed to enable the development of apps on top of platform capabilities to unlock faster innovations and decouple them from the release cycles of other components. Based on this decision, it became apparent that the number of platform components and individual apps would increase significantly, eliminating the option of a single repository to unify all processes. Besides, the risk of increasing cognitive load in software development was high due to development being spread across multiple touchpoints, a challenge discussed in research for years ([Sweller, 1988](https://doi.org/10.1016/0364-0213(88)90023-7), [Robert, 2008](https://dl.acm.org/doi/10.5555/1388398)). Consequently, the need to standardize project creation became crucial to ensure corporate governance and compliance even before the first commit was pushed. +Dynatrace decided to move towards the current Dynatrace platform model as the next evolutionary step of our product. This decision led to an architectural change of splitting the monolithic repository into multiple projects. The platform is designed to enable the development of apps on top of platform capabilities to unlock faster innovations and decouple them from the release cycles of other components. Based on this decision, it became apparent that the number of platform components and individual apps would increase significantly, eliminating the option of a single repository to unify all processes. Besides, the risk of increasing cognitive load in software development was high due to development being spread across multiple touchpoints, a challenge discussed in research for years ([Sweller, 1988](), [Robert, 2008](https://dl.acm.org/doi/10.5555/1388398)). Consequently, the need to standardize project creation became crucial to ensure corporate governance and compliance even before the first commit was pushed.